diff --git a/Content.Client/Atmos/Overlays/AtmosDebugOverlay.cs b/Content.Client/Atmos/Overlays/AtmosDebugOverlay.cs
index fcf3b04e530..6dfbc326ecb 100644
--- a/Content.Client/Atmos/Overlays/AtmosDebugOverlay.cs
+++ b/Content.Client/Atmos/Overlays/AtmosDebugOverlay.cs
@@ -256,6 +256,8 @@ private void DrawTooltip(DrawingHandleScreen handle, Vector2 pos, AtmosDebugOver
handle.DrawString(_font, pos, $"Map: {data.MapAtmosphere}");
pos += offset;
handle.DrawString(_font, pos, $"NoGrid: {data.NoGrid}");
+ pos += offset;
+ handle.DrawString(_font, pos, $"Immutable: {data.Immutable}");
}
private void GetGrids(MapId mapId, Box2Rotated box)
diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs
index 03f4f3f38b7..fa631938100 100644
--- a/Content.Client/Input/ContentContexts.cs
+++ b/Content.Client/Input/ContentContexts.cs
@@ -55,6 +55,7 @@ public static void SetupContexts(IInputContextContainer contexts)
human.AddFunction(ContentKeyFunctions.UseItemInHand);
human.AddFunction(ContentKeyFunctions.AltUseItemInHand);
human.AddFunction(ContentKeyFunctions.OpenCharacterMenu);
+ human.AddFunction(ContentKeyFunctions.OpenLanguageMenu);
human.AddFunction(ContentKeyFunctions.ActivateItemInWorld);
human.AddFunction(ContentKeyFunctions.ThrowItemInHand);
human.AddFunction(ContentKeyFunctions.AltActivateItemInWorld);
diff --git a/Content.Client/Language/LanguageMenuWindow.xaml b/Content.Client/Language/LanguageMenuWindow.xaml
new file mode 100644
index 00000000000..ff33a6ddf56
--- /dev/null
+++ b/Content.Client/Language/LanguageMenuWindow.xaml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Content.Client/Language/LanguageMenuWindow.xaml.cs b/Content.Client/Language/LanguageMenuWindow.xaml.cs
new file mode 100644
index 00000000000..312814aca35
--- /dev/null
+++ b/Content.Client/Language/LanguageMenuWindow.xaml.cs
@@ -0,0 +1,134 @@
+using Content.Client.Language.Systems;
+using Content.Shared.Language;
+using Content.Shared.Language.Systems;
+using Robust.Client.AutoGenerated;
+using Robust.Client.UserInterface.Controls;
+using Robust.Client.UserInterface.CustomControls;
+using Robust.Client.UserInterface.XAML;
+using Robust.Shared.Console;
+using Robust.Shared.Utility;
+using Serilog;
+using static Content.Shared.Language.Systems.SharedLanguageSystem;
+
+namespace Content.Client.Language;
+
+[GenerateTypedNameReferences]
+public sealed partial class LanguageMenuWindow : DefaultWindow
+{
+ private readonly LanguageSystem _clientLanguageSystem;
+ private readonly List _entries = new();
+
+
+ public LanguageMenuWindow()
+ {
+ RobustXamlLoader.Load(this);
+ _clientLanguageSystem = IoCManager.Resolve().GetEntitySystem();
+ }
+
+ protected override void Opened()
+ {
+ // Refresh the window when it gets opened.
+ // This actually causes two refreshes: one immediately, and one after the server sends a state message.
+ UpdateState(_clientLanguageSystem.CurrentLanguage, _clientLanguageSystem.SpokenLanguages);
+ _clientLanguageSystem.RequestStateUpdate();
+ }
+
+
+ public void UpdateState(string currentLanguage, List spokenLanguages)
+ {
+ var langName = Loc.GetString($"language-{currentLanguage}-name");
+ CurrentLanguageLabel.Text = Loc.GetString("language-menu-current-language", ("language", langName));
+
+ OptionsList.RemoveAllChildren();
+ _entries.Clear();
+
+ foreach (var language in spokenLanguages)
+ {
+ AddLanguageEntry(language);
+ }
+
+ // Disable the button for the currently chosen language
+ foreach (var entry in _entries)
+ {
+ if (entry.button != null)
+ entry.button.Disabled = entry.language == currentLanguage;
+ }
+ }
+
+ private void AddLanguageEntry(string language)
+ {
+ var proto = _clientLanguageSystem.GetLanguagePrototype(language);
+ var state = new EntryState { language = language };
+
+ var container = new BoxContainer { Orientation = BoxContainer.LayoutOrientation.Vertical };
+
+ #region Header
+ var header = new BoxContainer
+ {
+ Orientation = BoxContainer.LayoutOrientation.Horizontal,
+ HorizontalExpand = true,
+ SeparationOverride = 2
+ };
+
+ var name = new Label
+ {
+ Text = proto?.Name ?? Loc.GetString("generic-error"),
+ MinWidth = 50,
+ HorizontalExpand = true
+ };
+
+ var button = new Button { Text = "Choose" };
+ button.OnPressed += _ => OnLanguageChosen(language);
+ state.button = button;
+
+ header.AddChild(name);
+ header.AddChild(button);
+
+ container.AddChild(header);
+ #endregion
+
+ #region Collapsible description
+ var body = new CollapsibleBody
+ {
+ HorizontalExpand = true,
+ Margin = new Thickness(4f, 4f)
+ };
+
+ var description = new RichTextLabel { HorizontalExpand = true };
+ description.SetMessage(proto?.Description ?? Loc.GetString("generic-error"));
+ body.AddChild(description);
+
+ var collapser = new Collapsible(Loc.GetString("language-menu-description-header"), body)
+ {
+ Orientation = BoxContainer.LayoutOrientation.Vertical,
+ HorizontalExpand = true
+ };
+
+ container.AddChild(collapser);
+ #endregion
+
+ // Before adding, wrap the new container in a PanelContainer to give it a distinct look
+ var wrapper = new PanelContainer();
+ wrapper.StyleClasses.Add("PdaBorderRect");
+
+ wrapper.AddChild(container);
+ OptionsList.AddChild(wrapper);
+
+ _entries.Add(state);
+ }
+
+
+ private void OnLanguageChosen(string id)
+ {
+ var proto = _clientLanguageSystem.GetLanguagePrototype(id);
+ if (proto != null)
+ _clientLanguageSystem.RequestSetLanguage(proto);
+ }
+
+
+ private struct EntryState
+ {
+ public string language;
+ public Button? button;
+ }
+}
diff --git a/Content.Client/Language/Systems/LanguageSystem.cs b/Content.Client/Language/Systems/LanguageSystem.cs
new file mode 100644
index 00000000000..9714078b2c5
--- /dev/null
+++ b/Content.Client/Language/Systems/LanguageSystem.cs
@@ -0,0 +1,76 @@
+using Content.Shared.Language;
+using Content.Shared.Language.Events;
+using Content.Shared.Language.Systems;
+using Robust.Client;
+using Robust.Shared.Console;
+
+namespace Content.Client.Language.Systems;
+
+///
+/// Client-side language system.
+///
+///
+/// Unlike the server, the client is not aware of other entities' languages; it's only notified about the entity that it posesses.
+/// Due to that, this system stores such information in a static manner.
+///
+public sealed class LanguageSystem : SharedLanguageSystem
+{
+ [Dependency] private readonly IBaseClient _client = default!;
+
+ ///
+ /// The current language of the entity currently possessed by the player.
+ ///
+ public string CurrentLanguage { get; private set; } = default!;
+ ///
+ /// The list of languages the currently possessed entity can speak.
+ ///
+ public List SpokenLanguages { get; private set; } = new();
+ ///
+ /// The list of languages the currently possessed entity can understand.
+ ///
+ public List UnderstoodLanguages { get; private set; } = new();
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeNetworkEvent(OnLanguagesUpdated);
+ _client.RunLevelChanged += OnRunLevelChanged;
+ }
+
+ private void OnLanguagesUpdated(LanguagesUpdatedMessage message)
+ {
+ CurrentLanguage = message.CurrentLanguage;
+ SpokenLanguages = message.Spoken;
+ UnderstoodLanguages = message.Understood;
+ }
+
+ private void OnRunLevelChanged(object? sender, RunLevelChangedEventArgs args)
+ {
+ // Request an update when entering a game
+ if (args.NewLevel == ClientRunLevel.InGame)
+ RequestStateUpdate();
+ }
+
+ ///
+ /// Sends a network request to the server to update this system's state.
+ /// The server may ignore the said request if the player is not possessing an entity.
+ ///
+ public void RequestStateUpdate()
+ {
+ RaiseNetworkEvent(new RequestLanguagesMessage());
+ }
+
+ public void RequestSetLanguage(LanguagePrototype language)
+ {
+ if (language.ID == CurrentLanguage)
+ return;
+
+ RaiseNetworkEvent(new LanguagesSetMessage(language.ID));
+
+ // May cause some minor desync...
+ // So to reduce the probability of desync, we replicate the change locally too
+ if (SpokenLanguages.Contains(language.ID))
+ CurrentLanguage = language.ID;
+ }
+}
diff --git a/Content.Client/Language/Systems/TranslatorImplanterSystem.cs b/Content.Client/Language/Systems/TranslatorImplanterSystem.cs
new file mode 100644
index 00000000000..da19b3decf9
--- /dev/null
+++ b/Content.Client/Language/Systems/TranslatorImplanterSystem.cs
@@ -0,0 +1,8 @@
+using Content.Shared.Language.Systems;
+
+namespace Content.Client.Language.Systems;
+
+public sealed class TranslatorImplanterSystem : SharedTranslatorImplanterSystem
+{
+
+}
diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs
index f0537079b97..49e8099e0fb 100644
--- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs
+++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs
@@ -212,6 +212,7 @@ void AddCheckBox(string checkBoxName, bool currentState, Action, IOnStateExited
+{
+ public LanguageMenuWindow? LanguageWindow;
+ private MenuButton? LanguageButton => UIManager.GetActiveUIWidgetOrNull()?.LanguageButton;
+
+ public override void Initialize()
+ {
+ SubscribeNetworkEvent((LanguagesUpdatedMessage message, EntitySessionEventArgs _) =>
+ LanguageWindow?.UpdateState(message.CurrentLanguage, message.Spoken));
+ }
+
+ public void OnStateEntered(GameplayState state)
+ {
+ DebugTools.Assert(LanguageWindow == null);
+
+ LanguageWindow = UIManager.CreateWindow();
+ LayoutContainer.SetAnchorPreset(LanguageWindow, LayoutContainer.LayoutPreset.CenterTop);
+
+ CommandBinds.Builder.Bind(ContentKeyFunctions.OpenLanguageMenu,
+ InputCmdHandler.FromDelegate(_ => ToggleWindow())).Register();
+ }
+
+ public void OnStateExited(GameplayState state)
+ {
+ if (LanguageWindow != null)
+ {
+ LanguageWindow.Dispose();
+ LanguageWindow = null;
+ }
+
+ CommandBinds.Unregister();
+ }
+
+ public void UnloadButton()
+ {
+ if (LanguageButton == null)
+ return;
+
+ LanguageButton.OnPressed -= LanguageButtonPressed;
+ }
+
+ public void LoadButton()
+ {
+ if (LanguageButton == null)
+ return;
+
+ LanguageButton.OnPressed += LanguageButtonPressed;
+
+ if (LanguageWindow == null)
+ return;
+
+ LanguageWindow.OnClose += () => LanguageButton.Pressed = false;
+ LanguageWindow.OnOpen += () => LanguageButton.Pressed = true;
+ }
+
+ private void LanguageButtonPressed(ButtonEventArgs args)
+ {
+ ToggleWindow();
+ }
+
+ private void ToggleWindow()
+ {
+ if (LanguageWindow == null)
+ return;
+
+ if (LanguageButton != null)
+ LanguageButton.SetClickPressed(!LanguageWindow.IsOpen);
+
+ if (LanguageWindow.IsOpen)
+ LanguageWindow.Close();
+ else
+ LanguageWindow.Open();
+ }
+}
diff --git a/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs b/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs
index 1505db48a79..156fa63884e 100644
--- a/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs
+++ b/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs
@@ -9,6 +9,7 @@
using Content.Client.UserInterface.Systems.MenuBar.Widgets;
using Content.Client.UserInterface.Systems.Sandbox;
using Robust.Client.UserInterface.Controllers;
+using Content.Client.UserInterface.Systems.Language;
namespace Content.Client.UserInterface.Systems.MenuBar;
@@ -22,6 +23,7 @@ public sealed class GameTopMenuBarUIController : UIController
[Dependency] private readonly ActionUIController _action = default!;
[Dependency] private readonly SandboxUIController _sandbox = default!;
[Dependency] private readonly GuidebookUIController _guidebook = default!;
+ [Dependency] private readonly LanguageMenuUIController _language = default!;
private GameTopMenuBar? GameTopMenuBar => UIManager.GetActiveUIWidgetOrNull();
@@ -44,6 +46,7 @@ public void UnloadButtons()
_ahelp.UnloadButton();
_action.UnloadButton();
_sandbox.UnloadButton();
+ _language.UnloadButton();
}
public void LoadButtons()
@@ -56,5 +59,6 @@ public void LoadButtons()
_ahelp.LoadButton();
_action.LoadButton();
_sandbox.LoadButton();
+ _language.LoadButton();
}
}
diff --git a/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml b/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml
index 3c8cd1d164f..a76943ace85 100644
--- a/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml
+++ b/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml
@@ -63,6 +63,16 @@
HorizontalExpand="True"
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
/>
+
+ {
+ var wires = IoCManager.Resolve().GetEntitySystem();
+
+ // Need to spawn these entities to make sure the wire layouts are initialized.
+ var ent1 = SpawnWithComp(server.EntMan, "WireLayoutTest", testMap.MapCoords);
+ var ent2 = SpawnWithComp(server.EntMan, "WireLayoutTest2", testMap.MapCoords);
+ var ent3 = SpawnWithComp(server.EntMan, "WireLayoutTest3", testMap.MapCoords);
+
+ // Assert.That(wires.TryGetLayout("WireLayoutTest", out var layout1));
+ // Assert.That(wires.TryGetLayout("WireLayoutTest2", out var layout2));
+ // Assert.That(wires.TryGetLayout("WireLayoutTest3", out var layout3));
+
+ Assert.Multiple(() =>
+ {
+ // Entity 1.
+ Assert.That(ent1.Comp.WiresList, Has.Count.EqualTo(4));
+ Assert.That(ent1.Comp.WiresList, Has.Exactly(2).With.Property("Action").Null, "2 dummy wires");
+ Assert.That(ent1.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 power wire");
+ Assert.That(ent1.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 door bolt wire");
+
+ Assert.That(ent2.Comp.WiresList, Has.Count.EqualTo(5));
+ Assert.That(ent2.Comp.WiresList, Has.Exactly(2).With.Property("Action").Null, "2 dummy wires");
+ Assert.That(ent2.Comp.WiresList, Has.Exactly(2).With.Property("Action").InstanceOf(), "2 power wire");
+ Assert.That(ent2.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 door bolt wire");
+
+ Assert.That(ent3.Comp.WiresList, Has.Count.EqualTo(4));
+ Assert.That(ent3.Comp.WiresList, Has.Exactly(2).With.Property("Action").Null, "2 dummy wires");
+ Assert.That(ent3.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 power wire");
+ Assert.That(ent3.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 door bolt wire");
+ });
+ });
+
+ await pair.CleanReturnAsync();
+ }
+
+ private static Entity SpawnWithComp(IEntityManager entityManager, string prototype, MapCoordinates coords)
+ where T : IComponent, new()
+ {
+ var ent = entityManager.Spawn(prototype, coords);
+ var comp = entityManager.EnsureComponent(ent);
+ return new Entity(ent, comp);
+ }
+}
diff --git a/Content.Server/Administration/Managers/AdminManager.cs b/Content.Server/Administration/Managers/AdminManager.cs
index b1cca46e63f..57d6e089bd4 100644
--- a/Content.Server/Administration/Managers/AdminManager.cs
+++ b/Content.Server/Administration/Managers/AdminManager.cs
@@ -315,7 +315,7 @@ private async void LoginAdminMaybe(ICommonSession session)
_admins.Add(session, reg);
- if (!session.ContentData()!.ExplicitlyDeadminned)
+ if (!session.ContentData()?.ExplicitlyDeadminned ?? false)
{
reg.Data.Active = true;
diff --git a/Content.Server/Atmos/EntitySystems/AtmosDebugOverlaySystem.cs b/Content.Server/Atmos/EntitySystems/AtmosDebugOverlaySystem.cs
index c0284f26c90..505c4a3b385 100644
--- a/Content.Server/Atmos/EntitySystems/AtmosDebugOverlaySystem.cs
+++ b/Content.Server/Atmos/EntitySystems/AtmosDebugOverlaySystem.cs
@@ -109,7 +109,8 @@ private void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e)
tile.ExcitedGroup?.GetHashCode(),
tile.Space,
tile.MapAtmosphere,
- tile.NoGridTile);
+ tile.NoGridTile,
+ tile.Air?.Immutable ?? false);
}
public override void Update(float frameTime)
diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs
index 6fbd638844b..1c18b8fe29c 100644
--- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs
+++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs
@@ -92,6 +92,12 @@ private void FixGridAtmosCommand(IConsoleShell shell, string argstr, string[] ar
if (tile == null)
continue;
+ if (!_mapSystem.TryGetTile(gridComp, indices, out var gTile) || gTile.IsEmpty)
+ {
+ gridAtmosphere.Tiles.Remove(indices);
+ continue;
+ }
+
if (tile.Immutable && !IsTileSpace(euid, transform.MapUid, indices, gridComp))
{
tile = new GasMixture(tile.Volume) { Temperature = tile.Temperature };
diff --git a/Content.Server/Bed/Components/SnoringComponent.cs b/Content.Server/Bed/Components/SnoringComponent.cs
new file mode 100644
index 00000000000..09f80327ba7
--- /dev/null
+++ b/Content.Server/Bed/Components/SnoringComponent.cs
@@ -0,0 +1,10 @@
+namespace Content.Server.Bed.Sleep;
+
+///
+/// This is used for the snoring trait.
+///
+[RegisterComponent]
+public sealed partial class SnoringComponent : Component
+{
+
+}
diff --git a/Content.Server/Bed/Sleep/SleepingSystem.cs b/Content.Server/Bed/Sleep/SleepingSystem.cs
index 685b1087d70..b4972544338 100644
--- a/Content.Server/Bed/Sleep/SleepingSystem.cs
+++ b/Content.Server/Bed/Sleep/SleepingSystem.cs
@@ -67,7 +67,10 @@ private void OnSleepStateChanged(EntityUid uid, MobStateComponent component, Sle
if (TryComp(uid, out var sleepSound))
{
var emitSound = EnsureComp(uid);
- emitSound.Sound = sleepSound.Snore;
+ if (HasComp(uid))
+ {
+ emitSound.Sound = sleepSound.Snore;
+ }
emitSound.PlayChance = sleepSound.Chance;
emitSound.RollInterval = sleepSound.Interval;
emitSound.PopUp = sleepSound.PopUp;
diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs
index be6e8b78fef..7eecaa32b43 100644
--- a/Content.Server/Chat/Systems/ChatSystem.cs
+++ b/Content.Server/Chat/Systems/ChatSystem.cs
@@ -5,6 +5,8 @@
using Content.Server.Administration.Managers;
using Content.Server.Chat.Managers;
using Content.Server.GameTicking;
+using Content.Server.Language;
+using Content.Server.Speech;
using Content.Server.Speech.Components;
using Content.Server.Speech.EntitySystems;
using Content.Server.Nyanotrasen.Chat;
@@ -17,6 +19,7 @@
using Content.Shared.Chat;
using Content.Shared.Database;
using Content.Shared.Ghost;
+using Content.Shared.Language;
using Content.Shared.Humanoid;
using Content.Shared.IdentityManagement;
using Content.Shared.Interaction;
@@ -60,6 +63,7 @@ public sealed partial class ChatSystem : SharedChatSystem
[Dependency] private readonly SharedAudioSystem _audio = default!;
[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!;
@@ -68,6 +72,7 @@ public sealed partial class ChatSystem : SharedChatSystem
public const int WhisperClearRange = 2; // how far whisper goes while still being understandable, in world units
public const int WhisperMuffledRange = 5; // how far whisper goes at all, in world units
public const string DefaultAnnouncementSound = "/Audio/Announcements/announce.ogg";
+ public const float DefaultObfuscationFactor = 0.2f; // Percentage of symbols in a whispered message that can be seen even by "far" listeners
private bool _loocEnabled = true;
private bool _deadLoocEnabled;
@@ -173,7 +178,8 @@ public void TrySendInGameICMessage(
ICommonSession? player = null,
string? nameOverride = null,
bool checkRadioPrefix = true,
- bool ignoreActionBlocker = false
+ bool ignoreActionBlocker = false,
+ LanguagePrototype? languageOverride = null
)
{
if (HasComp(source))
@@ -249,10 +255,10 @@ public void TrySendInGameICMessage(
switch (desiredType)
{
case InGameICChatType.Speak:
- SendEntitySpeak(source, message, range, nameOverride, hideLog, ignoreActionBlocker);
+ SendEntitySpeak(source, message, range, nameOverride, hideLog, ignoreActionBlocker, languageOverride: languageOverride);
break;
case InGameICChatType.Whisper:
- SendEntityWhisper(source, message, range, null, nameOverride, hideLog, ignoreActionBlocker);
+ SendEntityWhisper(source, message, range, null, nameOverride, hideLog, ignoreActionBlocker, languageOverride: languageOverride);
break;
case InGameICChatType.Emote:
SendEntityEmote(source, message, range, nameOverride, hideLog: hideLog, ignoreActionBlocker: ignoreActionBlocker);
@@ -382,12 +388,14 @@ private void SendEntitySpeak(
ChatTransmitRange range,
string? nameOverride,
bool hideLog = false,
- bool ignoreActionBlocker = false
+ bool ignoreActionBlocker = false,
+ LanguagePrototype? languageOverride = null
)
{
if (!_actionBlocker.CanSpeak(source) && !ignoreActionBlocker)
return;
+ // The original message
var message = TransformSpeech(source, FormattedMessage.RemoveMarkup(originalMessage));
if (message.Length == 0)
@@ -411,18 +419,19 @@ private void SendEntitySpeak(
speech = proto;
}
- name = FormattedMessage.EscapeText(name);
+ var language = languageOverride ?? _language.GetLanguage(source);
- var wrappedMessage = Loc.GetString(speech.Bold ? "chat-manager-entity-say-bold-wrap-message" : "chat-manager-entity-say-wrap-message",
- ("entityName", name),
- ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))),
- ("fontType", speech.FontId),
- ("fontSize", speech.FontSize),
- ("message", FormattedMessage.EscapeText(message)));
+ name = FormattedMessage.EscapeText(name);
+ // The chat message wrapped in a "x says y" string
+ var wrappedMessage = WrapPublicMessage(source, name, message);
+ // The chat message obfuscated via language obfuscation
+ var obfuscated = SanitizeInGameICMessage(source, _language.ObfuscateSpeech(message, language), out var emoteStr, true, _configurationManager.GetCVar(CCVars.ChatPunctuation), (!CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Parent.Name == "en") || (CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Name == "en"));
+ // The language-obfuscated message wrapped in a "x says y" string
+ var wrappedObfuscated = WrapPublicMessage(source, name, obfuscated);
- SendInVoiceRange(ChatChannel.Local, message, wrappedMessage, source, range);
+ SendInVoiceRange(ChatChannel.Local, name, message, wrappedMessage, obfuscated, wrappedObfuscated, source, range, languageOverride: language);
- var ev = new EntitySpokeEvent(source, message, null, null);
+ var ev = new EntitySpokeEvent(source, message, null, false, language);
RaiseLocalEvent(source, ev, true);
// To avoid logging any messages sent by entities that are not players, like vendors, cloning, etc.
@@ -455,7 +464,8 @@ private void SendEntityWhisper(
RadioChannelPrototype? channel,
string? nameOverride,
bool hideLog = false,
- bool ignoreActionBlocker = false
+ bool ignoreActionBlocker = false,
+ LanguagePrototype? languageOverride = null
)
{
if (!_actionBlocker.CanSpeak(source) && !ignoreActionBlocker)
@@ -465,8 +475,6 @@ private void SendEntityWhisper(
if (message.Length == 0)
return;
- var obfuscatedMessage = ObfuscateMessageReadability(message, 0.2f);
-
// get the entity's name by visual identity (if no override provided).
string nameIdentity = FormattedMessage.EscapeText(nameOverride ?? Identity.Name(source, EntityManager));
// get the entity's name by voice (if no override provided).
@@ -483,41 +491,57 @@ private void SendEntityWhisper(
}
name = FormattedMessage.EscapeText(name);
- var wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message",
- ("entityName", name), ("message", FormattedMessage.EscapeText(message)));
-
- var wrappedobfuscatedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message",
- ("entityName", nameIdentity), ("message", FormattedMessage.EscapeText(obfuscatedMessage)));
-
- var wrappedUnknownMessage = Loc.GetString("chat-manager-entity-whisper-unknown-wrap-message",
- ("message", FormattedMessage.EscapeText(obfuscatedMessage)));
-
+ var language = languageOverride ?? _language.GetLanguage(source);
+ var languageObfuscatedMessage = SanitizeInGameICMessage(source, _language.ObfuscateSpeech(message, language), out var emoteStr, true, _configurationManager.GetCVar(CCVars.ChatPunctuation), (!CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Parent.Name == "en") || (CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Name == "en"));
foreach (var (session, data) in GetRecipients(source, WhisperMuffledRange))
{
- EntityUid listener;
-
- if (session.AttachedEntity is not { Valid: true } playerEntity)
+ if (session.AttachedEntity is not { Valid: true } listener)
continue;
- listener = session.AttachedEntity.Value;
if (MessageRangeCheck(session, data, range) != MessageRangeCheckResult.Full)
continue; // Won't get logged to chat, and ghosts are too far away to see the pop-up, so we just won't send it to them.
+ var canUnderstandLanguage = _language.CanUnderstand(listener, language);
+ // How the entity perceives the message depends on whether it can understand its language
+ var perceivedMessage = canUnderstandLanguage ? message : languageObfuscatedMessage;
+
+ // Result is the intermediate message derived from the perceived one via obfuscation
+ // Wrapped message is the result wrapped in an "x says y" string
+ string result, wrappedMessage;
if (data.Range <= WhisperClearRange)
- _chatManager.ChatMessageToOne(ChatChannel.Whisper, message, wrappedMessage, source, false, session.Channel);
- //If listener is too far, they only hear fragments of the message
- //Collisiongroup.Opaque is not ideal for this use. Preferably, there should be a check specifically with "Can Ent1 see Ent2" in mind
- else if (_interactionSystem.InRangeUnobstructed(source, listener, WhisperMuffledRange, Shared.Physics.CollisionGroup.Opaque)) //Shared.Physics.CollisionGroup.Opaque
- _chatManager.ChatMessageToOne(ChatChannel.Whisper, obfuscatedMessage, wrappedobfuscatedMessage, source, false, session.Channel);
- //If listener is too far and has no line of sight, they can't identify the whisperer's identity
+ {
+ // Scenario 1: the listener can clearly understand the message
+ result = perceivedMessage;
+ wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message",
+ ("entityName", name),
+ ("message", FormattedMessage.EscapeText(result)));
+ }
+ else if (_interactionSystem.InRangeUnobstructed(source, listener, WhisperMuffledRange, Shared.Physics.CollisionGroup.Opaque))
+ {
+ // Scenerio 2: if the listener is too far, they only hear fragments of the message
+ // Collisiongroup.Opaque is not ideal for this use. Preferably, there should be a check specifically with "Can Ent1 see Ent2" in mind
+ result = ObfuscateMessageReadability(perceivedMessage);
+ wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message",
+ ("entityName", nameIdentity), ("message", FormattedMessage.EscapeText(result)));
+ }
else
- _chatManager.ChatMessageToOne(ChatChannel.Whisper, obfuscatedMessage, wrappedUnknownMessage, source, false, session.Channel);
+ {
+ // Scenario 3: If listener is too far and has no line of sight, they can't identify the whisperer's identity
+ result = ObfuscateMessageReadability(perceivedMessage);
+ wrappedMessage = Loc.GetString("chat-manager-entity-whisper-unknown-wrap-message",
+ ("message", FormattedMessage.EscapeText(result)));
+ }
+
+ _chatManager.ChatMessageToOne(ChatChannel.Whisper, result, wrappedMessage, source, false, session.Channel);
}
- _replay.RecordServerMessage(new ChatMessage(ChatChannel.Whisper, message, wrappedMessage, GetNetEntity(source), null, MessageRangeHideChatForReplay(range)));
+ var replayWrap = Loc.GetString("chat-manager-entity-whisper-wrap-message",
+ ("entityName", name),
+ ("message", FormattedMessage.EscapeText(message)));
+ _replay.RecordServerMessage(new ChatMessage(ChatChannel.Whisper, message, replayWrap, GetNetEntity(source), null, MessageRangeHideChatForReplay(range)));
- var ev = new EntitySpokeEvent(source, message, channel, obfuscatedMessage);
+ var ev = new EntitySpokeEvent(source, message, channel, true, language);
RaiseLocalEvent(source, ev, true);
if (!hideLog)
if (originalMessage == message)
@@ -564,7 +588,7 @@ private void SendEntityEmote(
if (checkEmote)
TryEmoteChatInput(source, action);
- SendInVoiceRange(ChatChannel.Emotes, action, wrappedMessage, source, range, author);
+ SendInVoiceRange(ChatChannel.Emotes, name, action, wrappedMessage, obfuscated: "", obfuscatedWrappedMessage: "", source, range, author);
if (!hideLog)
if (name != Name(source))
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Emote from {ToPrettyString(source):user} as {name}: {action}");
@@ -591,7 +615,13 @@ private void SendLOOC(EntityUid source, ICommonSession player, string message, b
("entityName", name),
("message", FormattedMessage.EscapeText(message)));
- SendInVoiceRange(ChatChannel.LOOC, message, wrappedMessage, source, hideChat ? ChatTransmitRange.HideChat : ChatTransmitRange.Normal, player.UserId);
+ SendInVoiceRange(ChatChannel.LOOC, name, message, wrappedMessage,
+ obfuscated: string.Empty,
+ obfuscatedWrappedMessage: string.Empty, // will be skipped anyway
+ source,
+ hideChat ? ChatTransmitRange.HideChat : ChatTransmitRange.Normal,
+ player.UserId,
+ languageOverride: LanguageSystem.Universal);
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"LOOC from {player:Player}: {message}");
}
@@ -672,15 +702,29 @@ private MessageRangeCheckResult MessageRangeCheck(ICommonSession session, ICChat
///
/// Sends a chat message to the given players in range of the source entity.
///
- private void SendInVoiceRange(ChatChannel channel, string message, string wrappedMessage, EntityUid source, ChatTransmitRange range, NetUserId? author = null)
+ private void SendInVoiceRange(ChatChannel channel, string name, string message, string wrappedMessage, string obfuscated, string obfuscatedWrappedMessage, EntityUid source, ChatTransmitRange range, NetUserId? author = null, LanguagePrototype? languageOverride = null)
{
+ var language = languageOverride ?? _language.GetLanguage(source);
foreach (var (session, data) in GetRecipients(source, VoiceRange))
{
var entRange = MessageRangeCheck(session, data, range);
if (entRange == MessageRangeCheckResult.Disallowed)
continue;
var entHideChat = entRange == MessageRangeCheckResult.HideChat;
- _chatManager.ChatMessageToOne(channel, message, wrappedMessage, source, entHideChat, session.Channel, author: author);
+ if (session.AttachedEntity is not { Valid: true } playerEntity)
+ continue;
+ EntityUid listener = session.AttachedEntity.Value;
+
+
+ // If the channel does not support languages, or the entity can understand the message, send the original message, otherwise send the obfuscated version
+ if (channel == ChatChannel.LOOC || channel == ChatChannel.Emotes || _language.CanUnderstand(listener, language))
+ {
+ _chatManager.ChatMessageToOne(channel, message, wrappedMessage, source, entHideChat, session.Channel, author: author);
+ }
+ else
+ {
+ _chatManager.ChatMessageToOne(channel, obfuscated, obfuscatedWrappedMessage, source, entHideChat, session.Channel, author: author);
+ }
}
_replay.RecordServerMessage(new ChatMessage(channel, message, wrappedMessage, GetNetEntity(source), null, MessageRangeHideChatForReplay(range)));
@@ -790,6 +834,21 @@ public string SanitizeMessageReplaceWords(string message)
return msg;
}
+ ///
+ /// Wraps a message sent by the specified entity into an "x says y" string.
+ ///
+ public string WrapPublicMessage(EntityUid source, string name, string message)
+ {
+ var speech = GetSpeechVerb(source, message);
+ var verbName = Loc.GetString(_random.Pick(speech.SpeechVerbStrings));
+ return Loc.GetString(speech.Bold ? "chat-manager-entity-say-bold-wrap-message" : "chat-manager-entity-say-wrap-message",
+ ("entityName", name),
+ ("verb", verbName),
+ ("fontType", speech.FontId),
+ ("fontSize", speech.FontSize),
+ ("message", FormattedMessage.EscapeText(message)));
+ }
+
///
/// Returns list of players and ranges for all players withing some range. Also returns observers with a range of -1.
///
@@ -836,7 +895,7 @@ public readonly record struct ICChatRecipientData(float Range, bool Observer, bo
{
}
- private string ObfuscateMessageReadability(string message, float chance)
+ public string ObfuscateMessageReadability(string message, float chance = DefaultObfuscationFactor)
{
var modifiedMessage = new StringBuilder(message);
@@ -925,7 +984,8 @@ public sealed class EntitySpokeEvent : EntityEventArgs
{
public readonly EntityUid Source;
public readonly string Message;
- public readonly string? ObfuscatedMessage; // not null if this was a whisper
+ public readonly bool IsWhisper;
+ public readonly LanguagePrototype Language;
///
/// If the entity was trying to speak into a radio, this was the channel they were trying to access. If a radio
@@ -933,12 +993,13 @@ public sealed class EntitySpokeEvent : EntityEventArgs
///
public RadioChannelPrototype? Channel;
- public EntitySpokeEvent(EntityUid source, string message, RadioChannelPrototype? channel, string? obfuscatedMessage)
+ public EntitySpokeEvent(EntityUid source, string message, RadioChannelPrototype? channel, bool isWhisper, LanguagePrototype language)
{
Source = source;
Message = message;
Channel = channel;
- ObfuscatedMessage = obfuscatedMessage;
+ IsWhisper = isWhisper;
+ Language = language;
}
}
diff --git a/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs b/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs
index bf7691fe375..da16529d515 100644
--- a/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs
+++ b/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs
@@ -1,10 +1,14 @@
+using System.Linq;
using Content.Server.Ghost.Roles.Components;
using Content.Server.Speech.Components;
using Content.Shared.Chemistry.Reagent;
+using Content.Shared.Language;
+using Content.Shared.Language.Systems;
using Content.Shared.Mind.Components;
using Robust.Shared.Prototypes;
using Content.Server.Psionics; //Nyano - Summary: pulls in the ability for the sentient creature to become psionic.
using Content.Shared.Humanoid; //Delta-V - Banning humanoids from becoming ghost roles.
+using Content.Shared.Language.Events;
namespace Content.Server.Chemistry.ReagentEffects;
@@ -24,6 +28,20 @@ public override void Effect(ReagentEffectArgs args)
entityManager.RemoveComponent(uid);
entityManager.RemoveComponent(uid);
+ var speaker = entityManager.EnsureComponent(uid);
+ var fallback = SharedLanguageSystem.FallbackLanguagePrototype;
+
+ if (!speaker.UnderstoodLanguages.Contains(fallback))
+ speaker.UnderstoodLanguages.Add(fallback);
+
+ if (!speaker.SpokenLanguages.Contains(fallback))
+ {
+ speaker.CurrentLanguage = fallback;
+ speaker.SpokenLanguages.Add(fallback);
+ }
+
+ args.EntityManager.EventBus.RaiseLocalEvent(uid, new LanguagesUpdateEvent(), true);
+
// Stops from adding a ghost role to things like people who already have a mind
if (entityManager.TryGetComponent(uid, out var mindContainer) && mindContainer.HasMind)
{
@@ -47,7 +65,7 @@ public override void Effect(ReagentEffectArgs args)
ghostRole = entityManager.AddComponent(uid);
entityManager.EnsureComponent(uid);
- entityManager.EnsureComponent(uid); //Nyano - Summary:. Makes the animated body able to get psionics.
+ entityManager.EnsureComponent(uid); //Nyano - Summary:. Makes the animated body able to get psionics.
var entityData = entityManager.GetComponent(uid);
ghostRole.RoleName = entityData.EntityName;
diff --git a/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs
new file mode 100644
index 00000000000..3d3820562d6
--- /dev/null
+++ b/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs
@@ -0,0 +1,38 @@
+using Content.Server.DeviceNetwork.Components;
+using Content.Shared.DeviceNetwork.Components;
+using Robust.Server.GameObjects;
+
+namespace Content.Server.DeviceNetwork.Systems;
+
+public sealed class DeviceNetworkJammerSystem : EntitySystem
+{
+ [Dependency] private TransformSystem _transform = default!;
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(BeforePacketSent);
+ }
+
+ private void BeforePacketSent(EntityUid uid, TransformComponent xform, BeforePacketSentEvent ev)
+ {
+ if (ev.Cancelled)
+ return;
+
+ var query = EntityQueryEnumerator();
+
+ while (query.MoveNext(out _, out var jammerComp, out var jammerXform))
+ {
+ if (!jammerComp.JammableNetworks.Contains(ev.NetworkId))
+ continue;
+
+ if (jammerXform.Coordinates.InRange(EntityManager, _transform, ev.SenderTransform.Coordinates, jammerComp.Range)
+ || jammerXform.Coordinates.InRange(EntityManager, _transform, xform.Coordinates, jammerComp.Range))
+ {
+ ev.Cancel();
+ return;
+ }
+ }
+ }
+
+}
diff --git a/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs
index 83967c9bbd4..20ee7a5dd1b 100644
--- a/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs
+++ b/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs
@@ -351,13 +351,14 @@ private void SendToConnections(ReadOnlySpan connections,
var xform = Transform(packet.Sender);
- BeforePacketSentEvent beforeEv = new(packet.Sender, xform, _transformSystem.GetWorldPosition(xform));
+ var senderPos = _transformSystem.GetWorldPosition(xform);
foreach (var connection in connections)
{
if (connection.Owner == packet.Sender)
continue;
+ BeforePacketSentEvent beforeEv = new(packet.Sender, xform, senderPos, connection.NetIdEnum.ToString());
RaiseLocalEvent(connection.Owner, beforeEv, false);
if (!beforeEv.Cancelled)
@@ -386,11 +387,17 @@ public sealed class BeforePacketSentEvent : CancellableEntityEventArgs
///
public readonly Vector2 SenderPosition;
- public BeforePacketSentEvent(EntityUid sender, TransformComponent xform, Vector2 senderPosition)
+ ///
+ /// The network the packet will be sent to.
+ ///
+ public readonly string NetworkId;
+
+ public BeforePacketSentEvent(EntityUid sender, TransformComponent xform, Vector2 senderPosition, string networkId)
{
Sender = sender;
SenderTransform = xform;
SenderPosition = senderPosition;
+ NetworkId = networkId;
}
}
diff --git a/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs b/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs
index fd62514d006..cdc083feacd 100644
--- a/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs
+++ b/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs
@@ -1,4 +1,5 @@
-using Content.Server.DeviceNetwork.Components;
+using System.Diagnostics.CodeAnalysis;
+using Content.Server.DeviceNetwork.Components;
using Content.Server.Medical.CrewMonitoring;
using Content.Server.Power.Components;
using Content.Server.Station.Systems;
@@ -38,7 +39,7 @@ public bool IsActiveServer(EntityUid serverId, SingletonDeviceNetServerComponent
/// The address of the active server if it exists
/// The component type that determines what type of server you're getting the address of
/// True if there is an active serve. False otherwise
- public bool TryGetActiveServerAddress(EntityUid stationId, out string? address) where TComp : IComponent
+ public bool TryGetActiveServerAddress(EntityUid stationId, [NotNullWhen(true)] out string? address) where TComp : IComponent
{
var servers = EntityQueryEnumerator<
SingletonDeviceNetServerComponent,
diff --git a/Content.Server/Language/Commands/ListLanguagesCommand.cs b/Content.Server/Language/Commands/ListLanguagesCommand.cs
new file mode 100644
index 00000000000..6698e1b6453
--- /dev/null
+++ b/Content.Server/Language/Commands/ListLanguagesCommand.cs
@@ -0,0 +1,39 @@
+using System.Linq;
+using Content.Shared.Administration;
+using Robust.Shared.Console;
+using Robust.Shared.Enums;
+
+namespace Content.Server.Language.Commands;
+
+[AnyCommand]
+public sealed class ListLanguagesCommand : IConsoleCommand
+{
+ public string Command => "languagelist";
+ public string Description => Loc.GetString("command-list-langs-desc");
+ public string Help => Loc.GetString("command-list-langs-help", ("command", Command));
+
+ public void Execute(IConsoleShell shell, string argStr, string[] args)
+ {
+ if (shell.Player is not { } player)
+ {
+ shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server"));
+ return;
+ }
+
+ if (player.Status != SessionStatus.InGame)
+ return;
+
+ if (player.AttachedEntity is not {} playerEntity)
+ {
+ shell.WriteError(Loc.GetString("shell-must-be-attached-to-entity"));
+ return;
+ }
+
+ var languages = IoCManager.Resolve().GetEntitySystem();
+
+ var (spokenLangs, knownLangs) = languages.GetAllLanguages(playerEntity);
+
+ shell.WriteLine("Spoken:\n" + string.Join("\n", spokenLangs));
+ shell.WriteLine("Understood:\n" + string.Join("\n", knownLangs));
+ }
+}
diff --git a/Content.Server/Language/Commands/SayLanguageCommand.cs b/Content.Server/Language/Commands/SayLanguageCommand.cs
new file mode 100644
index 00000000000..2e4a27b1dcc
--- /dev/null
+++ b/Content.Server/Language/Commands/SayLanguageCommand.cs
@@ -0,0 +1,53 @@
+using Content.Server.Chat.Systems;
+using Content.Shared.Administration;
+using Robust.Shared.Console;
+using Robust.Shared.Enums;
+
+namespace Content.Server.Language.Commands;
+
+[AnyCommand]
+public sealed class SayLanguageCommand : IConsoleCommand
+{
+ public string Command => "saylang";
+ public string Description => Loc.GetString("command-saylang-desc");
+ public string Help => Loc.GetString("command-saylang-help", ("command", Command));
+
+ public void Execute(IConsoleShell shell, string argStr, string[] args)
+ {
+ if (shell.Player is not { } player)
+ {
+ shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server"));
+ return;
+ }
+
+ if (player.Status != SessionStatus.InGame)
+ return;
+
+ if (player.AttachedEntity is not {} playerEntity)
+ {
+ shell.WriteError(Loc.GetString("shell-must-be-attached-to-entity"));
+ return;
+ }
+
+ if (args.Length < 2)
+ return;
+
+ var languageId = args[0];
+ var message = string.Join(" ", args, startIndex: 1, count: args.Length - 1).Trim();
+
+ if (string.IsNullOrEmpty(message))
+ return;
+
+ var languages = IoCManager.Resolve().GetEntitySystem();
+ var chats = IoCManager.Resolve().GetEntitySystem();
+
+ var language = languages.GetLanguagePrototype(languageId);
+ if (language == null || !languages.CanSpeak(playerEntity, language.ID))
+ {
+ shell.WriteError($"Language {languageId} is invalid or you cannot speak it!");
+ return;
+ }
+
+ chats.TrySendInGameICMessage(playerEntity, message, InGameICChatType.Speak, ChatTransmitRange.Normal, false, shell, player, languageOverride: language);
+ }
+}
diff --git a/Content.Server/Language/Commands/SelectLanguageCommand.cs b/Content.Server/Language/Commands/SelectLanguageCommand.cs
new file mode 100644
index 00000000000..e3363846539
--- /dev/null
+++ b/Content.Server/Language/Commands/SelectLanguageCommand.cs
@@ -0,0 +1,48 @@
+using System.Linq;
+using Content.Shared.Administration;
+using Robust.Shared.Console;
+using Robust.Shared.Enums;
+
+namespace Content.Server.Language.Commands;
+
+[AnyCommand]
+public sealed class SelectLanguageCommand : IConsoleCommand
+{
+ public string Command => "languageselect";
+ public string Description => Loc.GetString("command-language-select-desc");
+ public string Help => Loc.GetString("command-language-select-help", ("command", Command));
+
+ public void Execute(IConsoleShell shell, string argStr, string[] args)
+ {
+ if (shell.Player is not { } player)
+ {
+ shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server"));
+ return;
+ }
+
+ if (player.Status != SessionStatus.InGame)
+ return;
+
+ if (player.AttachedEntity is not { } playerEntity)
+ {
+ shell.WriteError(Loc.GetString("shell-must-be-attached-to-entity"));
+ return;
+ }
+
+ if (args.Length < 1)
+ return;
+
+ var languageId = args[0];
+
+ var languages = IoCManager.Resolve().GetEntitySystem();
+
+ var language = languages.GetLanguagePrototype(languageId);
+ if (language == null || !languages.CanSpeak(playerEntity, language.ID))
+ {
+ shell.WriteError($"Language {languageId} is invalid or you cannot speak it!");
+ return;
+ }
+
+ languages.SetLanguage(playerEntity, language.ID);
+ }
+}
diff --git a/Content.Server/Language/DetermineEntityLanguagesEvent.cs b/Content.Server/Language/DetermineEntityLanguagesEvent.cs
new file mode 100644
index 00000000000..13ab2cac279
--- /dev/null
+++ b/Content.Server/Language/DetermineEntityLanguagesEvent.cs
@@ -0,0 +1,29 @@
+namespace Content.Server.Language;
+
+///
+/// Raised in order to determine the language an entity speaks at the current moment,
+/// as well as the list of all languages the entity may speak and understand.
+///
+public sealed class DetermineEntityLanguagesEvent : EntityEventArgs
+{
+ ///
+ /// The default language of this entity. If empty, remain unchanged.
+ /// This field has no effect if the entity decides to speak in a concrete language.
+ ///
+ public string CurrentLanguage;
+ ///
+ /// The list of all languages the entity may speak. Must NOT be held as a reference!
+ ///
+ public List SpokenLanguages;
+ ///
+ /// The list of all languages the entity may understand. Must NOT be held as a reference!
+ ///
+ public List UnderstoodLanguages;
+
+ public DetermineEntityLanguagesEvent(string currentLanguage, List spokenLanguages, List understoodLanguages)
+ {
+ CurrentLanguage = currentLanguage;
+ SpokenLanguages = spokenLanguages;
+ UnderstoodLanguages = understoodLanguages;
+ }
+}
diff --git a/Content.Server/Language/LanguageSystem.Networking.cs b/Content.Server/Language/LanguageSystem.Networking.cs
new file mode 100644
index 00000000000..7517b4185e3
--- /dev/null
+++ b/Content.Server/Language/LanguageSystem.Networking.cs
@@ -0,0 +1,59 @@
+using Content.Server.Mind;
+using Content.Shared.Language;
+using Content.Shared.Language.Events;
+using Content.Shared.Mind;
+using Content.Shared.Mind.Components;
+using Robust.Shared.Player;
+
+namespace Content.Server.Language;
+
+///
+/// LanguageSystem Networking
+/// This is used to update client state when mind change entity.
+///
+
+public sealed partial class LanguageSystem
+{
+ [Dependency] private readonly MindSystem _mind = default!;
+
+
+ public void InitializeNet()
+ {
+ // Refresh the client's state when its mind hops to a different entity
+ SubscribeLocalEvent((uid, _, _) => SendLanguageStateToClient(uid));
+ SubscribeLocalEvent((_, _, args) =>
+ {
+ if (args.Mind.Comp.Session != null)
+ SendLanguageStateToClient(args.Mind.Comp.Session);
+ });
+
+ SubscribeLocalEvent((uid, comp, _) => SendLanguageStateToClient(uid, comp));
+ SubscribeNetworkEvent((_, session) => SendLanguageStateToClient(session.SenderSession));
+ }
+
+
+ private void SendLanguageStateToClient(EntityUid uid, LanguageSpeakerComponent? comp = null)
+ {
+ // Try to find a mind inside the entity and notify its session
+ if (!_mind.TryGetMind(uid, out _, out var mindComp) || mindComp.Session == null)
+ return;
+
+ SendLanguageStateToClient(uid, mindComp.Session, comp);
+ }
+
+ private void SendLanguageStateToClient(ICommonSession session, LanguageSpeakerComponent? comp = null)
+ {
+ // Try to find an entity associated with the session and resolve the languages from it
+ if (session.AttachedEntity is not { Valid: true } entity)
+ return;
+
+ SendLanguageStateToClient(entity, session, comp);
+ }
+
+ private void SendLanguageStateToClient(EntityUid uid, ICommonSession session, LanguageSpeakerComponent? component = null)
+ {
+ var langs = GetLanguages(uid, component);
+ var message = new LanguagesUpdatedMessage(langs.CurrentLanguage, langs.SpokenLanguages, langs.UnderstoodLanguages);
+ RaiseNetworkEvent(message, session);
+ }
+}
diff --git a/Content.Server/Language/LanguageSystem.cs b/Content.Server/Language/LanguageSystem.cs
new file mode 100644
index 00000000000..f1bf44c1f4f
--- /dev/null
+++ b/Content.Server/Language/LanguageSystem.cs
@@ -0,0 +1,289 @@
+using System.Linq;
+using System.Text;
+using Content.Server.GameTicking.Events;
+using Content.Shared.Language;
+using Content.Shared.Language.Events;
+using Content.Shared.Language.Systems;
+using Robust.Shared.Random;
+using UniversalLanguageSpeakerComponent = Content.Shared.Language.Components.UniversalLanguageSpeakerComponent;
+
+namespace Content.Server.Language;
+
+public sealed partial class LanguageSystem : SharedLanguageSystem
+{
+ // Static and re-used event instances used to minimize memory allocations during language processing, which can happen many times per tick.
+ // These are used in the method GetLanguages and returned from it. They should never be mutated outside of that method or returned outside this system.
+ private readonly DetermineEntityLanguagesEvent
+ _determineLanguagesEvent = new(string.Empty, new(), new()),
+ _universalLanguagesEvent = new(UniversalPrototype, [UniversalPrototype], [UniversalPrototype]); // Returned for universal speakers only
+
+ ///
+ /// A random number added to each pseudo-random number's seed. Changes every round.
+ ///
+ public int RandomRoundSeed { get; private set; }
+
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeNetworkEvent(OnClientSetLanguage);
+ SubscribeLocalEvent(OnInitLanguageSpeaker);
+ SubscribeLocalEvent(_ => RandomRoundSeed = _random.Next());
+
+ InitializeNet();
+ }
+
+
+ #region public api
+ ///
+ /// Obfuscate a message using an entity's default language.
+ ///
+ public string ObfuscateSpeech(EntityUid source, string message)
+ {
+ var language = GetLanguage(source) ?? Universal;
+ return ObfuscateSpeech(message, language);
+ }
+
+ ///
+ /// Obfuscate a message using the given language.
+ ///
+ public string ObfuscateSpeech(string message, LanguagePrototype language)
+ {
+ var builder = new StringBuilder();
+ if (language.ObfuscateSyllables)
+ ObfuscateSyllables(builder, message, language);
+ else
+ ObfuscatePhrases(builder, message, language);
+
+ return builder.ToString();
+ }
+
+ public bool CanUnderstand(EntityUid listener, LanguagePrototype language, LanguageSpeakerComponent? listenerLanguageComp = null)
+ {
+ if (language.ID == UniversalPrototype || HasComp(listener))
+ return true;
+
+ var listenerLanguages = GetLanguages(listener, listenerLanguageComp)?.UnderstoodLanguages;
+
+ return listenerLanguages?.Contains(language.ID, StringComparer.Ordinal) ?? false;
+ }
+
+ public bool CanSpeak(EntityUid speaker, string language, LanguageSpeakerComponent? speakerComp = null)
+ {
+ if (HasComp(speaker))
+ return true;
+
+ var langs = GetLanguages(speaker, speakerComp)?.UnderstoodLanguages;
+ return langs?.Contains(language, StringComparer.Ordinal) ?? false;
+ }
+
+ ///
+ /// Returns the current language of the given entity.
+ /// Assumes Universal if not specified.
+ ///
+ public LanguagePrototype GetLanguage(EntityUid speaker, LanguageSpeakerComponent? languageComp = null)
+ {
+ var id = GetLanguages(speaker, languageComp)?.CurrentLanguage;
+ if (id == null)
+ return Universal; // Fallback
+
+ _prototype.TryIndex(id, out LanguagePrototype? proto);
+
+ return proto ?? Universal;
+ }
+
+ public void SetLanguage(EntityUid speaker, string language, LanguageSpeakerComponent? languageComp = null)
+ {
+ if (!CanSpeak(speaker, language) || HasComp(speaker))
+ return;
+
+ if (languageComp == null && !TryComp(speaker, out languageComp))
+ return;
+
+ if (languageComp.CurrentLanguage == language)
+ return;
+
+ languageComp.CurrentLanguage = language;
+
+ RaiseLocalEvent(speaker, new LanguagesUpdateEvent(), true);
+ }
+
+ ///
+ /// Adds a new language to the lists of understood and/or spoken languages of the given component.
+ ///
+ public void AddLanguage(LanguageSpeakerComponent comp, string language, bool addSpoken = true, bool addUnderstood = true)
+ {
+ if (addSpoken && !comp.SpokenLanguages.Contains(language))
+ comp.SpokenLanguages.Add(language);
+
+ if (addUnderstood && !comp.UnderstoodLanguages.Contains(language))
+ comp.UnderstoodLanguages.Add(language);
+
+ RaiseLocalEvent(comp.Owner, new LanguagesUpdateEvent(), true);
+ }
+
+ public (List spoken, List understood) GetAllLanguages(EntityUid speaker)
+ {
+ var languages = GetLanguages(speaker);
+ // The lists need to be copied because the internal ones are re-used for performance reasons.
+ return (new List(languages.SpokenLanguages), new List(languages.UnderstoodLanguages));
+ }
+
+ ///
+ /// Ensures the given entity has a valid language as its current language.
+ /// If not, sets it to the first entry of its SpokenLanguages list, or universal if it's empty.
+ ///
+ public void EnsureValidLanguage(EntityUid entity, LanguageSpeakerComponent? comp = null)
+ {
+ if (comp == null && !TryComp(entity, out comp))
+ return;
+
+ var langs = GetLanguages(entity, comp);
+ if (!langs.SpokenLanguages.Contains(comp!.CurrentLanguage, StringComparer.Ordinal))
+ {
+ comp.CurrentLanguage = langs.SpokenLanguages.FirstOrDefault(UniversalPrototype);
+ RaiseLocalEvent(comp.Owner, new LanguagesUpdateEvent(), true);
+ }
+ }
+ #endregion
+
+ #region event handling
+ private void OnInitLanguageSpeaker(EntityUid uid, LanguageSpeakerComponent component, ComponentInit args)
+ {
+ if (string.IsNullOrEmpty(component.CurrentLanguage))
+ component.CurrentLanguage = component.SpokenLanguages.FirstOrDefault(UniversalPrototype);
+ }
+ #endregion
+
+ #region internal api - obfuscation
+ private void ObfuscateSyllables(StringBuilder builder, string message, LanguagePrototype language)
+ {
+ // Go through each word. Calculate its hash sum and count the number of letters.
+ // Replicate it with pseudo-random syllables of pseudo-random (but similar) length. Use the hash code as the seed.
+ // This means that identical words will be obfuscated identically. Simple words like "hello" or "yes" in different langs can be memorized.
+ var wordBeginIndex = 0;
+ var hashCode = 0;
+ for (var i = 0; i < message.Length; i++)
+ {
+ var ch = char.ToLower(message[i]);
+ // A word ends when one of the following is found: a space, a sentence end, or EOM
+ if (char.IsWhiteSpace(ch) || IsSentenceEnd(ch) || i == message.Length - 1)
+ {
+ var wordLength = i - wordBeginIndex;
+ if (wordLength > 0)
+ {
+ var newWordLength = PseudoRandomNumber(hashCode, 1, 4);
+
+ for (var j = 0; j < newWordLength; j++)
+ {
+ var index = PseudoRandomNumber(hashCode + j, 0, language.Replacement.Count);
+ builder.Append(language.Replacement[index]);
+ }
+ }
+
+ builder.Append(ch);
+ hashCode = 0;
+ wordBeginIndex = i + 1;
+ }
+ else
+ hashCode = hashCode * 31 + ch;
+ }
+ }
+
+ private void ObfuscatePhrases(StringBuilder builder, string message, LanguagePrototype language)
+ {
+ // In a similar manner, each phrase is obfuscated with a random number of conjoined obfuscation phrases.
+ // However, the number of phrases depends on the number of characters in the original phrase.
+ var sentenceBeginIndex = 0;
+ for (var i = 0; i < message.Length; i++)
+ {
+ var ch = char.ToLower(message[i]);
+ if (IsSentenceEnd(ch) || i == message.Length - 1)
+ {
+ var length = i - sentenceBeginIndex;
+ if (length > 0)
+ {
+ var newLength = (int) Math.Clamp(Math.Cbrt(length) - 1, 1, 4); // 27+ chars for 2 phrases, 64+ for 3, 125+ for 4.
+
+ for (var j = 0; j < newLength; j++)
+ {
+ var phrase = _random.Pick(language.Replacement);
+ builder.Append(phrase);
+ }
+ }
+ sentenceBeginIndex = i + 1;
+
+ if (IsSentenceEnd(ch))
+ builder.Append(ch).Append(" ");
+ }
+ }
+ }
+
+ private static bool IsSentenceEnd(char ch)
+ {
+ return ch is '.' or '!' or '?';
+ }
+ #endregion
+
+ #region internal api - misc
+ ///
+ /// Dynamically resolves the current language of the entity and the list of all languages it speaks.
+ ///
+ /// If the entity is not a language speaker, or is a universal language speaker, then it's assumed to speak Universal,
+ /// aka all languages at once and none at the same time.
+ ///
+ ///
+ /// The returned event is reused and thus must not be held as a reference anywhere but inside the caller function.
+ ///
+ private DetermineEntityLanguagesEvent GetLanguages(EntityUid speaker, LanguageSpeakerComponent? comp = null)
+ {
+ // This is a shortcut for ghosts and entities that should not speak normally (admemes)
+ if (HasComp(speaker) || !TryComp(speaker, out comp))
+ return _universalLanguagesEvent;
+
+ var ev = _determineLanguagesEvent;
+ ev.SpokenLanguages.Clear();
+ ev.UnderstoodLanguages.Clear();
+
+ ev.CurrentLanguage = comp.CurrentLanguage;
+ ev.SpokenLanguages.AddRange(comp.SpokenLanguages);
+ ev.UnderstoodLanguages.AddRange(comp.UnderstoodLanguages);
+
+ RaiseLocalEvent(speaker, ev, true);
+
+ if (ev.CurrentLanguage.Length == 0)
+ ev.CurrentLanguage = !string.IsNullOrEmpty(comp.CurrentLanguage) ? comp.CurrentLanguage : UniversalPrototype; // Fall back to account for admemes like admins possessing a bread
+ return ev;
+ }
+
+ ///
+ /// Generates a stable pseudo-random number in the range (min, max) for the given seed.
+ /// Each input seed corresponds to exactly one random number.
+ ///
+ private int PseudoRandomNumber(int seed, int min, int max)
+ {
+ // This is not a uniform distribution, but it shouldn't matter given there's 2^31 possible random numbers,
+ // the bias of this function should be so tiny it will never be noticed.
+ seed += RandomRoundSeed;
+ var random = ((seed * 1103515245) + 12345) & 0x7fffffff; // Source: http://cs.uccs.edu/~cs591/bufferOverflow/glibc-2.2.4/stdlib/random_r.c
+ return random % (max - min) + min;
+ }
+
+ ///
+ /// Set CurrentLanguage of the client, the client must be able to Understand the language requested.
+ ///
+ private void OnClientSetLanguage(LanguagesSetMessage message, EntitySessionEventArgs args)
+ {
+ if (args.SenderSession.AttachedEntity is not {Valid: true} speaker)
+ return;
+
+ var language = GetLanguagePrototype(message.CurrentLanguage);
+
+ if (language == null || !CanSpeak(speaker, language.ID))
+ return;
+
+ SetLanguage(speaker, language.ID);
+ }
+ #endregion
+}
diff --git a/Content.Server/Language/TranslatorImplanterSystem.cs b/Content.Server/Language/TranslatorImplanterSystem.cs
new file mode 100644
index 00000000000..1e0c13375e4
--- /dev/null
+++ b/Content.Server/Language/TranslatorImplanterSystem.cs
@@ -0,0 +1,72 @@
+using System.Linq;
+using Content.Server.Administration.Logs;
+using Content.Server.Popups;
+using Content.Shared.Database;
+using Content.Shared.Interaction;
+using Content.Shared.Language;
+using Content.Shared.Language.Components;
+using Content.Shared.Language.Events;
+using Content.Shared.Language.Systems;
+using Content.Shared.Mobs.Components;
+using Content.Shared.Language.Components.Translators;
+
+namespace Content.Server.Language;
+
+public sealed class TranslatorImplanterSystem : SharedTranslatorImplanterSystem
+{
+ [Dependency] private readonly PopupSystem _popup = default!;
+ [Dependency] private readonly IAdminLogManager _adminLogger = default!;
+ [Dependency] private readonly LanguageSystem _language = default!;
+
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnImplant);
+ }
+
+
+ private void OnImplant(EntityUid implanter, TranslatorImplanterComponent component, AfterInteractEvent args)
+ {
+ if (component.Used || !args.CanReach || args.Target is not { Valid: true } target)
+ return;
+
+ if (!TryComp(target, out var speaker))
+ return;
+
+ if (component.MobsOnly && !HasComp(target))
+ {
+ _popup.PopupEntity("translator-implanter-refuse", component.Owner);
+ return;
+ }
+
+ var understood = _language.GetAllLanguages(target).understood;
+ if (component.RequiredLanguages.Count > 0 && !component.RequiredLanguages.Any(lang => understood.Contains(lang)))
+ {
+ _popup.PopupEntity(Loc.GetString("translator-implanter-refuse",
+ ("implanter", implanter), ("target", target)), implanter);
+ return;
+ }
+
+ var intrinsic = EnsureComp(target);
+ intrinsic.Enabled = true;
+
+ foreach (var lang in component.SpokenLanguages.Where(lang => !intrinsic.SpokenLanguages.Contains(lang)))
+ intrinsic.SpokenLanguages.Add(lang);
+
+ foreach (var lang in component.UnderstoodLanguages.Where(lang => !intrinsic.UnderstoodLanguages.Contains(lang)))
+ intrinsic.UnderstoodLanguages.Add(lang);
+
+ component.Used = true;
+ _popup.PopupEntity(Loc.GetString("translator-implanter-success",
+ ("implanter", implanter), ("target", target)), implanter);
+
+ _adminLogger.Add(LogType.Action, LogImpact.Medium,
+ $"{ToPrettyString(args.User):player} used {ToPrettyString(implanter):implanter} to give {ToPrettyString(target):target} the following languages:"
+ + $"\nSpoken: {string.Join(", ", component.SpokenLanguages)}; Understood: {string.Join(", ", component.UnderstoodLanguages)}");
+
+ OnAppearanceChange(implanter, component);
+ RaiseLocalEvent(target, new LanguagesUpdateEvent(), true);
+ }
+}
diff --git a/Content.Server/Language/TranslatorSystem.cs b/Content.Server/Language/TranslatorSystem.cs
new file mode 100644
index 00000000000..3b7704b9a71
--- /dev/null
+++ b/Content.Server/Language/TranslatorSystem.cs
@@ -0,0 +1,225 @@
+using System.Linq;
+using Content.Server.Popups;
+using Content.Server.PowerCell;
+using Content.Shared.Interaction;
+using Content.Shared.Interaction.Events;
+using Content.Shared.Language;
+using Content.Shared.Language.Events;
+using Content.Shared.Language.Systems;
+using Content.Shared.PowerCell;
+using Content.Shared.Language.Components.Translators;
+
+namespace Content.Server.Language;
+
+// This does not support holding multiple translators at once.
+// That shouldn't be an issue for now, but it needs to be fixed later.
+public sealed class TranslatorSystem : SharedTranslatorSystem
+{
+ [Dependency] private readonly PopupSystem _popup = default!;
+ [Dependency] private readonly LanguageSystem _language = default!;
+ [Dependency] private readonly PowerCellSystem _powerCell = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ // I wanna die. But my death won't help us discover polymorphism.
+ SubscribeLocalEvent(OnDetermineLanguages);
+ SubscribeLocalEvent(OnDetermineLanguages);
+ SubscribeLocalEvent(OnDetermineLanguages);
+
+ SubscribeLocalEvent(OnTranslatorToggle);
+ SubscribeLocalEvent(OnPowerCellSlotEmpty);
+
+ // TODO: why does this use InteractHandEvent??
+ SubscribeLocalEvent(OnTranslatorInteract);
+ SubscribeLocalEvent(OnTranslatorDropped);
+ }
+
+ private void OnDetermineLanguages(EntityUid uid, IntrinsicTranslatorComponent component,
+ DetermineEntityLanguagesEvent ev)
+ {
+ if (!component.Enabled)
+ return;
+
+ if (!_powerCell.HasActivatableCharge(uid))
+ return;
+
+ var addUnderstood = true;
+ var addSpoken = true;
+ if (component.RequiredLanguages.Count > 0)
+ {
+ if (component.RequiresAllLanguages)
+ {
+ // Add langs when the wielder has all of the required languages
+ foreach (var language in component.RequiredLanguages)
+ {
+ if (!ev.SpokenLanguages.Contains(language, StringComparer.Ordinal))
+ addSpoken = false;
+
+ if (!ev.UnderstoodLanguages.Contains(language, StringComparer.Ordinal))
+ addUnderstood = false;
+ }
+ }
+ else
+ {
+ // Add langs when the wielder has at least one of the required languages
+ addUnderstood = false;
+ addSpoken = false;
+ foreach (var language in component.RequiredLanguages)
+ {
+ if (ev.SpokenLanguages.Contains(language, StringComparer.Ordinal))
+ addSpoken = true;
+
+ if (ev.UnderstoodLanguages.Contains(language, StringComparer.Ordinal))
+ addUnderstood = true;
+ }
+ }
+ }
+
+ if (addSpoken)
+ {
+ foreach (var language in component.SpokenLanguages)
+ AddIfNotExists(ev.SpokenLanguages, language);
+
+ if (component.DefaultLanguageOverride != null && ev.CurrentLanguage.Length == 0)
+ ev.CurrentLanguage = component.DefaultLanguageOverride;
+ }
+
+ if (addUnderstood)
+ foreach (var language in component.UnderstoodLanguages)
+ AddIfNotExists(ev.UnderstoodLanguages, language);
+ }
+
+ private void OnTranslatorInteract( EntityUid translator, HandheldTranslatorComponent component, InteractHandEvent args)
+ {
+ var holder = args.User;
+ if (!EntityManager.HasComponent(holder))
+ return;
+
+ var intrinsic = EnsureComp(holder);
+ UpdateBoundIntrinsicComp(component, intrinsic, component.Enabled);
+
+ RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true);
+ }
+
+ private void OnTranslatorDropped(EntityUid translator, HandheldTranslatorComponent component, DroppedEvent args)
+ {
+ var holder = args.User;
+ if (!EntityManager.TryGetComponent(holder, out var intrinsic))
+ return;
+
+ if (intrinsic.Issuer == component)
+ {
+ intrinsic.Enabled = false;
+ RemCompDeferred(holder, intrinsic);
+ }
+
+ _language.EnsureValidLanguage(holder);
+
+ RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true);
+ }
+
+ private void OnTranslatorToggle(EntityUid translator, HandheldTranslatorComponent component, ActivateInWorldEvent args)
+ {
+ if (!component.ToggleOnInteract)
+ return;
+
+ var hasPower = _powerCell.HasDrawCharge(translator);
+
+ if (Transform(args.Target).ParentUid is { Valid: true } holder
+ && EntityManager.HasComponent(holder))
+ {
+ // This translator is held by a language speaker and thus has an intrinsic counterpart bound to it.
+ // Make sure it's up-to-date.
+ var intrinsic = EnsureComp(holder);
+ var isEnabled = !component.Enabled;
+ if (intrinsic.Issuer != component)
+ {
+ // The intrinsic comp wasn't owned by this handheld component, so this comp wasn't the active translator.
+ // Thus it needs to be turned on regardless of its previous state.
+ intrinsic.Issuer = component;
+ isEnabled = true;
+ }
+
+ isEnabled &= hasPower;
+ UpdateBoundIntrinsicComp(component, intrinsic, isEnabled);
+ component.Enabled = isEnabled;
+ _powerCell.SetPowerCellDrawEnabled(translator, isEnabled);
+
+ _language.EnsureValidLanguage(holder);
+ RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true);
+ }
+ else
+ {
+ // This is a standalone translator (e.g. lying on the ground), toggle its state.
+ component.Enabled = !component.Enabled && hasPower;
+ _powerCell.SetPowerCellDrawEnabled(translator, !component.Enabled && hasPower);
+ }
+
+ OnAppearanceChange(translator, component);
+
+ // HasPower shows a popup when there's no power, so we do not proceed in that case
+ if (hasPower)
+ {
+ var message = Loc.GetString(
+ component.Enabled
+ ? "translator-component-turnon"
+ : "translator-component-shutoff",
+ ("translator", component.Owner));
+ _popup.PopupEntity(message, component.Owner, args.User);
+ }
+ }
+
+ private void OnPowerCellSlotEmpty(EntityUid translator, HandheldTranslatorComponent component, PowerCellSlotEmptyEvent args)
+ {
+ component.Enabled = false;
+ _powerCell.SetPowerCellDrawEnabled(translator, false);
+ OnAppearanceChange(translator, component);
+
+ if (Transform(translator).ParentUid is { Valid: true } holder
+ && EntityManager.HasComponent(holder))
+ {
+ if (!EntityManager.TryGetComponent(holder, out var intrinsic))
+ return;
+
+ if (intrinsic.Issuer == component)
+ {
+ intrinsic.Enabled = false;
+ EntityManager.RemoveComponent(holder, intrinsic);
+ }
+
+ _language.EnsureValidLanguage(holder);
+ RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true);
+ }
+ }
+
+ ///
+ /// Copies the state from the handheld to the intrinsic component
+ ///
+ private void UpdateBoundIntrinsicComp(HandheldTranslatorComponent comp, HoldsTranslatorComponent intrinsic, bool isEnabled)
+ {
+ if (isEnabled)
+ {
+ intrinsic.SpokenLanguages = new List(comp.SpokenLanguages);
+ intrinsic.UnderstoodLanguages = new List(comp.UnderstoodLanguages);
+ intrinsic.DefaultLanguageOverride = comp.DefaultLanguageOverride;
+ }
+ else
+ {
+ intrinsic.SpokenLanguages.Clear();
+ intrinsic.UnderstoodLanguages.Clear();
+ intrinsic.DefaultLanguageOverride = null;
+ }
+
+ intrinsic.Enabled = isEnabled;
+ intrinsic.Issuer = comp;
+ }
+
+ private static void AddIfNotExists(List list, string item)
+ {
+ if (list.Contains(item))
+ return;
+ list.Add(item);
+ }
+}
diff --git a/Content.Server/Mind/Commands/MakeSentientCommand.cs b/Content.Server/Mind/Commands/MakeSentientCommand.cs
index 5e19d135b6f..cacd499ab8d 100644
--- a/Content.Server/Mind/Commands/MakeSentientCommand.cs
+++ b/Content.Server/Mind/Commands/MakeSentientCommand.cs
@@ -1,7 +1,10 @@
using Content.Server.Administration;
+using Content.Server.Language;
using Content.Shared.Administration;
using Content.Shared.Emoting;
using Content.Shared.Examine;
+using Content.Shared.Language;
+using Content.Shared.Language.Systems;
using Content.Shared.Mind.Components;
using Content.Shared.Movement.Components;
using Content.Shared.Speech;
@@ -55,6 +58,13 @@ public static void MakeSentient(EntityUid uid, IEntityManager entityManager, boo
{
entityManager.EnsureComponent(uid);
entityManager.EnsureComponent(uid);
+
+ var language = IoCManager.Resolve().GetEntitySystem();
+ var speaker = entityManager.EnsureComponent(uid);
+ // If the speaker knows any language (like monkey or robot), they keep those
+ // Otherwise, we give them the fallback
+ if (speaker.SpokenLanguages.Count == 0)
+ language.AddLanguage(speaker, SharedLanguageSystem.FallbackLanguagePrototype);
}
entityManager.EnsureComponent(uid);
diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs
index 7ac6768e359..e7af2c91073 100644
--- a/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs
+++ b/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs
@@ -56,7 +56,30 @@ private bool IsFreeSpace(
return true;
}
- return false;
+ // TODO: Ideally for "FreeSpace" we check all entities on the tile and build flags dynamically (pathfinder refactor in future).
+ var ents = _entSetPool.Get();
+ _lookup.GetLocalEntitiesIntersecting(node.GraphUid, node.ChunkOrigin, ents, flags: LookupFlags.Static);
+ var result = true;
+
+ if (ents.Count > 0)
+ {
+ var fixtures = _fixturesQuery.GetComponent(uid);
+ var physics = _physicsQuery.GetComponent(uid);
+
+ foreach (var intersecting in ents)
+ {
+ if (!_physics.IsCurrentlyHardCollidable((uid, fixtures, physics), intersecting))
+ {
+ continue;
+ }
+
+ result = false;
+ break;
+ }
+ }
+
+ _entSetPool.Return(ents);
+ return result;
}
///
diff --git a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs
index 5ed39d51787..048fda23553 100644
--- a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs
+++ b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs
@@ -20,6 +20,8 @@ public sealed class PowerReceiverSystem : EntitySystem
[Dependency] private readonly IAdminManager _adminManager = default!;
[Dependency] private readonly AppearanceSystem _appearance = default!;
[Dependency] private readonly AudioSystem _audio = default!;
+ private EntityQuery _recQuery;
+ private EntityQuery _provQuery;
public override void Initialize()
{
@@ -35,6 +37,9 @@ public override void Initialize()
SubscribeLocalEvent>(OnGetVerbs);
SubscribeLocalEvent>(AddSwitchPowerVerb);
+
+ _recQuery = GetEntityQuery();
+ _provQuery = GetEntityQuery();
}
private void OnGetVerbs(EntityUid uid, ApcPowerReceiverComponent component, GetVerbsEvent args)
@@ -77,7 +82,7 @@ private void OnProviderShutdown(EntityUid uid, ApcPowerProviderComponent compone
private void OnProviderConnected(Entity receiver, ref ExtensionCableSystem.ProviderConnectedEvent args)
{
var providerUid = args.Provider.Owner;
- if (!EntityManager.TryGetComponent(providerUid, out var provider))
+ if (!_provQuery.TryGetComponent(providerUid, out var provider))
return;
receiver.Comp.Provider = provider;
@@ -94,7 +99,7 @@ private void OnProviderDisconnected(Entity receiver,
private void OnReceiverConnected(Entity provider, ref ExtensionCableSystem.ReceiverConnectedEvent args)
{
- if (EntityManager.TryGetComponent(args.Receiver, out ApcPowerReceiverComponent? receiver))
+ if (_recQuery.TryGetComponent(args.Receiver, out var receiver))
{
provider.Comp.AddReceiver(receiver);
}
@@ -102,7 +107,7 @@ private void OnReceiverConnected(Entity provider, ref
private void OnReceiverDisconnected(EntityUid uid, ApcPowerProviderComponent provider, ExtensionCableSystem.ReceiverDisconnectedEvent args)
{
- if (EntityManager.TryGetComponent(args.Receiver, out ApcPowerReceiverComponent? receiver))
+ if (_recQuery.TryGetComponent(args.Receiver, out var receiver))
{
provider.RemoveReceiver(receiver);
}
@@ -116,7 +121,7 @@ private void AddSwitchPowerVerb(EntityUid uid, PowerSwitchComponent component, G
if (!HasComp(args.User))
return;
- if (!TryComp(uid, out var receiver))
+ if (!_recQuery.TryGetComponent(uid, out var receiver))
return;
if (!receiver.NeedsPower)
@@ -152,7 +157,7 @@ private void ProviderChanged(Entity receiver)
///
public bool IsPowered(EntityUid uid, ApcPowerReceiverComponent? receiver = null)
{
- if (!Resolve(uid, ref receiver, false))
+ if (!_recQuery.Resolve(uid, ref receiver, false))
return true;
return receiver.Powered;
@@ -164,7 +169,7 @@ public bool IsPowered(EntityUid uid, ApcPowerReceiverComponent? receiver = null)
///
public bool TogglePower(EntityUid uid, bool playSwitchSound = true, ApcPowerReceiverComponent? receiver = null, EntityUid? user = null)
{
- if (!Resolve(uid, ref receiver, false))
+ if (!_recQuery.Resolve(uid, ref receiver, false))
return true;
// it'll save a lot of confusion if 'always powered' means 'always powered'
diff --git a/Content.Server/Radio/EntitySystems/HeadsetSystem.cs b/Content.Server/Radio/EntitySystems/HeadsetSystem.cs
index d18b044205c..53517da6cb4 100644
--- a/Content.Server/Radio/EntitySystems/HeadsetSystem.cs
+++ b/Content.Server/Radio/EntitySystems/HeadsetSystem.cs
@@ -1,6 +1,9 @@
using Content.Server.Chat.Systems;
using Content.Server.Emp;
+using Content.Server.Language;
using Content.Server.Radio.Components;
+using Content.Server.Speech;
+using Content.Shared.Chat;
using Content.Shared.Inventory.Events;
using Content.Shared.Radio;
using Content.Shared.Radio.Components;
@@ -14,6 +17,7 @@ public sealed class HeadsetSystem : SharedHeadsetSystem
{
[Dependency] private readonly INetManager _netMan = default!;
[Dependency] private readonly RadioSystem _radio = default!;
+ [Dependency] private readonly LanguageSystem _language = default!;
public override void Initialize()
{
@@ -99,8 +103,16 @@ public void SetEnabled(EntityUid uid, bool value, HeadsetComponent? component =
private void OnHeadsetReceive(EntityUid uid, HeadsetComponent component, ref RadioReceiveEvent args)
{
- if (TryComp(Transform(uid).ParentUid, out ActorComponent? actor))
- _netMan.ServerSendMessage(args.ChatMsg, actor.PlayerSession.Channel);
+ var parent = Transform(uid).ParentUid;
+ if (TryComp(parent, out ActorComponent? actor))
+ {
+ var canUnderstand = _language.CanUnderstand(parent, args.Language);
+ var msg = new MsgChatMessage
+ {
+ Message = canUnderstand ? args.OriginalChatMsg : args.LanguageObfuscatedChatMsg
+ };
+ _netMan.ServerSendMessage(msg, actor.PlayerSession.Channel);
+ }
}
private void OnEmpPulse(EntityUid uid, HeadsetComponent component, ref EmpPulseEvent args)
diff --git a/Content.Server/Radio/EntitySystems/JammerSystem.cs b/Content.Server/Radio/EntitySystems/JammerSystem.cs
index fdf02f94df5..53e0409af06 100644
--- a/Content.Server/Radio/EntitySystems/JammerSystem.cs
+++ b/Content.Server/Radio/EntitySystems/JammerSystem.cs
@@ -1,8 +1,13 @@
+using Content.Server.DeviceNetwork.Components;
+using Content.Server.DeviceNetwork.Systems;
+using Content.Server.Medical.CrewMonitoring;
using Content.Server.Medical.SuitSensors;
using Content.Server.Popups;
using Content.Server.Power.EntitySystems;
using Content.Server.PowerCell;
using Content.Server.Radio.Components;
+using Content.Server.Station.Systems;
+using Content.Shared.DeviceNetwork.Components;
using Content.Shared.Examine;
using Content.Shared.Interaction;
using Content.Shared.PowerCell.Components;
@@ -15,6 +20,8 @@ public sealed class JammerSystem : EntitySystem
[Dependency] private readonly BatterySystem _battery = default!;
[Dependency] private readonly PopupSystem _popup = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
+ [Dependency] private readonly StationSystem _stationSystem = default!;
+ [Dependency] private readonly SingletonDeviceNetServerSystem _singletonServerSystem = default!;
public override void Initialize()
{
@@ -36,6 +43,7 @@ public override void Update(float frameTime)
!_battery.TryUseCharge(batteryUid.Value, jam.Wattage * frameTime, battery))
{
RemComp(uid);
+ RemComp(uid);
}
}
}
@@ -48,10 +56,19 @@ private void OnActivate(EntityUid uid, RadioJammerComponent comp, ActivateInWorl
if (activated)
{
EnsureComp(uid);
+ var stationId = _stationSystem.GetOwningStation(uid);
+ if (stationId != null && _singletonServerSystem.TryGetActiveServerAddress(stationId.Value, out var netId))
+ {
+ EnsureComp(uid, out var jammingComp);
+ jammingComp.Range = comp.Range;
+ jammingComp.JammableNetworks.Add(netId);
+ Dirty(uid, jammingComp);
+ }
}
else
{
RemComp(uid);
+ RemComp(uid);
}
var state = Loc.GetString(activated ? "radio-jammer-component-on-state" : "radio-jammer-component-off-state");
var message = Loc.GetString("radio-jammer-component-on-use", ("state", state));
diff --git a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs
index ace7d8ae31a..fc3f69a3ba2 100644
--- a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs
+++ b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs
@@ -1,5 +1,6 @@
using Content.Server.Chat.Systems;
using Content.Server.Interaction;
+using Content.Server.Language;
using Content.Server.Popups;
using Content.Server.Power.Components;
using Content.Server.Power.EntitySystems;
@@ -29,6 +30,7 @@ public sealed class RadioDeviceSystem : EntitySystem
[Dependency] private readonly InteractionSystem _interaction = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly UserInterfaceSystem _ui = default!;
+ [Dependency] private readonly LanguageSystem _language = default!;
// Used to prevent a shitter from using a bunch of radios to spam chat.
private HashSet<(string, EntityUid)> _recentlySent = new();
@@ -208,7 +210,8 @@ private void OnReceiveRadio(EntityUid uid, RadioSpeakerComponent component, ref
("originalName", nameEv.Name));
// log to chat so people can identity the speaker/source, but avoid clogging ghost chat if there are many radios
- _chat.TrySendInGameICMessage(uid, args.Message, InGameICChatType.Whisper, ChatTransmitRange.GhostRangeLimit, nameOverride: name, checkRadioPrefix: false);
+ var message = args.OriginalChatMsg.Message; // The chat system will handle the rest and re-obfuscate if needed.
+ _chat.TrySendInGameICMessage(uid, message, InGameICChatType.Whisper, ChatTransmitRange.GhostRangeLimit, nameOverride: name, checkRadioPrefix: false, languageOverride: args.Language);
}
private void OnBeforeIntercomUiOpen(EntityUid uid, IntercomComponent component, BeforeActivatableUIOpenEvent args)
diff --git a/Content.Server/Radio/EntitySystems/RadioSystem.cs b/Content.Server/Radio/EntitySystems/RadioSystem.cs
index e2a61b5022b..60aa7c2f4fb 100644
--- a/Content.Server/Radio/EntitySystems/RadioSystem.cs
+++ b/Content.Server/Radio/EntitySystems/RadioSystem.cs
@@ -1,10 +1,13 @@
using Content.Server.Administration.Logs;
using Content.Server.Chat.Systems;
+using Content.Server.Language;
using Content.Server.Power.Components;
using Content.Server.Radio.Components;
+using Content.Server.Speech;
using Content.Server.VoiceMask;
using Content.Shared.Chat;
using Content.Shared.Database;
+using Content.Shared.Language;
using Content.Shared.Radio;
using Content.Shared.Radio.Components;
using Content.Shared.Speech;
@@ -29,6 +32,7 @@ public sealed class RadioSystem : EntitySystem
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly ChatSystem _chat = default!;
+ [Dependency] private readonly LanguageSystem _language = default!;
// set used to prevent radio feedback loops.
private readonly HashSet _messages = new();
@@ -44,7 +48,7 @@ private void OnIntrinsicSpeak(EntityUid uid, IntrinsicRadioTransmitterComponent
{
if (args.Channel != null && component.Channels.Contains(args.Channel.ID))
{
- SendRadioMessage(uid, args.Message, args.Channel, uid);
+ SendRadioMessage(uid, args.Message, args.Channel, uid, args.Language);
args.Channel = null; // prevent duplicate messages from other listeners.
}
}
@@ -52,15 +56,23 @@ private void OnIntrinsicSpeak(EntityUid uid, IntrinsicRadioTransmitterComponent
private void OnIntrinsicReceive(EntityUid uid, IntrinsicRadioReceiverComponent component, ref RadioReceiveEvent args)
{
if (TryComp(uid, out ActorComponent? actor))
- _netMan.ServerSendMessage(args.ChatMsg, actor.PlayerSession.Channel);
+ {
+ // Einstein-Engines - languages mechanic
+ var listener = component.Owner;
+ var msg = args.OriginalChatMsg;
+ if (listener != null && !_language.CanUnderstand(listener, args.Language))
+ msg = args.LanguageObfuscatedChatMsg;
+
+ _netMan.ServerSendMessage(new MsgChatMessage { Message = msg}, actor.PlayerSession.Channel);
+ }
}
///
/// Send radio message to all active radio listeners
///
- public void SendRadioMessage(EntityUid messageSource, string message, ProtoId channel, EntityUid radioSource, bool escapeMarkup = true)
+ public void SendRadioMessage(EntityUid messageSource, string message, ProtoId channel, EntityUid radioSource, LanguagePrototype? language = null, bool escapeMarkup = true)
{
- SendRadioMessage(messageSource, message, _prototype.Index(channel), radioSource, escapeMarkup: escapeMarkup);
+ SendRadioMessage(messageSource, message, _prototype.Index(channel), radioSource, escapeMarkup: escapeMarkup, language: language);
}
///
@@ -68,8 +80,11 @@ public void SendRadioMessage(EntityUid messageSource, string message, ProtoId
/// Entity that spoke the message
/// Entity that picked up the message and will send it, e.g. headset
- public void SendRadioMessage(EntityUid messageSource, string message, RadioChannelPrototype channel, EntityUid radioSource, bool escapeMarkup = true)
+ public void SendRadioMessage(EntityUid messageSource, string message, RadioChannelPrototype channel, EntityUid radioSource, LanguagePrototype? language = null, bool escapeMarkup = true)
{
+ if (language == null)
+ language = _language.GetLanguage(messageSource);
+
// TODO if radios ever garble / modify messages, feedback-prevention needs to be handled better than this.
if (!_messages.Add(message))
return;
@@ -84,6 +99,7 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann
name = FormattedMessage.EscapeText(name);
+ // most radios are relayed to chat, so lets parse the chat message beforehand
SpeechVerbPrototype speech;
if (mask != null
&& mask.Enabled
@@ -99,24 +115,15 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann
? FormattedMessage.EscapeText(message)
: message;
- var wrappedMessage = Loc.GetString(speech.Bold ? "chat-radio-message-wrap-bold" : "chat-radio-message-wrap",
- ("color", channel.Color),
- ("fontType", speech.FontId),
- ("fontSize", speech.FontSize),
- ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))),
- ("channel", $"\\[{channel.LocalizedName}\\]"),
- ("name", name),
- ("message", content));
+ var wrappedMessage = WrapRadioMessage(messageSource, channel, name, content);
+ var msg = new ChatMessage(ChatChannel.Radio, content, wrappedMessage, NetEntity.Invalid, null);
- // most radios are relayed to chat, so lets parse the chat message beforehand
- var chat = new ChatMessage(
- ChatChannel.Radio,
- message,
- wrappedMessage,
- NetEntity.Invalid,
- null);
- var chatMsg = new MsgChatMessage { Message = chat };
- var ev = new RadioReceiveEvent(message, messageSource, channel, chatMsg);
+ // ... you guess it
+ var obfuscated = _language.ObfuscateSpeech(content, language);
+ var obfuscatedWrapped = WrapRadioMessage(messageSource, channel, name, obfuscated);
+ var notUdsMsg = new ChatMessage(ChatChannel.Radio, obfuscated, obfuscatedWrapped, NetEntity.Invalid, null);
+
+ var ev = new RadioReceiveEvent(messageSource, channel, msg, notUdsMsg, language);
var sendAttemptEv = new RadioSendAttemptEvent(channel, radioSource);
RaiseLocalEvent(ref sendAttemptEv);
@@ -162,10 +169,23 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann
else
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Radio message from {ToPrettyString(messageSource):user} on {channel.LocalizedName}: {message}");
- _replay.RecordServerMessage(chat);
+ _replay.RecordServerMessage(msg);
_messages.Remove(message);
}
+ private string WrapRadioMessage(EntityUid source, RadioChannelPrototype channel, string name, string message)
+ {
+ var speech = _chat.GetSpeechVerb(source, message);
+ return Loc.GetString(speech.Bold ? "chat-radio-message-wrap-bold" : "chat-radio-message-wrap",
+ ("color", channel.Color),
+ ("fontType", speech.FontId),
+ ("fontSize", speech.FontSize),
+ ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))),
+ ("channel", $"\\[{channel.LocalizedName}\\]"),
+ ("name", name),
+ ("message", FormattedMessage.EscapeText(message)));
+ }
+
///
private bool HasActiveServer(MapId mapId, string channelId)
{
diff --git a/Content.Server/Radio/RadioEvent.cs b/Content.Server/Radio/RadioEvent.cs
index 69d764ffe67..35220d1d757 100644
--- a/Content.Server/Radio/RadioEvent.cs
+++ b/Content.Server/Radio/RadioEvent.cs
@@ -1,10 +1,22 @@
using Content.Shared.Chat;
+using Content.Shared.Language;
using Content.Shared.Radio;
namespace Content.Server.Radio;
+///
+/// The message to display when the speaker can understand "language"
+/// The message to display when the speaker cannot understand "language"
+///
[ByRefEvent]
-public readonly record struct RadioReceiveEvent(string Message, EntityUid MessageSource, RadioChannelPrototype Channel, MsgChatMessage ChatMsg);
+public readonly record struct RadioReceiveEvent(
+ // Einstein-Engines - languages mechanic
+ EntityUid MessageSource,
+ RadioChannelPrototype Channel,
+ ChatMessage OriginalChatMsg,
+ ChatMessage LanguageObfuscatedChatMsg,
+ LanguagePrototype Language
+);
///
/// Use this event to cancel sending message per receiver
diff --git a/Content.Server/Speech/EntitySystems/ListeningSystem.cs b/Content.Server/Speech/EntitySystems/ListeningSystem.cs
index ea3569e055c..f2a625600ca 100644
--- a/Content.Server/Speech/EntitySystems/ListeningSystem.cs
+++ b/Content.Server/Speech/EntitySystems/ListeningSystem.cs
@@ -8,6 +8,7 @@ namespace Content.Server.Speech.EntitySystems;
///
public sealed class ListeningSystem : EntitySystem
{
+ [Dependency] private readonly ChatSystem _chat = default!;
[Dependency] private readonly SharedTransformSystem _xforms = default!;
public override void Initialize()
@@ -18,10 +19,10 @@ public override void Initialize()
private void OnSpeak(EntitySpokeEvent ev)
{
- PingListeners(ev.Source, ev.Message, ev.ObfuscatedMessage);
+ PingListeners(ev.Source, ev.Message, ev.IsWhisper);
}
- public void PingListeners(EntityUid source, string message, string? obfuscatedMessage)
+ public void PingListeners(EntityUid source, string message, bool isWhisper)
{
// TODO whispering / audio volume? Microphone sensitivity?
// for now, whispering just arbitrarily reduces the listener's max range.
@@ -32,7 +33,7 @@ public void PingListeners(EntityUid source, string message, string? obfuscatedMe
var attemptEv = new ListenAttemptEvent(source);
var ev = new ListenEvent(message, source);
- var obfuscatedEv = obfuscatedMessage == null ? null : new ListenEvent(obfuscatedMessage, source);
+ var obfuscatedEv = !isWhisper ? null : new ListenEvent(_chat.ObfuscateMessageReadability(message), source);
var query = EntityQueryEnumerator();
while(query.MoveNext(out var listenerUid, out var listener, out var xform))
diff --git a/Content.Server/Wires/WireLayout.cs b/Content.Server/Wires/WireLayout.cs
index ecafba013e0..621992c915a 100644
--- a/Content.Server/Wires/WireLayout.cs
+++ b/Content.Server/Wires/WireLayout.cs
@@ -28,11 +28,13 @@ public sealed partial class WireLayoutPrototype : IPrototype, IInheritingPrototy
/// initialization)
///
[DataField("dummyWires")]
+ [NeverPushInheritance]
public int DummyWires { get; private set; } = default!;
///
/// All the valid IWireActions currently in this layout.
///
[DataField("wires")]
+ [NeverPushInheritance]
public List? Wires { get; private set; }
}
diff --git a/Content.Shared/Anomaly/SharedAnomalySystem.cs b/Content.Shared/Anomaly/SharedAnomalySystem.cs
index a3bb1e14679..c335cd7b858 100644
--- a/Content.Shared/Anomaly/SharedAnomalySystem.cs
+++ b/Content.Shared/Anomaly/SharedAnomalySystem.cs
@@ -129,7 +129,7 @@ public void StartSupercriticalEvent(EntityUid uid)
if (HasComp(uid))
return;
- AdminLog.Add(LogType.Anomaly, LogImpact.High, $"Anomaly {ToPrettyString(uid)} began to go supercritical.");
+ AdminLog.Add(LogType.Anomaly, LogImpact.Extreme, $"Anomaly {ToPrettyString(uid)} began to go supercritical.");
if (_net.IsServer)
Log.Info($"Anomaly is going supercritical. Entity: {ToPrettyString(uid)}");
diff --git a/Content.Shared/Atmos/EntitySystems/SharedAtmosDebugOverlaySystem.cs b/Content.Shared/Atmos/EntitySystems/SharedAtmosDebugOverlaySystem.cs
index 136c1955025..979bbf77ba6 100644
--- a/Content.Shared/Atmos/EntitySystems/SharedAtmosDebugOverlaySystem.cs
+++ b/Content.Shared/Atmos/EntitySystems/SharedAtmosDebugOverlaySystem.cs
@@ -20,7 +20,8 @@ public readonly record struct AtmosDebugOverlayData(
int? InExcitedGroup,
bool IsSpace,
bool MapAtmosphere,
- bool NoGrid);
+ bool NoGrid,
+ bool Immutable);
///
/// Invalid tiles for the gas overlay.
diff --git a/Content.Shared/Audio/SharedAmbientSoundSystem.cs b/Content.Shared/Audio/SharedAmbientSoundSystem.cs
index 6318ba25573..5f17261825c 100644
--- a/Content.Shared/Audio/SharedAmbientSoundSystem.cs
+++ b/Content.Shared/Audio/SharedAmbientSoundSystem.cs
@@ -5,16 +5,19 @@ namespace Content.Shared.Audio;
public abstract class SharedAmbientSoundSystem : EntitySystem
{
+ private EntityQuery _query;
+
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent(GetCompState);
SubscribeLocalEvent(HandleCompState);
+ _query = GetEntityQuery();
}
public virtual void SetAmbience(EntityUid uid, bool value, AmbientSoundComponent? ambience = null)
{
- if (!Resolve(uid, ref ambience, false) || ambience.Enabled == value)
+ if (!_query.Resolve(uid, ref ambience, false) || ambience.Enabled == value)
return;
ambience.Enabled = value;
@@ -24,7 +27,7 @@ public virtual void SetAmbience(EntityUid uid, bool value, AmbientSoundComponent
public virtual void SetRange(EntityUid uid, float value, AmbientSoundComponent? ambience = null)
{
- if (!Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Range, value))
+ if (!_query.Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Range, value))
return;
ambience.Range = value;
@@ -39,7 +42,7 @@ protected virtual void QueueUpdate(EntityUid uid, AmbientSoundComponent ambience
public virtual void SetVolume(EntityUid uid, float value, AmbientSoundComponent? ambience = null)
{
- if (!Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Volume, value))
+ if (!_query.Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Volume, value))
return;
ambience.Volume = value;
@@ -48,7 +51,7 @@ public virtual void SetVolume(EntityUid uid, float value, AmbientSoundComponent?
public virtual void SetSound(EntityUid uid, SoundSpecifier sound, AmbientSoundComponent? ambience = null)
{
- if (!Resolve(uid, ref ambience, false) || ambience.Sound == sound)
+ if (!_query.Resolve(uid, ref ambience, false) || ambience.Sound == sound)
return;
ambience.Sound = sound;
diff --git a/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs b/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs
new file mode 100644
index 00000000000..75de0cb8a25
--- /dev/null
+++ b/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs
@@ -0,0 +1,24 @@
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.DeviceNetwork.Components;
+
+///
+/// Allow entities to jam DeviceNetwork packets.
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class DeviceNetworkJammerComponent : Component
+{
+ ///
+ /// Range where packets will be jammed. This is checked both against the sender and receiver.
+ ///
+ [DataField, AutoNetworkedField]
+ public float Range = 5.0f;
+
+ ///
+ /// Device networks that can be jammed. For a list of default NetworkIds see DeviceNetIdDefaults on Content.Server.
+ /// Network ids are not guaranteed to be limited to DeviceNetIdDefaults.
+ ///
+ [DataField, AutoNetworkedField]
+ public HashSet JammableNetworks = [];
+
+}
diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs
index ee4a4e9023b..0b72ac5ee74 100644
--- a/Content.Shared/Input/ContentKeyFunctions.cs
+++ b/Content.Shared/Input/ContentKeyFunctions.cs
@@ -25,6 +25,7 @@ public static class ContentKeyFunctions
public static readonly BoundKeyFunction CycleChatChannelBackward = "CycleChatChannelBackward";
public static readonly BoundKeyFunction EscapeContext = "EscapeContext";
public static readonly BoundKeyFunction OpenCharacterMenu = "OpenCharacterMenu";
+ public static readonly BoundKeyFunction OpenLanguageMenu = "OpenLanguageMenu";
public static readonly BoundKeyFunction OpenCraftingMenu = "OpenCraftingMenu";
public static readonly BoundKeyFunction OpenGuidebook = "OpenGuidebook";
public static readonly BoundKeyFunction OpenInventoryMenu = "OpenInventoryMenu";
diff --git a/Content.Shared/Language/Components/LanguageSpeakerComponent.cs b/Content.Shared/Language/Components/LanguageSpeakerComponent.cs
new file mode 100644
index 00000000000..95232ffe6ff
--- /dev/null
+++ b/Content.Shared/Language/Components/LanguageSpeakerComponent.cs
@@ -0,0 +1,29 @@
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
+
+namespace Content.Shared.Language;
+
+[RegisterComponent, AutoGenerateComponentState]
+public sealed partial class LanguageSpeakerComponent : Component
+{
+ ///
+ /// The current language the entity may use to speak.
+ /// Other listeners will hear the entity speak in this language.
+ ///
+ [ViewVariables(VVAccess.ReadWrite)]
+ [AutoNetworkedField]
+ public string CurrentLanguage = default!;
+
+ ///
+ /// List of languages this entity can speak.
+ ///
+ [ViewVariables]
+ [DataField("speaks", customTypeSerializer: typeof(PrototypeIdListSerializer), required: true)]
+ public List SpokenLanguages = new();
+
+ ///
+ /// List of languages this entity can understand.
+ ///
+ [ViewVariables]
+ [DataField("understands", customTypeSerializer: typeof(PrototypeIdListSerializer), required: true)]
+ public List UnderstoodLanguages = new();
+}
diff --git a/Content.Shared/Language/Components/TranslatorImplanterComponent.cs b/Content.Shared/Language/Components/TranslatorImplanterComponent.cs
new file mode 100644
index 00000000000..401e8a8b8aa
--- /dev/null
+++ b/Content.Shared/Language/Components/TranslatorImplanterComponent.cs
@@ -0,0 +1,35 @@
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
+
+namespace Content.Shared.Language.Components;
+
+///
+/// An item that, when used on a mob, adds an intrinsic translator to it.
+///
+[RegisterComponent]
+public sealed partial class TranslatorImplanterComponent : Component
+{
+ [DataField("spoken", customTypeSerializer: typeof(PrototypeIdListSerializer))]
+ public List SpokenLanguages = new();
+
+ [DataField("understood", customTypeSerializer: typeof(PrototypeIdListSerializer))]
+ public List UnderstoodLanguages = new();
+
+ ///
+ /// The list of languages the mob must understand in order for this translator to have effect.
+ /// Knowing one language is enough.
+ ///
+ [DataField("requires", customTypeSerializer: typeof(PrototypeIdListSerializer))]
+ public List RequiredLanguages = new();
+
+ ///
+ /// If true, only allows to use this implanter on mobs.
+ ///
+ [DataField]
+ public bool MobsOnly = true;
+
+ ///
+ /// Whether this implant has been used already.
+ ///
+ [DataField]
+ public bool Used = false;
+}
diff --git a/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs
new file mode 100644
index 00000000000..a66c9be082e
--- /dev/null
+++ b/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs
@@ -0,0 +1,47 @@
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
+
+namespace Content.Shared.Language.Components.Translators;
+
+public abstract partial class BaseTranslatorComponent : Component
+{
+ // TODO may need to be removed completely, it's a part of legacy code that never ended up being used.
+ ///
+ /// The language this translator changes the speaker's language to when they don't specify one.
+ /// If null, does not modify the default language.
+ ///
+ [DataField("defaultLanguage")]
+ [ViewVariables(VVAccess.ReadWrite)]
+ public string? DefaultLanguageOverride = null;
+
+ ///
+ /// The list of additional languages this translator allows the wielder to speak.
+ ///
+ [DataField("spoken", customTypeSerializer: typeof(PrototypeIdListSerializer))]
+ public List SpokenLanguages = new();
+
+ ///
+ /// The list of additional languages this translator allows the wielder to understand.
+ ///
+ [DataField("understood", customTypeSerializer: typeof(PrototypeIdListSerializer))]
+ public List UnderstoodLanguages = new();
+
+ ///
+ /// The languages the wielding MUST know in order for this translator to have effect.
+ /// The field [RequiresAllLanguages] indicates whether all of them are required, or just one.
+ ///
+ [DataField("requires", customTypeSerializer: typeof(PrototypeIdListSerializer))]
+ public List RequiredLanguages = new();
+
+ ///
+ /// If true, the wielder must understand all languages in [RequiredLanguages] to speak [SpokenLanguages],
+ /// and understand all languages in [RequiredLanguages] to understand [UnderstoodLanguages].
+ ///
+ /// Otherwise, at least one language must be known (or the list must be empty).
+ ///
+ [DataField("requiresAll")]
+ [ViewVariables(VVAccess.ReadWrite)]
+ public bool RequiresAllLanguages = false;
+
+ [DataField("enabled"), ViewVariables(VVAccess.ReadWrite)]
+ public bool Enabled = true;
+}
diff --git a/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs
new file mode 100644
index 00000000000..f900603f01d
--- /dev/null
+++ b/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs
@@ -0,0 +1,15 @@
+namespace Content.Shared.Language.Components.Translators;
+
+///
+/// A translator that must be held in a hand or a pocket of an entity in order ot have effect.
+///
+[RegisterComponent]
+public sealed partial class HandheldTranslatorComponent : Translators.BaseTranslatorComponent
+{
+ ///
+ /// Whether or not interacting with this translator
+ /// toggles it on or off.
+ ///
+ [DataField("toggleOnInteract")]
+ public bool ToggleOnInteract = true;
+}
diff --git a/Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs
new file mode 100644
index 00000000000..caea9b9a948
--- /dev/null
+++ b/Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs
@@ -0,0 +1,11 @@
+namespace Content.Shared.Language.Components.Translators;
+
+///
+/// Applied internally to the holder of [HandheldTranslatorComponent].
+/// Do not use directly. Use [HandheldTranslatorComponent] instead.
+///
+[RegisterComponent]
+public sealed partial class HoldsTranslatorComponent : IntrinsicTranslatorComponent
+{
+ public Component? Issuer = null;
+}
diff --git a/Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs
new file mode 100644
index 00000000000..d1d72e83ed7
--- /dev/null
+++ b/Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs
@@ -0,0 +1,9 @@
+namespace Content.Shared.Language.Components.Translators;
+
+///
+/// Applied to entities who were injected with a translator implant.
+///
+[RegisterComponent]
+public sealed partial class ImplantedTranslatorComponent : IntrinsicTranslatorComponent
+{
+}
diff --git a/Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs
new file mode 100644
index 00000000000..d8def4ac1de
--- /dev/null
+++ b/Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs
@@ -0,0 +1,10 @@
+namespace Content.Shared.Language.Components.Translators;
+
+///
+/// A translator attached to an entity that translates its speech.
+/// An example is a translator implant that allows the speaker to speak another language.
+///
+[RegisterComponent, Virtual]
+public partial class IntrinsicTranslatorComponent : Translators.BaseTranslatorComponent
+{
+}
diff --git a/Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs b/Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs
new file mode 100644
index 00000000000..6f5ad1178b8
--- /dev/null
+++ b/Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs
@@ -0,0 +1,11 @@
+namespace Content.Shared.Language.Components;
+
+//
+// Signifies that this entity can speak and understand any language.
+// Applies to such entities as ghosts.
+//
+[RegisterComponent]
+public sealed partial class UniversalLanguageSpeakerComponent : Component
+{
+
+}
diff --git a/Content.Shared/Language/Events/LanguagesSetMessage.cs b/Content.Shared/Language/Events/LanguagesSetMessage.cs
new file mode 100644
index 00000000000..f7a78210aaf
--- /dev/null
+++ b/Content.Shared/Language/Events/LanguagesSetMessage.cs
@@ -0,0 +1,13 @@
+using Robust.Shared.Serialization;
+
+namespace Content.Shared.Language.Events;
+
+///
+/// Sent from the client to the server when it needs to want to set his currentLangauge.
+/// Yeah im using this instead of ExecuteCommand... Better right?
+///
+[Serializable, NetSerializable]
+public sealed class LanguagesSetMessage(string currentLanguage) : EntityEventArgs
+{
+ public string CurrentLanguage = currentLanguage;
+}
diff --git a/Content.Shared/Language/Events/LanguagesUpdateEvent.cs b/Content.Shared/Language/Events/LanguagesUpdateEvent.cs
new file mode 100644
index 00000000000..90ce2f4446b
--- /dev/null
+++ b/Content.Shared/Language/Events/LanguagesUpdateEvent.cs
@@ -0,0 +1,8 @@
+namespace Content.Shared.Language.Events;
+
+///
+/// Raised on an entity when its list of languages changes.
+///
+public sealed class LanguagesUpdateEvent : EntityEventArgs
+{
+}
diff --git a/Content.Shared/Language/Events/LanguagesUpdatedMessage.cs b/Content.Shared/Language/Events/LanguagesUpdatedMessage.cs
new file mode 100644
index 00000000000..563f036df6d
--- /dev/null
+++ b/Content.Shared/Language/Events/LanguagesUpdatedMessage.cs
@@ -0,0 +1,15 @@
+using Robust.Shared.Serialization;
+
+namespace Content.Shared.Language.Events;
+
+///
+/// Sent to the client when its list of languages changes.
+/// The client should in turn update its HUD and relevant systems.
+///
+[Serializable, NetSerializable]
+public sealed class LanguagesUpdatedMessage(string currentLanguage, List spoken, List understood) : EntityEventArgs
+{
+ public string CurrentLanguage = currentLanguage;
+ public List Spoken = spoken;
+ public List Understood = understood;
+}
diff --git a/Content.Shared/Language/Events/RequestLanguagesMessage.cs b/Content.Shared/Language/Events/RequestLanguagesMessage.cs
new file mode 100644
index 00000000000..aead1f4cd1a
--- /dev/null
+++ b/Content.Shared/Language/Events/RequestLanguagesMessage.cs
@@ -0,0 +1,10 @@
+using Robust.Shared.Serialization;
+
+namespace Content.Shared.Language.Events;
+
+///
+/// Sent from the client to the server when it needs to learn the list of languages its entity knows.
+/// This event should always be followed by a , unless the client doesn't have an entity.
+///
+[Serializable, NetSerializable]
+public sealed class RequestLanguagesMessage : EntityEventArgs;
diff --git a/Content.Shared/Language/LanguagePrototype.cs b/Content.Shared/Language/LanguagePrototype.cs
new file mode 100644
index 00000000000..801ab8a393b
--- /dev/null
+++ b/Content.Shared/Language/LanguagePrototype.cs
@@ -0,0 +1,37 @@
+using System.Runtime.CompilerServices;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared.Language;
+
+[Prototype("language")]
+public sealed class LanguagePrototype : IPrototype
+{
+ [IdDataField]
+ public string ID { get; private set; } = default!;
+
+ ///
+ /// If true, obfuscated phrases of creatures speaking this language will have their syllables replaced with "replacement" syllables.
+ /// Otherwise entire sentences will be replaced.
+ ///
+ [DataField(required: true)]
+ public bool ObfuscateSyllables;
+
+ ///
+ /// Lists all syllables that are used to obfuscate a message a listener cannot understand if obfuscateSyllables is true.
+ /// Otherwise uses all possible phrases the creature can make when trying to say anything.
+ ///
+ [DataField(required: true)]
+ public List Replacement = [];
+
+ #region utility
+ ///
+ /// The in-world name of this language, localized.
+ ///
+ public string Name => Loc.GetString($"language-{ID}-name");
+
+ ///
+ /// The in-world description of this language, localized.
+ ///
+ public string Description => Loc.GetString($"language-{ID}-description");
+ #endregion utility
+}
diff --git a/Content.Shared/Language/Systems/SharedLanguageSystem.cs b/Content.Shared/Language/Systems/SharedLanguageSystem.cs
new file mode 100644
index 00000000000..e2eeb8bb493
--- /dev/null
+++ b/Content.Shared/Language/Systems/SharedLanguageSystem.cs
@@ -0,0 +1,39 @@
+using Content.Shared.Actions;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Random;
+
+namespace Content.Shared.Language.Systems;
+
+public abstract class SharedLanguageSystem : EntitySystem
+{
+ ///
+ /// The language used as a fallback in cases where an entity suddenly becomes a language speaker (e.g. the usage of make-sentient)
+ ///
+ [ValidatePrototypeId]
+ public static readonly string FallbackLanguagePrototype = "GalacticCommon";
+
+ ///
+ /// The language whose speakers are assumed to understand and speak every language. Should never be added directly.
+ ///
+ [ValidatePrototypeId]
+ public static readonly string UniversalPrototype = "Universal";
+
+ ///
+ /// A cached instance of
+ ///
+ public static LanguagePrototype Universal { get; private set; } = default!;
+
+ [Dependency] protected readonly IPrototypeManager _prototype = default!;
+ [Dependency] protected readonly IRobustRandom _random = default!;
+
+ public override void Initialize()
+ {
+ Universal = _prototype.Index("Universal");
+ }
+
+ public LanguagePrototype? GetLanguagePrototype(string id)
+ {
+ _prototype.TryIndex(id, out var proto);
+ return proto;
+ }
+}
diff --git a/Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs b/Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs
new file mode 100644
index 00000000000..a13225378cd
--- /dev/null
+++ b/Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs
@@ -0,0 +1,36 @@
+using Content.Shared.Examine;
+using Content.Shared.Implants.Components;
+using Content.Shared.Language.Components;
+using Robust.Shared.Serialization;
+
+namespace Content.Shared.Language.Systems;
+
+public abstract class SharedTranslatorImplanterSystem : EntitySystem
+{
+ [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnExamined);
+ }
+
+ private void OnExamined(EntityUid uid, TranslatorImplanterComponent component, ExaminedEvent args)
+ {
+ if (!args.IsInDetailsRange)
+ return;
+
+ var text = !component.Used
+ ? Loc.GetString("translator-implanter-ready")
+ : Loc.GetString("translator-implanter-used");
+
+ args.PushText(text);
+ }
+
+ protected void OnAppearanceChange(EntityUid implanter, TranslatorImplanterComponent component)
+ {
+ var used = component.Used;
+ _appearance.SetData(implanter, ImplanterVisuals.Full, !used);
+ }
+}
diff --git a/Content.Shared/Language/Systems/SharedTranslatorSystem.cs b/Content.Shared/Language/Systems/SharedTranslatorSystem.cs
new file mode 100644
index 00000000000..08a016efa9c
--- /dev/null
+++ b/Content.Shared/Language/Systems/SharedTranslatorSystem.cs
@@ -0,0 +1,34 @@
+using Content.Shared.Examine;
+using Content.Shared.Toggleable;
+using Content.Shared.Language.Components.Translators;
+
+namespace Content.Shared.Language.Systems;
+
+public abstract class SharedTranslatorSystem : EntitySystem
+{
+ [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnExamined);
+ }
+
+ private void OnExamined(EntityUid uid, HandheldTranslatorComponent component, ExaminedEvent args)
+ {
+ var state = Loc.GetString(component.Enabled
+ ? "translator-enabled"
+ : "translator-disabled");
+
+ args.PushMarkup(state);
+ }
+
+ protected void OnAppearanceChange(EntityUid translator, HandheldTranslatorComponent? comp = null)
+ {
+ if (comp == null && !TryComp(translator, out comp))
+ return;
+
+ _appearance.SetData(translator, ToggleVisuals.Toggled, comp.Enabled);
+ }
+}
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index fc0b5c906c7..1f876cf9a7f 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -4118,3 +4118,51 @@ Entries:
message: New Tools Sprites!
id: 6115
time: '2024-05-29T01:06:42.0000000+00:00'
+- author: FoxxoTrystan
+ changes:
+ - type: Tweak
+ message: Resprited gas canisters
+ - type: Tweak
+ message: Resprited gas tanks
+ id: 6116
+ time: '2024-05-31T00:13:45.0000000+00:00'
+- author: LovelyLophi
+ changes:
+ - type: Add
+ message: Added five new coats
+ - type: Add
+ message: Added loadouts
+ - type: Fix
+ message: Fixed the coat handhole
+ id: 6117
+ time: '2024-06-02T00:36:59.0000000+00:00'
+- author: FoxxoTrystan
+ changes:
+ - type: Tweak
+ message: Floors Looks Updated/Resprited.
+ id: 6118
+ time: '2024-06-03T19:23:51.0000000+00:00'
+- author: FoxxoTrystan
+ changes:
+ - type: Add
+ message: All species can now bring their own cultures and languages
+ id: 6119
+ time: '2024-06-10T20:48:48.0000000+00:00'
+- author: FoxxoTrystan
+ changes:
+ - type: Tweak
+ message: Rust Walls Sprites.
+ - type: Tweak
+ message: Armor, Bulletproof, Riot Suit Resprites.
+ - type: Tweak
+ message: New Banners Sprites.
+ - type: Tweak
+ message: Stunbaton, Fire Extinguisher New Sprites.
+ - type: Tweak
+ message: Rack/WallScreen resprites.
+ - type: Tweak
+ message: Stock Parts new sprites!
+ - type: Tweak
+ message: Radiation Collector has now a new sprite!
+ id: 6120
+ time: '2024-06-11T00:34:02.0000000+00:00'
diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt
index db58663a2b2..8c54ecb084d 100644
--- a/Resources/Credits/GitHub.txt
+++ b/Resources/Credits/GitHub.txt
@@ -1 +1 @@
-0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, 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, 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, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, Subversionary, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, 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, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, 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, 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, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem
diff --git a/Resources/Locale/en-US/language/commands.ftl b/Resources/Locale/en-US/language/commands.ftl
new file mode 100644
index 00000000000..32fa5415b8c
--- /dev/null
+++ b/Resources/Locale/en-US/language/commands.ftl
@@ -0,0 +1,8 @@
+command-list-langs-desc = List languages your current entity can speak at the current moment.
+command-list-langs-help = Usage: {$command}
+
+command-saylang-desc = Send a message in a specific language.
+command-saylang-help = Usage: {$command} . Example: {$command} GalacticCommon "Hello World!"
+
+command-language-select-desc = Select the currently spoken language of your entity.
+command-language-select-help = Usage: {$command} . Example: {$command} GalacticCommon
diff --git a/Resources/Locale/en-US/language/language-menu.ftl b/Resources/Locale/en-US/language/language-menu.ftl
new file mode 100644
index 00000000000..83687d0f1a6
--- /dev/null
+++ b/Resources/Locale/en-US/language/language-menu.ftl
@@ -0,0 +1,4 @@
+language-menu-window-title = Language Menu
+language-menu-current-language = Current Language: {$language}
+language-menu-description-header = Description
+ui-options-function-open-language-menu = Open language Menu
diff --git a/Resources/Locale/en-US/language/languages.ftl b/Resources/Locale/en-US/language/languages.ftl
new file mode 100644
index 00000000000..69c5d0a4a76
--- /dev/null
+++ b/Resources/Locale/en-US/language/languages.ftl
@@ -0,0 +1,71 @@
+language-Universal-name = Universal
+language-Universal-description = What are you?
+
+language-GalacticCommon-name = Galactic common
+language-GalacticCommon-description = The standard Galatic language, most commonly used for inter-species communications and legal work.
+
+language-Bubblish-name = Bubblish
+language-Bubblish-description = The language of Slimes. Being a mixture of bubbling noises and pops it's very difficult to speak for humans without the use of mechanical aids.
+
+language-RootSpeak-name = Rootspeak
+language-RootSpeak-description = The strange whistling-style language spoken by the Diona.
+
+language-Nekomimetic-name = Nekomimetic
+language-Nekomimetic-description = To the casual observer, this language is an incomprehensible mess of broken Japanese. To the felinids, it's somehow comprehensible.
+
+language-Draconic-name = Draconic
+language-Draconic-description = The common language of lizard-people, composed of sibilant hisses and rattles.
+
+language-SolCommon-name = Sol common
+language-SolCommon-description = The language common to species from the Sol System.
+
+language-Canilunzt-name = Canilunzt
+language-Canilunzt-description = The guttural language spoken and utilized by the inhabitants of the Vazzend system, composed of growls, barks, yaps, and heavy utilization of ears and tail movements. Vulpkanin speak this language with ease.
+
+language-Moffic-name = Moffic
+language-Moffic-description = The language of the mothpeople borders on complete unintelligibility.
+
+language-RobotTalk-name = RobotTalk
+language-RobotTalk-description = A language consisting of harsh binary chirps, whistles, hisses, and whines. Organic tongues cannot speak it without aid from special translators.
+
+language-Cat-name = Cat
+language-Cat-description = Meow
+
+language-Dog-name = Dog
+language-Dog-description = Bark!
+
+language-Fox-name = Fox
+language-Fox-description = Yeeps!
+
+language-Xeno-name = Xeno
+language-Xeno-description = Sssss!
+
+language-Monkey-name = Monkey
+language-Monkey-description = oooook!
+
+language-Mouse-name = Mouse
+language-Mouse-description = Squeeek!
+
+language-Chicken-name = Chicken
+language-Chicken-description = Coot!
+
+language-Duck-name = Duck
+language-Duck-description = Quack!
+
+language-Cow-name = Cow
+language-Cow-description = Moooo!
+
+language-Sheep-name = Sheep
+language-Sheep-description = Baaah!
+
+language-Kangaroo-name = Kangaroo
+language-Kangaroo-description = Chuu!
+
+language-Pig-name = Pig
+language-Pig-description = Oink!
+
+language-Crab-name = Crab
+language-Crab-description = Click!
+
+language-Kobold-name = Kobold
+language-Kobold-description = Hiss!
diff --git a/Resources/Locale/en-US/language/technologies.ftl b/Resources/Locale/en-US/language/technologies.ftl
new file mode 100644
index 00000000000..901a48061c5
--- /dev/null
+++ b/Resources/Locale/en-US/language/technologies.ftl
@@ -0,0 +1,2 @@
+research-technology-basic-translation = Basic Translation
+research-technology-advanced-translation = Advanced Translation
diff --git a/Resources/Locale/en-US/language/translator.ftl b/Resources/Locale/en-US/language/translator.ftl
new file mode 100644
index 00000000000..b2a1e9b2b8c
--- /dev/null
+++ b/Resources/Locale/en-US/language/translator.ftl
@@ -0,0 +1,8 @@
+translator-component-shutoff = The {$translator} shuts off.
+translator-component-turnon = The {$translator} turns on.
+translator-enabled = It appears to be active.
+translator-disabled = It appears to be disabled.
+translator-implanter-refuse = The {$implanter} has no effect on {$target}.
+translator-implanter-success = The {$implanter} successfully injected {$target}.
+translator-implanter-ready = This implanter appears to be ready to use.
+translator-implanter-used = This implanter seems empty.
diff --git a/Resources/Locale/en-US/speech/speech-chatsan.ftl b/Resources/Locale/en-US/speech/speech-chatsan.ftl
index 4c8cf5db54c..6ce575e648d 100644
--- a/Resources/Locale/en-US/speech/speech-chatsan.ftl
+++ b/Resources/Locale/en-US/speech/speech-chatsan.ftl
@@ -114,3 +114,6 @@ chatsan-replacement-41 = what are you doing
chatsan-word-42 = ofc
chatsan-replacement-42 = of course
+
+chatsan-word-43 = ig
+chatsan-replacement-43 = i guess
diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl
index c097a689dd8..7a3564edf66 100644
--- a/Resources/Locale/en-US/traits/traits.ftl
+++ b/Resources/Locale/en-US/traits/traits.ftl
@@ -29,3 +29,6 @@ trait-frontal-lisp-desc = You thpeak with a lithp
trait-socialanxiety-name = Social Anxiety
trait-socialanxiety-desc = You are anxious when you speak and stutter.
+
+trait-snoring-name = Snoring
+trait-snoring-desc = You will snore while sleeping.
diff --git a/Resources/Maps/Shuttles/cargo.yml b/Resources/Maps/Shuttles/cargo.yml
index 3b9953d94cf..8a3007dd9c4 100644
--- a/Resources/Maps/Shuttles/cargo.yml
+++ b/Resources/Maps/Shuttles/cargo.yml
@@ -3,11 +3,11 @@ meta:
postmapinit: false
tilemap:
0: Space
- 81: FloorShuttleBlue
- 85: FloorShuttleWhite
- 89: FloorSteel
- 104: FloorTechMaint
- 121: Plating
+ 84: FloorShuttleBlue
+ 89: FloorShuttleWhite
+ 93: FloorSteel
+ 108: FloorTechMaint
+ 126: Plating
entities:
- proto: ""
entities:
@@ -22,19 +22,19 @@ entities:
chunks:
-1,0:
ind: -1,0
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAVQAAAAAAUQAAAAAAVQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAUQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAWQAAAAAAVAAAAAAAWQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAVAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
0,0:
ind: 0,0
- tiles: WQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: XQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
-1,-1:
ind: -1,-1
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAA
version: 6
0,-1:
ind: 0,-1
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
- type: Broadphase
- type: Physics
@@ -107,98 +107,34 @@ entities:
data:
tiles:
-2,-1:
- 0: 34816
- 1: 17612
- -1,-3:
- 0: 480
- 1: 65024
+ 0: 52428
-1,-1:
- 0: 17
- 1: 65518
+ 0: 65535
-1,-2:
- 1: 65535
+ 0: 61440
-2,1:
- 0: 34944
- 1: 17484
+ 0: 52428
-1,0:
- 1: 65535
+ 0: 65535
-1,1:
- 0: 4096
- 1: 59647
- 2: 512
- 3: 1024
- 4: 256
+ 0: 65535
-1,2:
- 5: 1
- 6: 16
- 7: 4
- 8: 64
- 1: 61066
- 9: 32
- -1,3:
- 0: 546
- 1: 52428
- 0,-3:
- 0: 240
- 1: 65280
- 0,-2:
- 1: 65535
+ 0: 255
0,-1:
- 1: 65535
- 1,-3:
- 0: 528
- 1: 12544
- 1,-2:
- 1: 13107
- 1,-1:
- 0: 17442
- 1: 4369
+ 0: 4369
0,1:
- 1: 65535
+ 0: 4369
0,2:
- 1: 65535
- 0,3:
- 1: 65535
+ 0: 1
0,0:
- 1: 65535
- 1,3:
- 0: 273
- 1,0:
- 1: 30583
- 1,1:
- 0: 25664
- 1: 4375
- 1,2:
- 0: 34
- 1: 4369
- 0,4:
- 0: 120
- 1: 7
- -1,4:
- 0: 132
- 1: 8
+ 0: 4369
-2,0:
- 1: 52428
+ 0: 52428
-2,2:
- 1: 140
+ 0: 140
-2,-2:
- 1: 32768
+ 0: 32768
uniqueMixes:
- - volume: 2500
- immutable: True
- moles:
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- volume: 2500
temperature: 293.15
moles:
@@ -214,126 +150,6 @@ entities:
- 0
- 0
- 0
- - volume: 2500
- temperature: 268.94583
- moles:
- - 20.00614
- - 75.26119
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 285.08194
- moles:
- - 21.218632
- - 79.82248
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 196.33333
- moles:
- - 14.549919
- - 54.735413
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 147.92499
- moles:
- - 10.912439
- - 41.05156
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 184.23123
- moles:
- - 13.64055
- - 51.31445
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 291.44815
- moles:
- - 21.696999
- - 81.62205
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 286.34256
- moles:
- - 21.313358
- - 80.178825
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 265.9203
- moles:
- - 19.778797
- - 74.40595
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
chunkSize: 4
- type: OccluderTree
- type: Shuttle
diff --git a/Resources/Maps/Shuttles/emergency.yml b/Resources/Maps/Shuttles/emergency.yml
index eeb7048141d..20cd9230554 100644
--- a/Resources/Maps/Shuttles/emergency.yml
+++ b/Resources/Maps/Shuttles/emergency.yml
@@ -3,13 +3,13 @@ meta:
postmapinit: false
tilemap:
0: Space
- 29: FloorDark
- 77: FloorReinforced
- 89: FloorSteel
- 104: FloorTechMaint
- 108: FloorWhite
- 120: Lattice
- 121: Plating
+ 31: FloorDark
+ 79: FloorReinforced
+ 93: FloorSteel
+ 108: FloorTechMaint
+ 112: FloorWhite
+ 125: Lattice
+ 126: Plating
entities:
- proto: ""
entities:
@@ -24,19 +24,19 @@ entities:
chunks:
-1,0:
ind: -1,0
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAfgAAAAAAfgAAAAAAbAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAfgAAAAAAfgAAAAAAcAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAfgAAAAAAcAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAXQAAAAAAXQAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAXQAAAAAAXQAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
-1,-1:
ind: -1,-1
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAbAAAAAAAbAAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAbAAAAAAAbAAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAbAAAAAAAbAAAAAAAfgAAAAAAfgAAAAAA
version: 6
0,-1:
ind: 0,-1
- tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
0,0:
ind: 0,0
- tiles: HQAAAAAAHQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAHQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAHQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAHQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ tiles: HwAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAXQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
- type: Broadphase
- type: Physics
@@ -135,97 +135,41 @@ entities:
data:
tiles:
-2,-1:
- 0: 32703
- 1: 32768
- 2: 64
- -1,-3:
- 1: 480
- 0: 65024
+ 0: 65535
-1,-1:
- 0: 61439
- 2: 4096
- -1,-2:
0: 65535
+ -1,-2:
+ 0: 65280
-2,1:
0: 65535
-1,0:
0: 65535
-1,1:
- 2: 4096
- 0: 61439
+ 0: 65535
-1,2:
0: 65535
-1,3:
- 1: 34
- 3: 512
- 0: 49373
- 4: 2048
- 5: 1024
- 6: 256
- 0,-3:
- 1: 240
- 0: 65280
+ 0: 4095
0,-2:
- 0: 65535
+ 0: 29440
0,-1:
- 0: 65519
- 2: 16
- 1,-3:
- 1: 528
- 0: 12544
- 1,-2:
- 0: 13107
- 1,-1:
- 1: 17442
- 0: 4369
+ 0: 30583
0,1:
- 0: 65535
+ 0: 30583
0,2:
- 2: 1
- 0: 65502
- 7: 32
+ 0: 30583
0,3:
- 0: 65229
- 8: 16
- 9: 256
- 10: 2
- 11: 32
+ 0: 311
0,0:
- 0: 65535
- 1,3:
- 1: 273
- 1,0:
0: 30583
- 1,1:
- 1: 25664
- 0: 4375
- 1,2:
- 1: 34
- 0: 4369
- 0,4:
- 1: 120
- 0: 7
- -1,4:
- 1: 132
- 0: 8
-2,0:
- 0: 61167
- 12: 16
- 13: 256
- 14: 4096
+ 0: 65535
-2,2:
- 0: 65499
- 7: 32
- 2: 4
+ 0: 65535
-2,3:
- 0: 143
- 15: 32
- 16: 64
- 17: 1024
- 18: 2048
+ 0: 3311
-2,-2:
- 0: 64256
- 19: 1024
+ 0: 65024
uniqueMixes:
- volume: 2500
temperature: 293.15
@@ -242,291 +186,6 @@ entities:
- 0
- 0
- 0
- - volume: 2500
- immutable: True
- moles:
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 293.15
- moles:
- - 20.04244
- - 75.39776
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 122.82263
- moles:
- - 9.026207
- - 33.955734
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 282.50452
- moles:
- - 21.024963
- - 79.0939
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 250.56815
- moles:
- - 18.625212
- - 70.06627
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 192.74052
- moles:
- - 14.27995
- - 53.719814
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 293.15
- moles:
- - 21.213781
- - 79.80423
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 292.48465
- moles:
- - 21.774883
- - 81.91504
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 290.48862
- moles:
- - 21.6249
- - 81.350815
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 293.10843
- moles:
- - 21.821754
- - 82.09136
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 292.98364
- moles:
- - 21.812382
- - 82.0561
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 220.53749
- moles:
- - 16.36866
- - 61.57734
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 202.38438
- moles:
- - 15.004604
- - 56.445892
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 197.84608
- moles:
- - 14.66359
- - 55.163033
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 147.925
- moles:
- - 10.912439
- - 41.05156
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 256.84375
- moles:
- - 19.09677
- - 71.840225
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 138.84843
- moles:
- - 10.230412
- - 38.485836
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 181.96211
- moles:
- - 13.470042
- - 50.67302
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - volume: 2500
- temperature: 220.5375
- moles:
- - 16.36866
- - 61.57734
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
chunkSize: 4
- type: OccluderTree
- type: Shuttle
diff --git a/Resources/Prototypes/Accents/word_replacements.yml b/Resources/Prototypes/Accents/word_replacements.yml
index 147aebb5c5d..92b3d7de9b3 100644
--- a/Resources/Prototypes/Accents/word_replacements.yml
+++ b/Resources/Prototypes/Accents/word_replacements.yml
@@ -1,4 +1,4 @@
-# Accents that work off of word replacements.
+# Accents that work off of word replacements.
# this is kind of dumb but localization demands it.
# i guess you could just specify the prefix ('mobster') and count and let the system fill it
@@ -263,7 +263,7 @@
accent-pirate-replaced-30: accent-pirate-replacement-30
accent-pirate-replaced-31: accent-pirate-replacement-31
accent-pirate-replaced-32: accent-pirate-replacement-32
-
+
- type: accent
id: cowboy
wordReplacements:
@@ -366,7 +366,7 @@
accent-cowboy-words-97: accent-cowboy-replacement-97
accent-cowboy-words-98: accent-cowboy-replacement-98
accent-cowboy-words-99: accent-cowboy-replacement-99
-
+
# For the chat sanitization system
- type: accent
@@ -409,8 +409,9 @@
# chatsan-word-35: chatsan-replacement-35
# chatsan-word-36: chatsan-replacement-36
chatsan-word-37: chatsan-replacement-37
- # chatsan-word-38: chatsan-replacement-38
- # chatsan-word-39: chatsan-replacement-etcetera
- # chatsan-word-40: chatsan-replacement-etcetera
- # chatsan-word-41: chatsan-replacement-41
- # chatsan-word-42: chatsan-replacement-42
+ chatsan-word-38: chatsan-replacement-38
+ chatsan-word-39: chatsan-replacement-etcetera
+ chatsan-word-40: chatsan-replacement-etcetera
+ chatsan-word-41: chatsan-replacement-41
+ chatsan-word-42: chatsan-replacement-42
+ chatsan-word-43: chatsan-replacement-43
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml
index 04cc2e3e19d..2c4c27137f0 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml
@@ -86,10 +86,15 @@
ClothingOuterDenimJacket: 2 # DeltaV - Clothing addition
ClothingOuterCorporateJacket: 2 # DeltaV - Clothing addition
ClothingOuterCsCorporateJacket: 2 # Einstein Engines - Clothing addition
- ClothingOuterEECorporateJacket: 2 # Einstein Engines - Clothing addition
- ClothingOuterHICorporateJacket: 2 # Einstein Engines - Clothing addition
- ClothingOuterHMCorporateJacket: 2 # Einstein Engines - Clothing addition
+ ClothingOuterEeCorporateJacket: 2 # Einstein Engines - Clothing addition
+ ClothingOuterHiCorporateJacket: 2 # Einstein Engines - Clothing addition
+ ClothingOuterHmCorporateJacket: 2 # Einstein Engines - Clothing addition
ClothingOuterIdCorporateJacket: 2 # Einstein Engines - Clothing addition
+ ClothingOuterZhCorporateJacket: 2 # Einstein Engines - Clothing addition
+ ClothingOuterGeCorporateJacket: 2 # Einstein Engines - Clothing addition
+ ClothingOuterFaCorporateJacket: 2 # Einstein Engines - Clothing addition
+ ClothingOuterDdCorporateJacket: 2 # Einstein Engines - Clothing addition
+ ClothingOuterBcCorporateJacket: 2 # Einstein Engines - Clothing addition
ClothingShoesBootsFishing: 2 # Nyano - Clothing addition
ClothingHeadTinfoil: 2 # Nyano - Clothing addition
ClothingHeadFishCap: 2
diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml
index 92615131f05..e932974a0f4 100644
--- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml
+++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml
@@ -66,6 +66,11 @@
- type: Tag
tags:
- VimPilot
+ - type: LanguageSpeaker
+ speaks:
+ - Fox
+ understands:
+ - Fox
- type: entity
name: security dog
@@ -154,8 +159,6 @@
spawned:
- id: FoodMeat
amount: 2
- - type: ReplacementAccent
- accent: dog
- type: InteractionPopup
successChance: 0.5
interactSuccessString: petting-success-dog
@@ -176,3 +179,9 @@
tags:
- DoorBumpOpener
- VimPilot
+ - type: LanguageSpeaker
+ speaks:
+ - Dog
+ understands:
+ - Dog
+ - GalacticCommon
diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml
index 771da36719f..fa51b99325c 100644
--- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml
+++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml
@@ -95,6 +95,11 @@
factions:
- PsionicInterloper
- NanoTrasen
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ understands:
+ - GalacticCommon
- type: GhostTakeoverAvailable
- type: GhostRole
makeSentient: true
diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml
index 96950317c1f..c2ae33ec0ba 100644
--- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml
+++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml
@@ -96,8 +96,12 @@
spawned:
- id: FoodMeat
amount: 1
- - type: ReplacementAccent
- accent: mouse
+ - type: LanguageSpeaker
+ speaks:
+ - Mouse
+ understands:
+ - Mouse
+ - GalacticCommon
- type: Tag
tags:
- VimPilot
@@ -163,4 +167,4 @@
interactFailureString: petting-failure-nukie-mouse
interactSuccessSpawn: EffectHearts
interactSuccessSound:
- path: /Audio/Animals/mouse_squeak.ogg
\ No newline at end of file
+ path: /Audio/Animals/mouse_squeak.ogg
diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml
index a4498299c9a..18437e074dd 100644
--- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml
+++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml
@@ -122,12 +122,19 @@
- type: MovementSpeedModifier
baseWalkSpeed: 2.5
baseSprintSpeed: 5.0
- - type: Inventory
+ - type: Inventory
speciesId: harpy
templateId: digitigrade
- type: HarpyVisuals
- type: UltraVision
-
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ - SolCommon
+ understands:
+ - GalacticCommon
+ - SolCommon
+
- type: entity
save: false
name: Urist McHands
@@ -138,7 +145,7 @@
components:
- type: HumanoidAppearance
species: Harpy
- - type: Inventory
+ - type: Inventory
speciesId: harpy
- type: Sprite
scale: 0.9, 0.9
diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml
index 4a187d51b33..52853d696a2 100644
--- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml
+++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml
@@ -97,6 +97,13 @@
Female: FemaleVulpkanin
Unsexed: MaleVulpkanin
- type: DogVision
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ - Canilunzt
+ understands:
+ - GalacticCommon
+ - Canilunzt
- type: entity
save: false
diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml
index d45e8c3f3c2..f3610178b9e 100644
--- a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml
+++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml
@@ -32,7 +32,7 @@
- ClothMade
- WhitelistChameleon
- type: StaticPrice
- price: 70
+ price: 50
- type: entity
parent: ClothingOuterWinterCoat
@@ -555,7 +555,7 @@
- type: entity
parent: ClothingOuterWinterCoat
- id: ClothingOuterEECorporateJacket
+ id: ClothingOuterEeCorporateJacket
name: Einstein Engines Corporate Jacket
description: A cozy jacket with the Einstein Engines logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven.
components:
@@ -566,7 +566,7 @@
- type: entity
parent: ClothingOuterWinterCoat
- id: ClothingOuterHICorporateJacket
+ id: ClothingOuterHiCorporateJacket
name: Hephaestus Industries Corporate Jacket
description: A cozy jacket with the Hephaestus Industries logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven.
components:
@@ -577,7 +577,7 @@
- type: entity
parent: ClothingOuterWinterCoat
- id: ClothingOuterHMCorporateJacket
+ id: ClothingOuterHmCorporateJacket
name: Hawkmoon Acquisitions Corporate Jacket
description: A cozy jacket with the Hawkmoon Acquisitions logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven.
components:
@@ -596,3 +596,58 @@
sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi
- type: Clothing
sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi
+
+- type: entity
+ parent: ClothingOuterWinterCoat
+ id: ClothingOuterBcCorporateJacket
+ name: Bishop Cybernetics Corporate Jacket
+ description: A cozy jacket with the Bishop Cybernetics logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven.
+ components:
+ - type: Sprite
+ sprite: Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi
+ - type: Clothing
+ sprite: Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi
+
+- type: entity
+ parent: ClothingOuterWinterCoat
+ id: ClothingOuterDdCorporateJacket
+ name: Discount Dan's Corporate Jacket
+ description: A cozy jacket with the Discount Dan's logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven.
+ components:
+ - type: Sprite
+ sprite: Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi
+ - type: Clothing
+ sprite: Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi
+
+- type: entity
+ parent: ClothingOuterWinterCoat
+ id: ClothingOuterFaCorporateJacket
+ name: Five Points Armory Corporate Jacket
+ description: A cozy jacket with the Five Points Armory logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven.
+ components:
+ - type: Sprite
+ sprite: Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi
+ - type: Clothing
+ sprite: Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi
+
+- type: entity
+ parent: ClothingOuterWinterCoat
+ id: ClothingOuterGeCorporateJacket
+ name: Gilthari Exports Corporate Jacket
+ description: A cozy jacket with the Gilthari Exports logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven.
+ components:
+ - type: Sprite
+ sprite: Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi
+ - type: Clothing
+ sprite: Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi
+
+- type: entity
+ parent: ClothingOuterWinterCoat
+ id: ClothingOuterZhCorporateJacket
+ name: Zeng-Hu Pharmaceuticals Corporate Jacket
+ description: A cozy jacket with the Zeng-Hu Pharmaceuticals logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven.
+ components:
+ - type: Sprite
+ sprite: Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi
+ - type: Clothing
+ sprite: Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi
diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml b/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml
index ee1708caef6..d1f6e083f40 100644
--- a/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml
+++ b/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml
@@ -47,6 +47,9 @@
collection: FootstepDuck
params:
variation: 0.07
+ - type: Construction
+ graph: ClothingShoeSlippersDuck
+ node: shoes
- type: entity
parent: ClothingShoesBaseButcherable
diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml
index dec46df0b53..0645e451af2 100644
--- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml
+++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml
@@ -213,6 +213,13 @@
visMask:
- PsionicInvisibility
- Normal
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ - RobotTalk
+ understands:
+ - GalacticCommon
+ - RobotTalk
- type: entity
id: BaseBorgChassisNT
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml
index d28bc4550a6..24ae121f6db 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml
@@ -48,8 +48,11 @@
flavorKind: station-event-random-sentience-flavor-organic
- type: Bloodstream
bloodMaxVolume: 50
- - type: ReplacementAccent
- accent: mouse
+ - type: LanguageSpeaker
+ speaks:
+ - Mouse
+ understands:
+ - Mouse
- type: MeleeWeapon
soundHit:
path: /Audio/Effects/bite.ogg
@@ -229,8 +232,11 @@
- type: EggLayer
eggSpawn:
- id: FoodEgg
- - type: ReplacementAccent
- accent: chicken
+ - type: LanguageSpeaker
+ speaks:
+ - Chicken
+ understands:
+ - Chicken
- type: SentienceTarget
flavorKind: station-event-random-sentience-flavor-organic
- type: NpcFactionMember
@@ -504,8 +510,11 @@
prob: 0.5
- type: Extractable
grindableSolutionName: food
- - type: ReplacementAccent
- accent: mothroach
+ - type: LanguageSpeaker
+ speaks:
+ - Moffic
+ understands:
+ - Moffic
- type: ZombieAccentOverride
accent: zombieMoth
- type: Vocal
@@ -601,8 +610,11 @@
- type: EggLayer
eggSpawn:
- id: FoodEgg
- - type: ReplacementAccent
- accent: duck
+ - type: LanguageSpeaker
+ speaks:
+ - Duck
+ understands:
+ - Duck
- type: SentienceTarget
flavorKind: station-event-random-sentience-flavor-organic
- type: NpcFactionMember
@@ -839,8 +851,11 @@
interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Voice/Arachnid/arachnid_chitter.ogg
- - type: ReplacementAccent
- accent: crab
+ - type: LanguageSpeaker
+ speaks:
+ - Crab
+ understands:
+ - Crab
- type: Bloodstream
bloodMaxVolume: 50
bloodReagent: CopperBlood
@@ -1076,8 +1091,11 @@
- type: Inventory
speciesId: kangaroo
templateId: kangaroo
- - type: ReplacementAccent
- accent: kangaroo
+ - type: LanguageSpeaker
+ speaks:
+ - Kangaroo
+ understands:
+ - Kangaroo
- type: InventorySlots
- type: Strippable
- type: Butcherable
@@ -1266,7 +1284,12 @@
- type: Speech
speechSounds: Monkey
speechVerb: Monkey
- - type: MonkeyAccent
+ - type: LanguageSpeaker
+ speaks:
+ - Monkey
+ understands:
+ - Monkey
+ - Kobold
- type: SentienceTarget
flavorKind: station-event-random-sentience-flavor-primate
- type: AlwaysRevolutionaryConvertible
@@ -1300,7 +1323,13 @@
- type: Speech
speechSounds: Monkey
speechVerb: Monkey
- - type: MonkeyAccent
+ - type: LanguageSpeaker
+ speaks:
+ - Monkey
+ understands:
+ - Monkey
+ - Kobold
+ - GalacticCommon
- type: NpcFactionMember
factions:
- Syndicate
@@ -1339,8 +1368,12 @@
- type: NameIdentifier
group: Kobold
- type: LizardAccent
- - type: ReplacementAccent
- accent: kobold
+ - type: LanguageSpeaker
+ speaks:
+ - Kobold
+ understands:
+ - Kobold
+ - Monkey
- type: Speech
speechSounds: Lizard
speechVerb: Reptilian
@@ -1568,8 +1601,11 @@
spawned:
- id: FoodMeatRat
amount: 1
- - type: ReplacementAccent
- accent: mouse
+ - type: LanguageSpeaker
+ speaks:
+ - Mouse
+ understands:
+ - Mouse
- type: Tag
tags:
- Trash
@@ -1894,6 +1930,11 @@
path: /Audio/Animals/parrot_raught.ogg
- type: Bloodstream
bloodMaxVolume: 50
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ understands:
+ - GalacticCommon
- type: entity
name: penguin
@@ -2140,8 +2181,11 @@
- type: MeleeChemicalInjector
transferAmount: 0.75
solution: melee
- - type: ReplacementAccent
- accent: xeno
+ - type: LanguageSpeaker
+ speaks:
+ - Xeno
+ understands:
+ - Xeno
- type: InteractionPopup
successChance: 0.5
interactSuccessString: petting-success-tarantula
@@ -2472,6 +2516,11 @@
- type: Tag
tags:
- VimPilot
+ - type: LanguageSpeaker
+ speaks:
+ - Fox
+ understands:
+ - Fox
- type: entity
name: corgi
@@ -2518,8 +2567,11 @@
spawned:
- id: FoodMeat
amount: 2
- - type: ReplacementAccent
- accent: dog
+ - type: LanguageSpeaker
+ speaks:
+ - Dog
+ understands:
+ - Dog
- type: InteractionPopup
interactSuccessString: petting-success-dog
interactFailureString: petting-failure-generic
@@ -2671,8 +2723,11 @@
spawned:
- id: FoodMeat
amount: 3
- - type: ReplacementAccent
- accent: cat
+ - type: LanguageSpeaker
+ speaks:
+ - Cat
+ understands:
+ - Cat
- type: InteractionPopup
successChance: 0.7
interactSuccessString: petting-success-cat
@@ -2739,6 +2794,12 @@
- type: NpcFactionMember
factions:
- Syndicate
+ - type: LanguageSpeaker
+ speaks:
+ - Xeno
+ understands:
+ - Xeno
+ - GalacticCommon
- type: entity
name: space cat
@@ -3056,8 +3117,11 @@
spawned:
- id: FoodMeat
amount: 1
- - type: ReplacementAccent
- accent: mouse
+ - type: LanguageSpeaker
+ speaks:
+ - Mouse
+ understands:
+ - Mouse
- type: Tag
tags:
- VimPilot
@@ -3163,8 +3227,11 @@
interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/pig_oink.ogg
- - type: ReplacementAccent
- accent: pig
+ - type: LanguageSpeaker
+ speaks:
+ - Pig
+ understands:
+ - Pig
- type: SentienceTarget
flavorKind: station-event-random-sentience-flavor-organic
- type: NpcFactionMember
@@ -3250,6 +3317,12 @@
reformTime: 10
popupText: diona-reform-attempt
reformPrototype: MobDionaReformed
+ - type: LanguageSpeaker
+ speaks:
+ - RootSpeak
+ understands:
+ - GalacticCommon
+ - RootSpeak
- type: entity
parent: MobDionaNymph
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml b/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml
index 39e68b63a78..3bcf8e7a16f 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml
@@ -15,8 +15,11 @@
- type: Sprite
sprite: Mobs/Aliens/Argocyte/argocyte_common.rsi
- type: SolutionContainerManager
- - type: ReplacementAccent
- accent: xeno
+ - type: LanguageSpeaker
+ speaks:
+ - Xeno
+ understands:
+ - Xeno
- type: Bloodstream
bloodReagent: FerrochromicAcid
bloodMaxVolume: 75 #we don't want the map to become pools of blood
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml
index 9981bb8bd92..8ca1b2d2f0e 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml
@@ -36,6 +36,12 @@
- VimPilot
- type: StealTarget
stealGroup: AnimalIan
+ - type: LanguageSpeaker
+ speaks:
+ - Dog
+ understands:
+ - GalacticCommon
+ - Dog
- type: entity
name: Old Ian
@@ -121,6 +127,12 @@
tags:
- CannotSuicide
- VimPilot
+ - type: LanguageSpeaker
+ speaks:
+ - Cat
+ understands:
+ - GalacticCommon
+ - Cat
- type: entity
name: Exception
@@ -139,6 +151,12 @@
tags:
- CannotSuicide
- VimPilot
+ - type: LanguageSpeaker
+ speaks:
+ - Cat
+ understands:
+ - GalacticCommon
+ - Cat
- type: entity
name: Floppa
@@ -288,8 +306,12 @@
spawned:
- id: FoodMeat
amount: 2
- - type: ReplacementAccent
- accent: dog
+ - type: LanguageSpeaker
+ speaks:
+ - Dog
+ understands:
+ - GalacticCommon
+ - Dog
- type: InteractionPopup
successChance: 0.5
interactSuccessString: petting-success-dog
@@ -387,8 +409,12 @@
spawned:
- id: FoodMeat
amount: 3
- - type: ReplacementAccent
- accent: dog
+ - type: LanguageSpeaker
+ speaks:
+ - Dog
+ understands:
+ - GalacticCommon
+ - Dog
- type: InteractionPopup
successChance: 0.7
interactSuccessString: petting-success-dog
@@ -546,6 +572,12 @@
- VimPilot
- type: StealTarget
stealGroup: AnimalRenault
+ - type: LanguageSpeaker
+ speaks:
+ - Fox
+ understands:
+ - GalacticCommon
+ - Fox
- type: entity
name: Hamlet
@@ -593,6 +625,12 @@
- CannotSuicide
- Hamster
- VimPilot
+ - type: LanguageSpeaker
+ speaks:
+ - Mouse
+ understands:
+ - GalacticCommon
+ - Mouse
- type: entity
name: Shiva
@@ -765,6 +803,12 @@
attributes:
proper: true
gender: female
+ - type: LanguageSpeaker
+ speaks:
+ - Bubblish
+ understands:
+ - GalacticCommon
+ - Bubblish
- type: entity
name: Pun Pun
@@ -799,6 +843,13 @@
attributes:
proper: true
gender: male
+ - type: LanguageSpeaker
+ speaks:
+ - Monkey
+ understands:
+ - GalacticCommon
+ - Monkey
+ - Kobold
- type: entity
name: Tropico
@@ -826,3 +877,9 @@
# - type: AlwaysRevolutionaryConvertible
- type: StealTarget
stealGroup: AnimalTropico
+ - type: LanguageSpeaker
+ speaks:
+ - Crab
+ understands:
+ - GalacticCommon
+ - Crab
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml
index 89a6f16e525..50fe3b6765e 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml
@@ -119,6 +119,13 @@
attributes:
gender: male
- type: PotentialPsionic # Nyano
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ - Mouse
+ understands:
+ - GalacticCommon
+ - Mouse
- type: entity
id: MobRatKingBuff
@@ -289,6 +296,12 @@
- type: Food
- type: Item
size: Tiny # Delta V - Make them eatable and pickable.
+ - type: LanguageSpeaker
+ speaks:
+ - Mouse
+ understands:
+ - GalacticCommon
+ - Mouse
- type: weightedRandomEntity
id: RatKingLoot
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml
index ec1ed3a58f6..1316aefc50b 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml
@@ -97,6 +97,7 @@
- RevenantTheme
- type: Speech
speechVerb: Ghost
+ - type: UniversalLanguageSpeaker
- type: Tag
tags:
- NoPaint
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml b/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml
index f08fe36544e..9559ae3a0c0 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml
@@ -36,7 +36,7 @@
speedModifierThresholds:
60: 0.7
80: 0.5
-
+
- type: entity
name: shadow cat
parent: BaseShadowMob
@@ -50,8 +50,11 @@
- map: ["enum.DamageStateVisualLayers.Base"]
state: cat
- type: Physics
- - type: ReplacementAccent
- accent: cat
+ - type: LanguageSpeaker
+ speaks:
+ - Cat
+ understands:
+ - Cat
- type: InteractionPopup
successChance: 0.01 # you cant pet shadow cat... almost
interactSuccessString: petting-success-cat
@@ -64,4 +67,4 @@
gender: epicene
- type: Tag
tags:
- - VimPilot
\ No newline at end of file
+ - VimPilot
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml
index 42b7ff9e211..e3166c15f6e 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml
@@ -107,6 +107,13 @@
- type: TypingIndicator
proto: robot
- type: ZombieImmune
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ - RobotTalk
+ understands:
+ - GalacticCommon
+ - RobotTalk
- type: entity
parent: MobSiliconBase
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml
index c64479369a6..901bf149cbc 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml
@@ -111,8 +111,11 @@
successChance: 0.5
interactSuccessString: petting-success-slimes
interactFailureString: petting-failure-generic
- - type: ReplacementAccent
- accent: slimes
+ - type: LanguageSpeaker
+ speaks:
+ - Bubblish
+ understands:
+ - Bubblish
- type: GhostTakeoverAvailable
- type: GhostRole
makeSentient: true
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml
index 0a294805cfd..9ea2d784dbb 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml
@@ -165,8 +165,11 @@
- type: FootstepModifier
footstepSoundCollection:
collection: FootstepBounce
- - type: ReplacementAccent
- accent: kangaroo
+ - type: LanguageSpeaker
+ speaks:
+ - Kangaroo
+ understands:
+ - Kangaroo
- type: InventorySlots
- type: Strippable
- type: UserInterface
@@ -248,8 +251,11 @@
- type: MeleeChemicalInjector
solution: melee
transferAmount: 4
- - type: ReplacementAccent
- accent: xeno
+ - type: LanguageSpeaker
+ speaks:
+ - Xeno
+ understands:
+ - Xeno
- type: InteractionPopup
successChance: 0.20
interactSuccessString: petting-success-tarantula
@@ -351,8 +357,11 @@
- type: MeleeChemicalInjector
solution: melee
transferAmount: 6
- - type: ReplacementAccent
- accent: xeno
+ - type: LanguageSpeaker
+ speaks:
+ - Xeno
+ understands:
+ - Xeno
- type: InteractionPopup
successChance: 0.2
interactSuccessString: petting-success-snake
@@ -373,4 +382,4 @@
parent: MobCobraSpace
suffix: "Salvage Ruleset"
components:
- - type: SalvageMobRestrictions
\ No newline at end of file
+ - type: SalvageMobRestrictions
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml
index d0ac6fc0265..26553a2f1f2 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml
@@ -125,6 +125,11 @@
chance: -2
- type: Psionic #Nyano - Summary: makes psionic by default.
removable: false
+ - type: LanguageSpeaker
+ speaks:
+ - Xeno
+ understands:
+ - Xeno
- type: entity
name: Praetorian
@@ -234,6 +239,13 @@
- type: Tag
tags:
- CannotSuicide
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ - Xeno
+ understands:
+ - GalacticCommon
+ - Xeno
- type: entity
name: Ravager
diff --git a/Resources/Prototypes/Entities/Mobs/Player/observer.yml b/Resources/Prototypes/Entities/Mobs/Player/observer.yml
index 8f3e6c13466..0086be81d9a 100644
--- a/Resources/Prototypes/Entities/Mobs/Player/observer.yml
+++ b/Resources/Prototypes/Entities/Mobs/Player/observer.yml
@@ -53,6 +53,7 @@
- type: Tag
tags:
- BypassInteractionRangeChecks
+ - type: UniversalLanguageSpeaker # Ghosts should understand any language.
- type: entity
id: ActionGhostBoo
diff --git a/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml b/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml
index ad9b37f63e1..07deef857c3 100644
--- a/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml
+++ b/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml
@@ -7,3 +7,4 @@
- type: MovementSpeedModifier
baseSprintSpeed: 24
baseWalkSpeed: 16
+ - type: UniversalLanguageSpeaker
diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml
index a610e04d6dd..67212d416fe 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/base.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml
@@ -141,7 +141,7 @@
- Pacified
- StaminaModifier
- PsionicsDisabled #Nyano - Summary: PCs can have psionics disabled.
- - PsionicallyInsulated #Nyano - Summary: PCs can be made insulated from psionic powers.
+ - PsionicallyInsulated #Nyano - Summary: PCs can be made insulated from psionic powers.
- type: Reflect
enabled: false
reflectProb: 0
@@ -218,7 +218,12 @@
- type: MobPrice
price: 1500 # Kidnapping a living person and selling them for cred is a good move.
deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less.
- - type: CanEscapeInventory # Carrying system from nyanotrasen.
+ - type: CanEscapeInventory # Carrying system from nyanotrasen.
+ - type: LanguageSpeaker # This is here so all with no LanguageSpeaker at least spawn with the default languages.
+ speaks:
+ - GalacticCommon
+ understands:
+ - GalacticCommon
- type: Tag
tags:
- CanPilot
diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml
index 3d405c4dd91..5cb3de6f168 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml
@@ -102,6 +102,13 @@
actionPrototype: DionaGibAction
allowedStates:
- Dead
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ - RootSpeak
+ understands:
+ - GalacticCommon
+ - RootSpeak
- type: entity
parent: BaseSpeciesDummy
diff --git a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml
index fe36754b9b5..7afc5cddd70 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml
@@ -52,6 +52,13 @@
accent: dwarf
- type: Speech
speechSounds: Bass
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ - SolCommon
+ understands:
+ - GalacticCommon
+ - SolCommon
- type: entity
parent: BaseSpeciesDummy
diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml
index 7bf96efe2cc..7c3f857c001 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/human.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml
@@ -17,6 +17,13 @@
- id: FoodMeatHuman
amount: 5
- type: PotentialPsionic #Nyano - Summary: makes potentially psionic.
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ - SolCommon
+ understands:
+ - GalacticCommon
+ - SolCommon
- type: entity
parent: BaseSpeciesDummy
diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml
index 1680dd6cda6..39aa0ab8dea 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml
@@ -23,6 +23,13 @@
accent: zombieMoth
- type: Speech
speechVerb: Moth
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ - Moffic
+ understands:
+ - GalacticCommon
+ - Moffic
- type: TypingIndicator
proto: moth
- type: Butcherable
diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml
index 09e86b19968..bdea4499ed1 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml
@@ -59,6 +59,13 @@
types:
Heat : 1.5 #per second, scales with temperature & other constants
- type: Wagging
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ - Draconic
+ understands:
+ - GalacticCommon
+ - Draconic
- type: entity
parent: BaseSpeciesDummy
diff --git a/Resources/Prototypes/Entities/Mobs/Species/slime.yml b/Resources/Prototypes/Entities/Mobs/Species/slime.yml
index 481afd06a3c..a601010ef94 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/slime.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/slime.yml
@@ -74,6 +74,13 @@
types:
Asphyxiation: -1.0
maxSaturation: 15
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ - Bubblish
+ understands:
+ - GalacticCommon
+ - Bubblish
- type: entity
parent: MobHumanDummy
diff --git a/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml b/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml
new file mode 100644
index 00000000000..fc947efe9a3
--- /dev/null
+++ b/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml
@@ -0,0 +1,132 @@
+- type: entity
+ abstract: true
+ id: BaseTranslatorImplanter
+ parent: [ BaseItem ]
+ name: basic translator implant
+ description: Translates speech.
+ components:
+ - type: Sprite
+ sprite: Objects/Specific/Medical/implanter.rsi
+ state: implanter0
+ layers:
+ - state: implanter1
+ map: [ "implantFull" ]
+ visible: true
+ - state: implanter0
+ map: [ "implantBroken" ]
+ - type: Appearance
+ - type: GenericVisualizer
+ visuals:
+ enum.ImplanterVisuals.Full:
+ implantFull:
+ True: {visible: true}
+ False: {visible: false}
+ implantBroken:
+ True: {visible: false}
+ False: {visible: true}
+
+- type: entity
+ id: BasicGalaticCommonTranslatorImplanter
+ parent: [ BaseTranslatorImplanter ]
+ name: basic Galactic Common translator implant
+ description: An implant giving the ability to understand Galactic Common.
+ components:
+ - type: TranslatorImplanter
+ understood:
+ - GalacticCommon
+
+- type: entity
+ id: AdvancedGalaticCommonTranslatorImplanter
+ parent: [ BaseTranslatorImplanter ]
+ name: advanced Galactic Common translator implant
+ description: An implant giving the ability to understand and speak Galactic Common.
+ components:
+ - type: TranslatorImplanter
+ spoken:
+ - GalacticCommon
+ understood:
+ - GalacticCommon
+
+- type: entity
+ id: BubblishTranslatorImplanter
+ parent: [ BaseTranslatorImplanter ]
+ name: Bubblish translator implant
+ description: An implant giving the ability to understand and speak Bubblish.
+ components:
+ - type: TranslatorImplanter
+ spoken:
+ - Bubblish
+ understood:
+ - Bubblish
+
+- type: entity
+ id: NekomimeticTranslatorImplanter
+ parent: [ BaseTranslatorImplanter ]
+ name: Nekomimetic translator implant
+ description: An implant giving the ability to understand and speak Nekomimetic. Nya~!
+ components:
+ - type: TranslatorImplanter
+ spoken:
+ - Nekomimetic
+ understood:
+ - Nekomimetic
+
+- type: entity
+ id: DraconicTranslatorImplanter
+ parent: [ BaseTranslatorImplanter ]
+ name: Draconic translator implant
+ description: An implant giving the ability to understand and speak Draconic.
+ components:
+ - type: TranslatorImplanter
+ spoken:
+ - Draconic
+ understood:
+ - Draconic
+
+- type: entity
+ id: CanilunztTranslatorImplanter
+ parent: [ BaseTranslatorImplanter ]
+ name: Canilunzt translator implant
+ description: An implant giving the ability to understand and speak Canilunzt. Yeeps!
+ components:
+ - type: TranslatorImplanter
+ spoken:
+ - Canilunzt
+ understood:
+ - Canilunzt
+
+- type: entity
+ id: SolCommonTranslatorImplanter
+ parent: [ BaseTranslatorImplanter ]
+ name: SolCommon translator implant
+ description: An implant giving the ability to understand and speak SolCommon. Raaagh!
+ components:
+ - type: TranslatorImplanter
+ spoken:
+ - SolCommon
+ understood:
+ - SolCommon
+
+- type: entity
+ id: RootSpeakTranslatorImplanter
+ parent: [ BaseTranslatorImplanter ]
+ name: RootSpeak translator implant
+ description: An implant giving the ability to understand and speak RootSpeak.
+ components:
+ - type: TranslatorImplanter
+ spoken:
+ - RootSpeak
+ understood:
+ - RootSpeak
+
+- type: entity
+ id: MofficTranslatorImplanter
+ parent: [ BaseTranslatorImplanter ]
+ name: Moffic translator implant
+ description: An implant giving the ability to understand and speak Moffic.
+ components:
+ - type: TranslatorImplanter
+ spoken:
+ - Moffic
+ understood:
+ - Moffic
diff --git a/Resources/Prototypes/Entities/Objects/Devices/translators.yml b/Resources/Prototypes/Entities/Objects/Devices/translators.yml
new file mode 100644
index 00000000000..e5ad824c5d9
--- /dev/null
+++ b/Resources/Prototypes/Entities/Objects/Devices/translators.yml
@@ -0,0 +1,205 @@
+- type: entity
+ abstract: true
+ id: TranslatorUnpowered
+ parent: [ BaseItem ]
+ name: translator
+ description: Translates speech.
+ components:
+ - type: Sprite
+ sprite: Objects/Devices/translator.rsi
+ state: icon
+ layers:
+ - state: icon
+ - state: translator
+ shader: unshaded
+ visible: false
+ map: [ "enum.ToggleVisuals.Layer", "enum.PowerDeviceVisualLayers.Powered" ]
+ - type: Appearance
+ - type: GenericVisualizer
+ visuals:
+ enum.ToggleVisuals.Toggled:
+ enum.ToggleVisuals.Layer:
+ True: { visible: true }
+ False: { visible: false }
+ - type: HandheldTranslator
+ enabled: false
+
+- type: entity
+ abstract: true
+ id: Translator
+ parent: [ TranslatorUnpowered, PowerCellSlotMediumItem ]
+ suffix: Powered
+ components:
+ - type: PowerCellDraw
+ drawRate: 1
+
+- type: entity
+ abstract: true
+ id: TranslatorEmpty
+ parent: [ Translator ]
+ suffix: Empty
+ components:
+ - type: ItemSlots
+ slots:
+ cell_slot:
+ name: power-cell-slot-component-slot-name-default
+
+
+- type: entity
+ id: CanilunztTranslator
+ parent: [ TranslatorEmpty ]
+ name: Canilunzt translator
+ description: Translates speech between Canilunzt and Galactic Common.
+ components:
+ - type: HandheldTranslator
+ spoken:
+ - GalacticCommon
+ - Canilunzt
+ understood:
+ - GalacticCommon
+ - Canilunzt
+ requires:
+ - GalacticCommon
+ - Canilunzt
+
+- type: entity
+ id: BubblishTranslator
+ parent: [ TranslatorEmpty ]
+ name: Bubblish translator
+ description: Translates speech between Bubblish and Galactic Common.
+ components:
+ - type: HandheldTranslator
+ spoken:
+ - GalacticCommon
+ - Bubblish
+ understood:
+ - GalacticCommon
+ - Bubblish
+ requires:
+ - GalacticCommon
+ - Bubblish
+
+- type: entity
+ id: NekomimeticTranslator
+ parent: [ TranslatorEmpty ]
+ name: Nekomimetic translator
+ description: Translates speech between Nekomimetic and Galactic Common. Why would you want that?
+ components:
+ - type: HandheldTranslator
+ spoken:
+ - GalacticCommon
+ - Nekomimetic
+ understood:
+ - GalacticCommon
+ - Nekomimetic
+ requires:
+ - GalacticCommon
+ - Nekomimetic
+
+- type: entity
+ id: DraconicTranslator
+ parent: [ TranslatorEmpty ]
+ name: Draconic translator
+ description: Translates speech between Draconic and Galactic Common.
+ components:
+ - type: HandheldTranslator
+ spoken:
+ - GalacticCommon
+ - Draconic
+ understood:
+ - GalacticCommon
+ - Draconic
+ requires:
+ - GalacticCommon
+ - Draconic
+
+- type: entity
+ id: SolCommonTranslator
+ parent: [ TranslatorEmpty ]
+ name: Sol Common translator
+ description: Translates speech between Sol Common and Galactic Common. Like a true Earthman!
+ components:
+ - type: HandheldTranslator
+ spoken:
+ - GalacticCommon
+ - SolCommon
+ understood:
+ - GalacticCommon
+ - SolCommon
+ requires:
+ - GalacticCommon
+ - SolCommon
+
+- type: entity
+ id: RootSpeakTranslator
+ parent: [ TranslatorEmpty ]
+ name: RootSpeak translator
+ description: Translates speech between RootSpeak and Galactic Common. Like a true plant?
+ components:
+ - type: HandheldTranslator
+ spoken:
+ - GalacticCommon
+ - RootSpeak
+ understood:
+ - GalacticCommon
+ - RootSpeak
+ requires:
+ - GalacticCommon
+ - RootSpeak
+
+- type: entity
+ id: MofficTranslator
+ parent: [ TranslatorEmpty ]
+ name: Moffic translator
+ description: Translates speech between Moffic and Galactic Common. Like a true moth... or bug?
+ components:
+ - type: HandheldTranslator
+ spoken:
+ - GalacticCommon
+ - Moffic
+ understood:
+ - GalacticCommon
+ - Moffic
+ requires:
+ - GalacticCommon
+ - Moffic
+
+- type: entity
+ id: XenoTranslator
+ parent: [ TranslatorEmpty ]
+ name: Xeno translator
+ description: Translates speech between Xeno and Galactic Common. Not sure if that will help.
+ components:
+ - type: HandheldTranslator
+ spoken:
+ - GalacticCommon
+ - Xeno
+ understood:
+ - GalacticCommon
+ - Xeno
+ requires:
+ - GalacticCommon
+
+- type: entity
+ id: AnimalTranslator
+ parent: [ TranslatorEmpty ]
+ name: Animal translator
+ description: Translates all the cutes noises that animals make into a more understandable form!
+ components:
+ - type: HandheldTranslator
+ understood:
+ - Cat
+ - Dog
+ - Fox
+ - Monkey
+ - Mouse
+ - Chicken
+ - Duck
+ - Cow
+ - Sheep
+ - Kangaroo
+ - Pig
+ - Crab
+ - Kobold
+ requires:
+ - GalacticCommon
diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml
index 6697aa711e0..67c6e1194b7 100644
--- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml
+++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml
@@ -643,6 +643,9 @@
requiresSpecialDigestion: true
useSound:
path: /Audio/Items/Toys/mousesqueek.ogg
+ - type: Tag
+ tags:
+ - ToyRubberDuck
- type: entity
parent: BasePlushie
diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml
index 51f121c64ff..d07a73b022e 100644
--- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml
+++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml
@@ -6,6 +6,8 @@
components:
- type: AccessReader
access: [["Service"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: Airlock
@@ -14,6 +16,8 @@
components:
- type: AccessReader
access: [["Lawyer"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: Airlock
@@ -22,6 +26,8 @@
components:
- type: AccessReader
access: [["Theatre"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockScience # DeltaV - Chapel is in Epistemics
@@ -30,6 +36,8 @@
components:
- type: AccessReader
access: [["Chapel"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: Airlock
@@ -38,6 +46,8 @@
components:
- type: AccessReader
access: [["Janitor"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: Airlock
@@ -46,6 +56,8 @@
components:
- type: AccessReader
access: [["Kitchen"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: Airlock
@@ -54,6 +66,8 @@
components:
- type: AccessReader
access: [["Bar"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: Airlock
@@ -62,6 +76,8 @@
components:
- type: AccessReader
access: [["Hydroponics"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: Airlock
@@ -70,6 +86,8 @@
components:
- type: AccessReader
access: [["Captain"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockExternal
@@ -86,6 +104,8 @@
components:
- type: AccessReader
access: [["Cargo"]]
+ - type: Wires
+ layoutId: AirlockCargo
- type: entity
parent: AirlockExternal
@@ -94,6 +114,8 @@
components:
- type: AccessReader
access: [["Engineering"]]
+ - type: Wires
+ layoutId: AirlockEngineering
- type: entity
parent: AirlockExternal
@@ -102,6 +124,8 @@
components:
- type: AccessReader
access: [["Atmospherics"]]
+ - type: Wires
+ layoutId: AirlockEngineering
- type: entity
parent: AirlockExternal
@@ -126,6 +150,8 @@
components:
- type: AccessReader
access: [["Kitchen"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockFreezer
@@ -134,6 +160,8 @@
components:
- type: AccessReader
access: [["Kitchen"], ["Hydroponics"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockFreezer
@@ -142,6 +170,8 @@
components:
- type: AccessReader
access: [["Hydroponics"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockEngineering
@@ -150,6 +180,8 @@
components:
- type: AccessReader
access: [["Engineering"]]
+ - type: Wires
+ layoutId: AirlockEngineering
- type: entity
parent: AirlockAtmospherics
@@ -158,6 +190,8 @@
components:
- type: AccessReader
access: [["Atmospherics"]]
+ - type: Wires
+ layoutId: AirlockEngineering
- type: entity
parent: AirlockCargo
@@ -166,6 +200,8 @@
components:
- type: AccessReader
access: [["Cargo"]]
+ - type: Wires
+ layoutId: AirlockCargo
- type: entity
parent: AirlockCargo
@@ -174,6 +210,8 @@
components:
- type: AccessReader
access: [["Salvage"]]
+ - type: Wires
+ layoutId: AirlockCargo
- type: entity
parent: AirlockMining
@@ -182,6 +220,8 @@
components:
- type: AccessReader
access: [["Salvage"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockMedical
@@ -190,6 +230,8 @@
components:
- type: AccessReader
access: [["Medical"]]
+ - type: Wires
+ layoutId: AirlockMedical
- type: entity
parent: AirlockMedical
@@ -206,6 +248,8 @@
components:
- type: AccessReader
access: [["Medical"]]
+ - type: Wires
+ layoutId: AirlockMedical
- type: entity
parent: AirlockChemistry
@@ -214,6 +258,8 @@
components:
- type: AccessReader
access: [["Chemistry"]]
+ - type: Wires
+ layoutId: AirlockMedical
- type: entity
parent: AirlockScience
@@ -222,6 +268,8 @@
components:
- type: AccessReader
access: [["Research"]]
+ - type: Wires
+ layoutId: AirlockScience
- type: entity
parent: AirlockScience
@@ -230,6 +278,8 @@
components:
- type: AccessReader
access: [["Research"], ["Medical"]]
+ - type: Wires
+ layoutId: AirlockScience
- type: entity
parent: AirlockCentralCommand
@@ -258,6 +308,8 @@
components:
- type: AccessReader
access: [["Captain"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockCommand
@@ -266,6 +318,8 @@
components:
- type: AccessReader
access: [["ChiefMedicalOfficer"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockCommand
@@ -274,6 +328,8 @@
components:
- type: AccessReader
access: [["ChiefEngineer"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockCommand
@@ -282,6 +338,8 @@
components:
- type: AccessReader
access: [["HeadOfSecurity"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockCommand
@@ -290,6 +348,8 @@
components:
- type: AccessReader
access: [["ResearchDirector"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockCommand
@@ -298,6 +358,8 @@
components:
- type: AccessReader
access: [["HeadOfPersonnel"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockCommand
@@ -306,6 +368,8 @@
components:
- type: AccessReader
access: [["Quartermaster"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockSecurity
@@ -365,6 +429,8 @@
components:
- type: AccessReader
access: [["Security", "Command"]]
+ - type: Wires
+ layoutId: AirlockSecurity
- type: entity
parent: AirlockCommand
@@ -373,6 +439,8 @@
components:
- type: AccessReader
access: [["External"]]
+ - type: Wires
+ layoutId: AirlockCommand
# Glass Airlocks
- type: entity
@@ -382,6 +450,8 @@
components:
- type: AccessReader
access: [["Service"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockGlass
@@ -390,6 +460,8 @@
components:
- type: AccessReader
access: [["Lawyer"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockGlass
@@ -398,6 +470,8 @@
components:
- type: AccessReader
access: [["Theatre"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockGlass
@@ -406,6 +480,8 @@
components:
- type: AccessReader
access: [["Bar"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockExternalGlass
@@ -422,6 +498,8 @@
components:
- type: AccessReader
access: [["Cargo"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockExternalGlass
@@ -446,6 +524,8 @@
components:
- type: AccessReader
access: [["Engineering"]]
+ - type: Wires
+ layoutId: AirlockEngineering
- type: entity
parent: AirlockExternalGlass
@@ -454,6 +534,8 @@
components:
- type: AccessReader
access: [["Atmospherics"]]
+ - type: Wires
+ layoutId: AirlockEngineering
- type: entity
parent: AirlockGlass
@@ -462,6 +544,8 @@
components:
- type: AccessReader
access: [["Kitchen"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockGlass
@@ -470,6 +554,8 @@
components:
- type: AccessReader
access: [["Janitor"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockGlass
@@ -478,6 +564,8 @@
components:
- type: AccessReader
access: [["Hydroponics"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockScienceGlass # DeltaV - Chapel is in Epistemics
@@ -486,6 +574,8 @@
components:
- type: AccessReader
access: [["Chapel"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockEngineeringGlass
@@ -494,6 +584,8 @@
components:
- type: AccessReader
access: [["Engineering"]]
+ - type: Wires
+ layoutId: AirlockEngineering
- type: entity
parent: AirlockAtmosphericsGlass
@@ -502,6 +594,8 @@
components:
- type: AccessReader
access: [["Atmospherics"]]
+ - type: Wires
+ layoutId: AirlockEngineering
- type: entity
parent: AirlockCargoGlass
@@ -510,6 +604,8 @@
components:
- type: AccessReader
access: [["Cargo"]]
+ - type: Wires
+ layoutId: AirlockCargo
- type: entity
parent: AirlockCargoGlass
@@ -518,6 +614,8 @@
components:
- type: AccessReader
access: [["Salvage"]]
+ - type: Wires
+ layoutId: AirlockCargo
- type: entity
parent: AirlockMiningGlass
@@ -526,6 +624,8 @@
components:
- type: AccessReader
access: [["Salvage"]]
+ - type: Wires
+ layoutId: AirlockCargo
- type: entity
parent: AirlockChemistryGlass
@@ -534,6 +634,8 @@
components:
- type: AccessReader
access: [["Chemistry"]]
+ - type: Wires
+ layoutId: AirlockMedical
- type: entity
parent: AirlockMedicalGlass
@@ -542,6 +644,8 @@
components:
- type: AccessReader
access: [["Medical"]]
+ - type: Wires
+ layoutId: AirlockMedical
- type: entity
parent: AirlockMedicalGlass
@@ -558,6 +662,8 @@
components:
- type: AccessReader
access: [["Medical"]]
+ - type: Wires
+ layoutId: AirlockMedical
- type: entity
parent: AirlockScienceGlass
@@ -566,6 +672,8 @@
components:
- type: AccessReader
access: [["Research"]]
+ - type: Wires
+ layoutId: AirlockScience
- type: entity
parent: AirlockScienceGlass
@@ -574,6 +682,8 @@
components:
- type: AccessReader
access: [["Research"], ["Medical"]]
+ - type: Wires
+ layoutId: AirlockScience
- type: entity
parent: AirlockCentralCommandGlass
@@ -592,6 +702,8 @@
components:
- type: AccessReader
access: [["Command"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockCommandGlass
@@ -600,6 +712,8 @@
components:
- type: AccessReader
access: [["Captain"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockCommandGlass
@@ -608,6 +722,8 @@
components:
- type: AccessReader
access: [["ChiefMedicalOfficer"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockCommandGlass
@@ -616,6 +732,8 @@
components:
- type: AccessReader
access: [["ChiefEngineer"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockCommandGlass
@@ -624,6 +742,8 @@
components:
- type: AccessReader
access: [["HeadOfSecurity"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockCommandGlass
@@ -632,6 +752,8 @@
components:
- type: AccessReader
access: [["ResearchDirector"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockCommandGlass
@@ -640,6 +762,8 @@
components:
- type: AccessReader
access: [["HeadOfPersonnel"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockCommandGlass
@@ -648,6 +772,8 @@
components:
- type: AccessReader
access: [["Quartermaster"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockSecurityGlass
@@ -656,6 +782,8 @@
components:
- type: AccessReader
access: [["Security"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockSecurityGlass
@@ -664,8 +792,9 @@
components:
- type: AccessReader
access: [["Detective"]]
+ - type: Wires
+ layoutId: AirlockCommand
-#Delta V: Removed Brig Access
#- type: entity
# parent: AirlockSecurityGlass
# id: AirlockBrigGlassLocked
@@ -673,6 +802,8 @@
# components:
# - type: AccessReader
# access: [["Brig"]]
+# - type: Wires
+# layoutId: AirlockCommand
- type: entity
parent: AirlockSecurityGlass
@@ -681,6 +812,8 @@
components:
- type: AccessReader
access: [["Security"], ["Lawyer"]]
+ - type: Wires
+ layoutId: AirlockSecurity
- type: entity
parent: AirlockSecurityGlass
@@ -689,6 +822,8 @@
components:
- type: AccessReader
access: [["Armory"]]
+ - type: Wires
+ layoutId: AirlockSecurity
- type: entity
parent: AirlockCommandGlassLocked
@@ -738,6 +873,8 @@
components:
- type: AccessReader
access: [["Salvage"]]
+ - type: Wires
+ layoutId: AirlockCargo
- type: entity
parent: AirlockMaint
@@ -746,6 +883,8 @@
components:
- type: AccessReader
access: [["Cargo"]]
+ - type: Wires
+ layoutId: AirlockCargo
- type: entity
parent: AirlockMaint
@@ -754,6 +893,8 @@
components:
- type: AccessReader
access: [["Command"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockMaint
@@ -770,6 +911,8 @@
components:
- type: AccessReader
access: [["Engineering"]]
+ - type: Wires
+ layoutId: AirlockEngineering
- type: entity
parent: AirlockMaint
@@ -778,6 +921,8 @@
components:
- type: AccessReader
access: [["Atmospherics"]]
+ - type: Wires
+ layoutId: AirlockEngineering
- type: entity
parent: AirlockMaint
@@ -786,6 +931,8 @@
components:
- type: AccessReader
access: [["Bar"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockMaint
@@ -794,6 +941,8 @@
components:
- type: AccessReader
access: [["Chapel"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockMaint
@@ -802,6 +951,8 @@
components:
- type: AccessReader
access: [["Hydroponics"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockMaint
@@ -810,6 +961,8 @@
components:
- type: AccessReader
access: [["Janitor"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockMaint
@@ -818,6 +971,8 @@
components:
- type: AccessReader
access: [["Lawyer"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockMaint
@@ -826,6 +981,8 @@
components:
- type: AccessReader
access: [["Service"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockMaint
@@ -834,6 +991,8 @@
components:
- type: AccessReader
access: [["Theatre"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockMaint
@@ -842,6 +1001,8 @@
components:
- type: AccessReader
access: [["Kitchen"]]
+ - type: Wires
+ layoutId: AirlockService
- type: entity
parent: AirlockMaint
@@ -858,6 +1019,8 @@
components:
- type: AccessReader
access: [["Medical"]]
+ - type: Wires
+ layoutId: AirlockMedical
- type: entity
parent: AirlockMaint
@@ -866,6 +1029,8 @@
components:
- type: AccessReader
access: [["Chemistry"]]
+ - type: Wires
+ layoutId: AirlockMedical
- type: entity
parent: AirlockMaint
@@ -874,6 +1039,8 @@
components:
- type: AccessReader
access: [["Research"]]
+ - type: Wires
+ layoutId: AirlockScience
- type: entity
parent: AirlockMaint
@@ -882,6 +1049,8 @@
components:
- type: AccessReader
access: [["Research"], ["Medical"]]
+ - type: Wires
+ layoutId: AirlockScience
- type: entity
parent: AirlockMaint
@@ -890,6 +1059,8 @@
components:
- type: AccessReader
access: [["Security"]]
+ - type: Wires
+ layoutId: AirlockSecurity
- type: entity
parent: AirlockMaint
@@ -898,6 +1069,8 @@
components:
- type: AccessReader
access: [["Detective"]]
+ - type: Wires
+ layoutId: AirlockSecurity
- type: entity
parent: AirlockMaint
@@ -906,6 +1079,8 @@
components:
- type: AccessReader
access: [["HeadOfPersonnel"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockMaint
@@ -914,6 +1089,8 @@
components:
- type: AccessReader
access: [["Captain"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockMaint
@@ -922,6 +1099,8 @@
components:
- type: AccessReader
access: [["ChiefEngineer"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockMaint
@@ -930,6 +1109,8 @@
components:
- type: AccessReader
access: [["ChiefMedicalOfficer"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockMaint
@@ -938,6 +1119,8 @@
components:
- type: AccessReader
access: [["HeadOfSecurity"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockMaint
@@ -946,6 +1129,8 @@
components:
- type: AccessReader
access: [["ResearchDirector"]]
+ - type: Wires
+ layoutId: AirlockCommand
- type: entity
parent: AirlockMaint
@@ -954,6 +1139,8 @@
components:
- type: AccessReader
access: [["Armory"]]
+ - type: Wires
+ layoutId: AirlockSecurity
- type: entity
parent: AirlockSyndicate
diff --git a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml
index 518ff2f066e..0b3c291af25 100644
--- a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml
+++ b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml
@@ -4,7 +4,7 @@
abstract: true
description: You sit in this. Either by will or force.
placement:
- mode: SnapgridCenter
+ mode: PlaceFree
components:
- type: Clickable
- type: InteractionOutline
@@ -65,6 +65,8 @@
id: ChairBase
abstract: true
parent: UnanchoredChairBase
+ placement:
+ mode: SnapgridCenter
components:
- type: Physics
bodyType: Static
@@ -87,6 +89,8 @@
id: StoolBase
parent: OfficeChairBase
abstract: true
+ placement:
+ mode: SnapgridCenter
components:
- type: Physics
bodyType: Static
@@ -116,7 +120,7 @@
- type: entity
name: stool
id: Stool
- parent: ChairBase
+ parent: UnanchoredChairBase
description: Apply butt.
components:
- type: Sprite
@@ -241,7 +245,7 @@
- type: entity
id: ChairMeat
- parent: ChairBase
+ parent: UnanchoredChairBase
name: meat chair
description: Uncomfortably sweaty.
components:
@@ -285,7 +289,7 @@
name: web chair
id: ChairWeb
description: For true web developers.
- parent: ChairBase
+ parent: UnanchoredChairBase
components:
- type: Sprite
sprite: Structures/Web/chair.rsi
@@ -349,8 +353,6 @@
parent: ChairFolding
id: ChairFoldingSpawnFolded
suffix: folded
- placement:
- mode: PlaceFree
components:
- type: Foldable
folded: true
diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
index 011f2a3b649..7300c0b9ec3 100644
--- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
+++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
@@ -341,6 +341,24 @@
- FauxTileAstroSnow
- OreBagOfHolding
- DeviceQuantumSpinInverter
+ - CanilunztTranslator
+ - BubblishTranslator
+ - NekomimeticTranslator
+ - DraconicTranslator
+ - SolCommonTranslator
+ - RootSpeakTranslator
+ - XenoTranslator
+ - BasicGalaticCommonTranslatorImplanter
+ - AdvancedGalaticCommonTranslatorImplanter
+ - BubblishTranslatorImplanter
+ - NekomimeticTranslatorImplanter
+ - DraconicTranslatorImplanter
+ - CanilunztTranslatorImplanter
+ - SolCommonTranslatorImplanter
+ - RootSpeakTranslatorImplanter
+ - AnimalTranslator
+ - MofficTranslatorImplanter
+ - MofficTranslator
- type: EmagLatheRecipes
emagDynamicRecipes:
- ExplosivePayload
diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml
index 64b6b068c71..6efa5a63711 100644
--- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml
+++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml
@@ -101,6 +101,13 @@
price: 100
- type: Appearance
- type: WiresVisuals
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ - RobotTalk
+ understands:
+ - GalacticCommon
+ - RobotTalk
- type: entity
parent: VendingMachine
diff --git a/Resources/Prototypes/Language/languages.yml b/Resources/Prototypes/Language/languages.yml
new file mode 100644
index 00000000000..90bce1baed2
--- /dev/null
+++ b/Resources/Prototypes/Language/languages.yml
@@ -0,0 +1,493 @@
+# The universal language, assumed if the entity has a UniversalLanguageSpeakerComponent.
+# Do not use otherwise. Try to use the respective component instead of this language.
+- type: language
+ id: Universal
+ obfuscateSyllables: false
+ replacement:
+ - "*incomprehensible*"
+
+# The common galactic tongue.
+- type: language
+ id: GalacticCommon
+ obfuscateSyllables: true
+ replacement:
+ - Blah
+ - Blah
+ - Blah
+ - dingle-doingle
+ - dingle
+ - dangle
+ - jibber-jabber
+ - jubber
+ - bleh
+ - zippity
+ - zoop
+ - wibble
+ - wobble
+ - wiggle
+ - yada
+ - meh
+ - neh
+ - nah
+ - wah
+
+# Spoken by slimes.
+- type: language
+ id: Bubblish
+ obfuscateSyllables: true
+ replacement:
+ - blob
+ - plop
+ - pop
+ - bop
+ - boop
+
+# Spoken by moths.
+- type: language
+ id: Moffic
+ obfuscateSyllables: true
+ replacement:
+ - år
+ - i
+ - går
+ - sek
+ - mo
+ - ff
+ - ok
+ - gj
+ - ø
+ - gå
+ - la
+ - le
+ - lit
+ - ygg
+ - van
+ - dår
+ - næ
+ - møt
+ - idd
+ - hvo
+ - ja
+ - på
+ - han
+ - så
+ - ån
+ - det
+ - att
+ - nå
+ - gö
+ - bra
+ - int
+ - tyc
+ - om
+ - när
+ - två
+ - må
+ - dag
+ - sjä
+ - vii
+ - vuo
+ - eil
+ - tun
+ - käyt
+ - teh
+ - vä
+ - hei
+ - huo
+ - suo
+ - ää
+ - ten
+ - ja
+ - heu
+ - stu
+ - uhr
+ - kön
+ - we
+ - hön
+
+ # Spoken by dionas.
+- type: language
+ id: RootSpeak
+ obfuscateSyllables: true
+ replacement:
+ - hs
+ - zt
+ - kr
+ - st
+ - sh
+
+# A mess of broken Japanese, spoken by Felinds and Oni
+- type: language
+ id: Nekomimetic
+ obfuscateSyllables: true
+ replacement:
+ - neko
+ - nyan
+ - mimi
+ - moe
+ - mofu
+ - fuwa
+ - kyaa
+ - kawaii
+ - poka
+ - munya
+ - puni
+ - munyu
+ - ufufu
+ - icha
+ - doki
+ - kyun
+ - kusu
+ - nya
+ - nyaa
+ - desu
+ - kis
+ - ama
+ - chuu
+ - baka
+ - hewo
+ - boop
+ - gato
+ - kit
+ - sune
+ - yori
+ - sou
+ - baka
+ - chan
+ - san
+ - kun
+ - mahou
+ - yatta
+ - suki
+ - usagi
+ - domo
+ - ori
+ - uwa
+ - zaazaa
+ - shiku
+ - puru
+ - ira
+ - heto
+ - etto
+
+# Spoken by the Lizard race.
+- type: language
+ id: Draconic
+ obfuscateSyllables: true
+ replacement:
+ - za
+ - az
+ - ze
+ - ez
+ - zi
+ - iz
+ - zo
+ - oz
+ - zu
+ - uz
+ - zs
+ - sz
+ - ha
+ - ah
+ - he
+ - eh
+ - hi
+ - ih
+ - ho
+ - oh
+ - hu
+ - uh
+ - hs
+ - sh
+ - la
+ - al
+ - le
+ - el
+ - li
+ - il
+ - lo
+ - ol
+ - lu
+ - ul
+ - ls
+ - sl
+ - ka
+ - ak
+ - ke
+ - ek
+ - ki
+ - ik
+ - ko
+ - ok
+ - ku
+ - uk
+ - ks
+ - sk
+ - sa
+ - as
+ - se
+ - es
+ - si
+ - is
+ - so
+ - os
+ - su
+ - us
+ - ss
+ - ss
+ - ra
+ - ar
+ - re
+ - er
+ - ri
+ - ir
+ - ro
+ - or
+ - ru
+ - ur
+ - rs
+ - sr
+ - a
+ - a
+ - e
+ - e
+ - i
+ - i
+ - o
+ - o
+ - u
+ - u
+ - s
+ - s
+
+# Spoken by the Vulpkanin race.
+- type: language
+ id: Canilunzt
+ obfuscateSyllables: true
+ replacement:
+ - rur
+ - ya
+ - cen
+ - rawr
+ - bar
+ - kuk
+ - tek
+ - qat
+ - uk
+ - wu
+ - vuh
+ - tah
+ - tch
+ - schz
+ - auch
+ - ist
+ - ein
+ - entch
+ - zwichs
+ - tut
+ - mir
+ - wo
+ - bis
+ - es
+ - vor
+ - nic
+ - gro
+ - lll
+ - enem
+ - zandt
+ - tzch
+ - noch
+ - hel
+ - ischt
+ - far
+ - wa
+ - baram
+ - iereng
+ - tech
+ - lach
+ - sam
+ - mak
+ - lich
+ - gen
+ - or
+ - ag
+ - eck
+ - gec
+ - stag
+ - onn
+ - bin
+ - ket
+ - jarl
+ - vulf
+ - einech
+ - cresthz
+ - azunein
+ - ghzth
+
+# The common language of the Sol system.
+- type: language
+ id: SolCommon
+ obfuscateSyllables: true
+ replacement:
+ - tao
+ - shi
+ - tzu
+ - yi
+ - com
+ - be
+ - is
+ - i
+ - op
+ - vi
+ - ed
+ - lec
+ - mo
+ - cle
+ - te
+ - dis
+ - e
+
+- type: language
+ id: RobotTalk
+ obfuscateSyllables: true
+ replacement:
+ - 0
+ - 1
+ - 01
+ - 10
+ - 001
+ - 100
+ - 011
+ - 110
+ - 101
+ - 010
+
+# Languages spoken by various critters.
+- type: language
+ id: Cat
+ obfuscateSyllables: true
+ replacement:
+ - murr
+ - meow
+ - purr
+ - mrow
+
+- type: language
+ id: Dog
+ obfuscateSyllables: true
+ replacement:
+ - woof
+ - bark
+ - ruff
+ - bork
+ - raff
+ - garr
+
+- type: language
+ id: Fox
+ obfuscateSyllables: true
+ replacement:
+ - bark
+ - gecker
+ - ruff
+ - raff
+ - garr
+
+- type: language
+ id: Xeno
+ obfuscateSyllables: true
+ replacement:
+ - sss
+ - sSs
+ - SSS
+
+- type: language
+ id: Monkey
+ obfuscateSyllables: true
+ replacement:
+ - ok
+ - ook
+ - oook
+ - ooook
+ - oooook
+
+- type: language
+ id: Mouse
+ obfuscateSyllables: true
+ replacement:
+ - Squeak
+ - Piep
+ - Chuu
+ - Eeee
+ - Pip
+ - Fwiep
+ - Heep
+
+- type: language
+ id: Chicken
+ obfuscateSyllables: true
+ replacement:
+ - Coo
+ - Coot
+ - Cooot
+
+- type: language
+ id: Duck
+ obfuscateSyllables: true
+ replacement:
+ - Quack
+ - Quack quack
+
+- type: language
+ id: Cow
+ obfuscateSyllables: true
+ replacement:
+ - Moo
+ - Mooo
+
+- type: language
+ id: Sheep
+ obfuscateSyllables: true
+ replacement:
+ - Ba
+ - Baa
+ - Baaa
+
+- type: language
+ id: Kangaroo
+ obfuscateSyllables: true
+ replacement:
+ - Shreak
+ - Chuu
+
+- type: language
+ id: Pig
+ obfuscateSyllables: true
+ replacement:
+ - Oink
+ - Oink oink
+
+- type: language
+ id: Crab
+ obfuscateSyllables: true
+ replacement:
+ - Click
+ - Click-clack
+ - Clack
+ - Tipi-tap
+ - Clik-tap
+ - Cliliick
+
+- type: language
+ id: Kobold
+ obfuscateSyllables: true
+ replacement:
+ - Yip
+ - Grrar.
+ - Yap
+ - Bip
+ - Screet
+ - Gronk
+ - Hiss
+ - Eeee
+ - Yip
diff --git a/Resources/Prototypes/Loadouts/outerClothing.yml b/Resources/Prototypes/Loadouts/outerClothing.yml
index 7923d9e66f0..078cf530ba2 100644
--- a/Resources/Prototypes/Loadouts/outerClothing.yml
+++ b/Resources/Prototypes/Loadouts/outerClothing.yml
@@ -32,3 +32,80 @@
cost: 3
items:
- ClothingOuterWinterCoat
+
+- type: loadout
+ id: LoadoutOuterCorporateJacket
+ category: Outer
+ cost: 2
+ items:
+ - ClothingOuterCorporateJacket
+
+- type: loadout
+ id: LoadoutOuterCsCorporateJacket
+ category: Outer
+ cost: 2
+ items:
+ - ClothingOuterCsCorporateJacket
+
+- type: loadout
+ id: LoadoutOuterEeCorporateJacket
+ category: Outer
+ cost: 2
+ items:
+ - ClothingOuterEeCorporateJacket
+
+- type: loadout
+ id: LoadoutOuterHiCorporateJacket
+ category: Outer
+ cost: 2
+ items:
+ - ClothingOuterHiCorporateJacket
+
+- type: loadout
+ id: LoadoutOuterHmCorporateJacket
+ category: Outer
+ cost: 2
+ items:
+ - ClothingOuterHmCorporateJacket
+
+- type: loadout
+ id: LoadoutOuterIdCorporateJacket
+ category: Outer
+ cost: 2
+ items:
+ - ClothingOuterIdCorporateJacket
+
+- type: loadout
+ id: LoadoutOuterBcCorporateJacket
+ category: Outer
+ cost: 2
+ items:
+ - ClothingOuterBcCorporateJacket
+
+- type: loadout
+ id: LoadoutOuterDdCorporateJacket
+ category: Outer
+ cost: 2
+ items:
+ - ClothingOuterDdCorporateJacket
+
+- type: loadout
+ id: LoadoutOuterFaCorporateJacket
+ category: Outer
+ cost: 2
+ items:
+ - ClothingOuterFaCorporateJacket
+
+- type: loadout
+ id: LoadoutOuterGeCorporateJacket
+ category: Outer
+ cost: 2
+ items:
+ - ClothingOuterGeCorporateJacket
+
+- type: loadout
+ id: LoadoutOuterZhCorporateJacket
+ category: Outer
+ cost: 2
+ items:
+ - ClothingOuterZhCorporateJacket
diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml
index e11f1c4165f..8a0e750abd6 100644
--- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml
+++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml
@@ -35,6 +35,13 @@
- MobLayer
- type: Stamina
critThreshold: 115
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ - Nekomimetic
+ understands:
+ - GalacticCommon
+ - Nekomimetic
- type: entity
save: false
diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml
index d9b25c5dd1b..2184926b95a 100644
--- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml
+++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml
@@ -64,6 +64,15 @@
Unsexed: MaleFelinid
- type: Felinid
- type: NoShoesSilentFootsteps
+ - type: LanguageSpeaker
+ speaks:
+ - GalacticCommon
+ - SolCommon
+ - Nekomimetic
+ understands:
+ - GalacticCommon
+ - SolCommon
+ - Nekomimetic
- type: entity
save: false
diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml
new file mode 100644
index 00000000000..e017096fa90
--- /dev/null
+++ b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml
@@ -0,0 +1,22 @@
+- type: constructionGraph
+ id: ClothingShoeSlippersDuck
+ start: start
+ graph:
+ - node: start
+ edges:
+ - to: shoes
+ steps:
+ - tag: ToyRubberDuck
+ name: a rubber ducky
+ icon:
+ sprite: Objects/Fun/ducky.rsi
+ state: icon
+ doAfter: 1
+ - tag: ToyRubberDuck
+ name: a rubber ducky
+ icon:
+ sprite: Objects/Fun/ducky.rsi
+ state: icon
+ doAfter: 1
+ - node: shoes
+ entity: ClothingShoeSlippersDuck
diff --git a/Resources/Prototypes/Recipes/Construction/clothing.yml b/Resources/Prototypes/Recipes/Construction/clothing.yml
index 4fe2c474bb4..f1eb270af73 100644
--- a/Resources/Prototypes/Recipes/Construction/clothing.yml
+++ b/Resources/Prototypes/Recipes/Construction/clothing.yml
@@ -85,3 +85,14 @@
description: Two huds joined by arms
icon: { sprite: Clothing/Eyes/Hud/medsec.rsi, state: icon }
objectType: Item
+
+- type: construction
+ name: ducky slippers
+ id: ClothingShoeSlippersDuck
+ graph: ClothingShoeSlippersDuck
+ startNode: start
+ targetNode: shoes
+ category: construction-category-clothing
+ description: Comfy, yet haunted by the ghosts of ducks you fed bread to as a child.
+ icon: { sprite: Clothing/Shoes/Misc/duck-slippers.rsi, state: icon }
+ objectType: Item
diff --git a/Resources/Prototypes/Recipes/Lathes/language.yml b/Resources/Prototypes/Recipes/Lathes/language.yml
new file mode 100644
index 00000000000..6871ed5228d
--- /dev/null
+++ b/Resources/Prototypes/Recipes/Lathes/language.yml
@@ -0,0 +1,190 @@
+- type: latheRecipe
+ id: CanilunztTranslator
+ result: CanilunztTranslator
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 100
+ Plastic: 50
+ Gold: 50
+
+- type: latheRecipe
+ id: BubblishTranslator
+ result: BubblishTranslator
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 100
+ Plastic: 50
+ Gold: 50
+
+- type: latheRecipe
+ id: NekomimeticTranslator
+ result: NekomimeticTranslator
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 100
+ Plastic: 50
+ Gold: 50
+
+- type: latheRecipe
+ id: DraconicTranslator
+ result: DraconicTranslator
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 100
+ Plastic: 50
+ Gold: 50
+
+- type: latheRecipe
+ id: SolCommonTranslator
+ result: SolCommonTranslator
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 100
+ Plastic: 50
+ Gold: 50
+
+- type: latheRecipe
+ id: RootSpeakTranslator
+ result: RootSpeakTranslator
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 100
+ Plastic: 50
+ Gold: 50
+
+- type: latheRecipe
+ id: MofficTranslator
+ result: MofficTranslator
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 100
+ Plastic: 50
+ Gold: 50
+
+- type: latheRecipe
+ id: BasicGalaticCommonTranslatorImplanter
+ result: BasicGalaticCommonTranslatorImplanter
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 500
+ Plastic: 100
+ Gold: 50
+ Silver: 50
+
+- type: latheRecipe
+ id: XenoTranslator
+ result: XenoTranslator
+ completetime: 2
+ materials:
+ Steel: 200
+ Plastic: 50
+ Gold: 50
+ Plasma: 50
+ Silver: 50
+
+- type: latheRecipe
+ id: AdvancedGalaticCommonTranslatorImplanter
+ result: AdvancedGalaticCommonTranslatorImplanter
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 500
+ Plastic: 100
+ Gold: 50
+ Silver: 50
+
+- type: latheRecipe
+ id: BubblishTranslatorImplanter
+ result: BubblishTranslatorImplanter
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 500
+ Plastic: 100
+ Gold: 50
+ Silver: 50
+
+- type: latheRecipe
+ id: NekomimeticTranslatorImplanter
+ result: NekomimeticTranslatorImplanter
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 500
+ Plastic: 100
+ Gold: 50
+ Silver: 50
+
+- type: latheRecipe
+ id: DraconicTranslatorImplanter
+ result: DraconicTranslatorImplanter
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 500
+ Plastic: 100
+ Gold: 50
+ Silver: 50
+
+- type: latheRecipe
+ id: CanilunztTranslatorImplanter
+ result: CanilunztTranslatorImplanter
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 500
+ Plastic: 100
+ Gold: 50
+ Silver: 50
+
+- type: latheRecipe
+ id: SolCommonTranslatorImplanter
+ result: SolCommonTranslatorImplanter
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 500
+ Plastic: 100
+ Gold: 50
+ Silver: 50
+
+- type: latheRecipe
+ id: RootSpeakTranslatorImplanter
+ result: RootSpeakTranslatorImplanter
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 500
+ Plastic: 100
+ Gold: 50
+ Silver: 50
+
+- type: latheRecipe
+ id: MofficTranslatorImplanter
+ result: MofficTranslatorImplanter
+ completetime: 2
+ materials:
+ Steel: 500
+ Glass: 500
+ Plastic: 100
+ Gold: 50
+ Silver: 50
+
+- type: latheRecipe
+ id: AnimalTranslator
+ result: AnimalTranslator
+ completetime: 2
+ materials:
+ Steel: 200
+ Plastic: 50
+ Gold: 50
+ Plasma: 50
+ Silver: 5
diff --git a/Resources/Prototypes/Recipes/Reactions/drinks.yml b/Resources/Prototypes/Recipes/Reactions/drinks.yml
index e5afdbd6def..7608369b2ce 100644
--- a/Resources/Prototypes/Recipes/Reactions/drinks.yml
+++ b/Resources/Prototypes/Recipes/Reactions/drinks.yml
@@ -454,11 +454,11 @@
id: IrishCoffee
reactants:
Coffee:
- amount: 2
+ amount: 1
IrishCream:
- amount: 2
+ amount: 1
products:
- IrishCoffee: 4
+ IrishCoffee: 2
- type: reaction
id: IrishCream
diff --git a/Resources/Prototypes/Research/civilianservices.yml b/Resources/Prototypes/Research/civilianservices.yml
index 61f95894ee6..acb6a2498d4 100644
--- a/Resources/Prototypes/Research/civilianservices.yml
+++ b/Resources/Prototypes/Research/civilianservices.yml
@@ -227,3 +227,43 @@
recipeUnlocks:
- BluespaceBeaker
- SyringeBluespace
+
+- type: technology
+ id: BasicTranslation
+ name: research-technology-basic-translation
+ icon:
+ sprite: Objects/Devices/translator.rsi
+ state: icon
+ discipline: CivilianServices
+ tier: 2
+ cost: 10000
+ recipeUnlocks:
+ - CanilunztTranslator
+ - BubblishTranslator
+ - NekomimeticTranslator
+ - DraconicTranslator
+ - SolCommonTranslator
+ - RootSpeakTranslator
+ - BasicGalaticCommonTranslatorImplanter
+ - MofficTranslator
+
+- type: technology
+ id: AdvancedTranslation
+ name: research-technology-advanced-translation
+ icon:
+ sprite: Objects/Devices/translator.rsi
+ state: icon
+ discipline: CivilianServices
+ tier: 3
+ cost: 15000
+ recipeUnlocks:
+ - XenoTranslator
+ - AdvancedGalaticCommonTranslatorImplanter
+ - BubblishTranslatorImplanter
+ - NekomimeticTranslatorImplanter
+ - DraconicTranslatorImplanter
+ - CanilunztTranslatorImplanter
+ - SolCommonTranslatorImplanter
+ - RootSpeakTranslatorImplanter
+ - AnimalTranslator
+ - MofficTranslatorImplanter
diff --git a/Resources/Prototypes/Tiles/floors.yml b/Resources/Prototypes/Tiles/floors.yml
index 59fa88be2b2..b5ca240d5ca 100644
--- a/Resources/Prototypes/Tiles/floors.yml
+++ b/Resources/Prototypes/Tiles/floors.yml
@@ -201,7 +201,7 @@
collection: FootstepHull
itemDrop: FloorTileItemBrassFilled
heatCapacity: 10000
-
+
- type: tile
id: FloorBrassReebe
name: tiles-brass-floor-reebe
@@ -1207,12 +1207,6 @@
id: FloorShuttleWhite
name: tiles-white-shuttle-floor
sprite: /Textures/Tiles/shuttlewhite.png
- variants: 4
- placementVariants:
- - 1.0
- - 1.0
- - 1.0
- - 1.0
baseTurf: Plating
isSubfloor: false
deconstructTools: [ Prying ]
@@ -1225,12 +1219,6 @@
id: FloorShuttleGrey
name: tiles-grey-shuttle-floor
sprite: /Textures/Tiles/shuttlegrey.png
- variants: 4
- placementVariants:
- - 1.0
- - 1.0
- - 1.0
- - 1.0
baseTurf: Plating
isSubfloor: false
deconstructTools: [ Prying ]
@@ -1243,12 +1231,6 @@
id: FloorShuttleBlack
name: tiles-black-shuttle-floor
sprite: /Textures/Tiles/shuttleblack.png
- variants: 4
- placementVariants:
- - 1.0
- - 1.0
- - 1.0
- - 1.0
baseTurf: Plating
isSubfloor: false
deconstructTools: [ Prying ]
@@ -1261,12 +1243,6 @@
id: FloorShuttleBlue
name: tiles-blue-shuttle-floor
sprite: /Textures/Tiles/shuttleblue.png
- variants: 4
- placementVariants:
- - 1.0
- - 1.0
- - 1.0
- - 1.0
baseTurf: Plating
isSubfloor: false
deconstructTools: [ Prying ]
@@ -1279,12 +1255,6 @@
id: FloorShuttleOrange
name: tiles-orange-shuttle-floor
sprite: /Textures/Tiles/shuttleorange.png
- variants: 4
- placementVariants:
- - 1.0
- - 1.0
- - 1.0
- - 1.0
baseTurf: Plating
isSubfloor: false
deconstructTools: [ Prying ]
@@ -1297,12 +1267,6 @@
id: FloorShuttlePurple
name: tiles-purple-shuttle-floor
sprite: /Textures/Tiles/shuttlepurple.png
- variants: 4
- placementVariants:
- - 1.0
- - 1.0
- - 1.0
- - 1.0
baseTurf: Plating
isSubfloor: false
deconstructTools: [ Prying ]
@@ -1315,12 +1279,6 @@
id: FloorShuttleRed
name: tiles-red-shuttle-floor
sprite: /Textures/Tiles/shuttlered.png
- variants: 4
- placementVariants:
- - 1.0
- - 1.0
- - 1.0
- - 1.0
baseTurf: Plating
isSubfloor: false
deconstructTools: [ Prying ]
@@ -1940,4 +1898,4 @@
barestepSounds:
collection: BarestepWood
itemDrop: FloorTileItemWoodLarge
- heatCapacity: 10000
\ No newline at end of file
+ heatCapacity: 10000
diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml
index 064b34adbaf..2f1a7f92d26 100644
--- a/Resources/Prototypes/Traits/disabilities.yml
+++ b/Resources/Prototypes/Traits/disabilities.yml
@@ -60,3 +60,10 @@
description: trait-frontal-lisp-desc
components:
- type: FrontalLisp
+
+- type: trait
+ id: Snoring
+ name: trait-snoring-name
+ description: trait-snoring-desc
+ components:
+ - type: Snoring
diff --git a/Resources/Prototypes/Wires/layouts.yml b/Resources/Prototypes/Wires/layouts.yml
index 338bf188ba0..b30e68545df 100644
--- a/Resources/Prototypes/Wires/layouts.yml
+++ b/Resources/Prototypes/Wires/layouts.yml
@@ -15,6 +15,26 @@
- type: wireLayout
parent: Airlock
+ id: AirlockService
+
+- type: wireLayout
+ parent: Airlock
+ id: AirlockCargo
+
+- type: wireLayout
+ parent: Airlock
+ id: AirlockEngineering
+
+- type: wireLayout
+ parent: Airlock
+ id: AirlockMedical
+
+- type: wireLayout
+ parent: Airlock
+ id: AirlockScience
+
+- type: wireLayout
+ parent: HighSec
id: AirlockCommand
- type: wireLayout
diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml
index 2694cbeaf39..c6a0ab3f8fd 100644
--- a/Resources/Prototypes/tags.yml
+++ b/Resources/Prototypes/tags.yml
@@ -1190,6 +1190,9 @@
- type: Tag
id: Torch
+- type: Tag
+ id: ToyRubberDuck
+
- type: Tag
id: ToySidearm
diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/equipped-OUTERCLOTHING.png
index 81512185135..78f7cd2453e 100644
Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/equipped-OUTERCLOTHING.png and b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/equipped-OUTERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/icon.png
index 2c2e17abe25..b1405b8b062 100644
Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/icon.png and b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/meta.json
index 3f816376c7e..9ae7fc3f93a 100644
--- a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/meta.json
+++ b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken/modified by Taral from tgstation at commit https://github.com/tgstation/tgstation/commit/dbc2435fa562f4ef130a7112d2a4cc9c80099894",
+ "copyright": "Taken from https://github.com/ParadiseSS13/Paradise",
"size": {
"x": 32,
"y": 32
diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/equipped-OUTERCLOTHING.png
index fdbed82bd34..45ba5b9a32f 100644
Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/equipped-OUTERCLOTHING.png and b/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/equipped-OUTERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/icon.png
index bb2e517bde2..fde6c90e2ca 100644
Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/icon.png and b/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/meta.json
index 30607d47eaa..afdd4120b55 100644
--- a/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/meta.json
+++ b/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from TGstation github https://github.com/tgstation/tgstation/commit/fed2ddeb54d0fb8bb97cb0a899a088b7d7423bbb",
+ "copyright": "Taken from https://github.com/ParadiseSS13/Paradise",
"size": {
"x": 32,
"y": 32
@@ -23,4 +23,4 @@
"directions": 4
}
]
-}
\ No newline at end of file
+}
diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/equipped-OUTERCLOTHING.png
index 427c203b198..0063e8cda06 100644
Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/equipped-OUTERCLOTHING.png and b/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/equipped-OUTERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/icon.png
index e70741f1ff9..a92566d3087 100644
Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/icon.png and b/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/meta.json
index e482264df5f..afdd4120b55 100644
--- a/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/meta.json
+++ b/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e",
+ "copyright": "Taken from https://github.com/ParadiseSS13/Paradise",
"size": {
"x": 32,
"y": 32
diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/equipped-OUTERCLOTHING.png
index fb4087b662b..59d6ea3b487 100644
Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/equipped-OUTERCLOTHING.png and b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/equipped-OUTERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/icon.png
index f2b15dd82f3..23bb26f648e 100644
Binary files a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/icon.png and b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json
index e0d437b8ece..afdd4120b55 100644
--- a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json
+++ b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae",
+ "copyright": "Taken from https://github.com/ParadiseSS13/Paradise",
"size": {
"x": 32,
"y": 32
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png
new file mode 100644
index 00000000000..5eadcdc1c1a
Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png
new file mode 100644
index 00000000000..dbb09f8ed06
Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json
new file mode 100644
index 00000000000..42d21c3d8ab
--- /dev/null
+++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-OUTERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png
index 73e230e8a5f..631fcc2c946 100644
Binary files a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/equipped-OUTERCLOTHING.png
new file mode 100644
index 00000000000..6377db6f2e6
Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/equipped-OUTERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/icon.png
new file mode 100644
index 00000000000..c7fd65e30b5
Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/meta.json
new file mode 100644
index 00000000000..42d21c3d8ab
--- /dev/null
+++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-OUTERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/equipped-OUTERCLOTHING.png
index 983c2534f4c..1055ce095cd 100644
Binary files a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/equipped-OUTERCLOTHING.png and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/equipped-OUTERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/equipped-OUTERCLOTHING.png
new file mode 100644
index 00000000000..fa468b2390b
Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/equipped-OUTERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/icon.png
new file mode 100644
index 00000000000..635845bab25
Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/meta.json
new file mode 100644
index 00000000000..42d21c3d8ab
--- /dev/null
+++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-OUTERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/equipped-OUTERCLOTHING.png
new file mode 100644
index 00000000000..87fd7458503
Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/equipped-OUTERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/icon.png
new file mode 100644
index 00000000000..2af90d92f71
Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/meta.json
new file mode 100644
index 00000000000..42d21c3d8ab
--- /dev/null
+++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-OUTERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png
index f18a64ab9c0..e1f137dca37 100644
Binary files a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/equipped-OUTERCLOTHING.png
index fb400585e5a..2d103cfa667 100644
Binary files a/Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/equipped-OUTERCLOTHING.png and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/equipped-OUTERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/equipped-OUTERCLOTHING.png
index e2a263049a3..ceb70458188 100644
Binary files a/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/equipped-OUTERCLOTHING.png and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/equipped-OUTERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/icon.png
index 102b192e0fa..c864d60dc01 100644
Binary files a/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/icon.png and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/equipped-OUTERCLOTHING.png
new file mode 100644
index 00000000000..b138d1416b7
Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/equipped-OUTERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/icon.png
new file mode 100644
index 00000000000..d85eeb0592b
Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/meta.json
new file mode 100644
index 00000000000..42d21c3d8ab
--- /dev/null
+++ b/Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "leonardo_dabepis on discord / @leonardo-dabepis on Tumblr, Edited by heartparkyheart on Discord",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-OUTERCLOTHING",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_box.png b/Resources/Textures/Decals/bricktile.rsi/dark_box.png
index 153e7d3cfce..d9b23d56766 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_box.png and b/Resources/Textures/Decals/bricktile.rsi/dark_box.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_corner_ne.png b/Resources/Textures/Decals/bricktile.rsi/dark_corner_ne.png
index b10deefb78e..284559148eb 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_corner_ne.png and b/Resources/Textures/Decals/bricktile.rsi/dark_corner_ne.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_corner_nw.png b/Resources/Textures/Decals/bricktile.rsi/dark_corner_nw.png
index 7f28df09618..d249245bd4e 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_corner_nw.png and b/Resources/Textures/Decals/bricktile.rsi/dark_corner_nw.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_corner_se.png b/Resources/Textures/Decals/bricktile.rsi/dark_corner_se.png
index 2cb5db32d35..c608bd12e03 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_corner_se.png and b/Resources/Textures/Decals/bricktile.rsi/dark_corner_se.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_corner_sw.png b/Resources/Textures/Decals/bricktile.rsi/dark_corner_sw.png
index f4d9633ba27..7d47c299ba6 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_corner_sw.png and b/Resources/Textures/Decals/bricktile.rsi/dark_corner_sw.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_end_e.png b/Resources/Textures/Decals/bricktile.rsi/dark_end_e.png
index e7f63be4219..323e75d76f7 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_end_e.png and b/Resources/Textures/Decals/bricktile.rsi/dark_end_e.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_end_n.png b/Resources/Textures/Decals/bricktile.rsi/dark_end_n.png
index 806c94fe730..3d91cfbdc0f 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_end_n.png and b/Resources/Textures/Decals/bricktile.rsi/dark_end_n.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_end_s.png b/Resources/Textures/Decals/bricktile.rsi/dark_end_s.png
index 4bae8c99b74..96920182050 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_end_s.png and b/Resources/Textures/Decals/bricktile.rsi/dark_end_s.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_end_w.png b/Resources/Textures/Decals/bricktile.rsi/dark_end_w.png
index b010ef23997..dcb96039e9d 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_end_w.png and b/Resources/Textures/Decals/bricktile.rsi/dark_end_w.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_inner_ne.png b/Resources/Textures/Decals/bricktile.rsi/dark_inner_ne.png
index 08f219869f0..7a9da46b878 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_inner_ne.png and b/Resources/Textures/Decals/bricktile.rsi/dark_inner_ne.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_inner_nw.png b/Resources/Textures/Decals/bricktile.rsi/dark_inner_nw.png
index d716a81e831..d0ccf15f353 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_inner_nw.png and b/Resources/Textures/Decals/bricktile.rsi/dark_inner_nw.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_inner_se.png b/Resources/Textures/Decals/bricktile.rsi/dark_inner_se.png
index fc60f896982..70b3944d6c6 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_inner_se.png and b/Resources/Textures/Decals/bricktile.rsi/dark_inner_se.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_inner_sw.png b/Resources/Textures/Decals/bricktile.rsi/dark_inner_sw.png
index c4ac0d8f100..9b74f978998 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_inner_sw.png and b/Resources/Textures/Decals/bricktile.rsi/dark_inner_sw.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_line_e.png b/Resources/Textures/Decals/bricktile.rsi/dark_line_e.png
index 99cb16a6ad8..f2f3b75fd8f 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_line_e.png and b/Resources/Textures/Decals/bricktile.rsi/dark_line_e.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_line_n.png b/Resources/Textures/Decals/bricktile.rsi/dark_line_n.png
index 928b56c942a..ebf08c0ac2c 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_line_n.png and b/Resources/Textures/Decals/bricktile.rsi/dark_line_n.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_line_s.png b/Resources/Textures/Decals/bricktile.rsi/dark_line_s.png
index f0ffe1c434d..5fc1efc7bbe 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_line_s.png and b/Resources/Textures/Decals/bricktile.rsi/dark_line_s.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/dark_line_w.png b/Resources/Textures/Decals/bricktile.rsi/dark_line_w.png
index bfae586a073..1bd29e14973 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/dark_line_w.png and b/Resources/Textures/Decals/bricktile.rsi/dark_line_w.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/meta.json b/Resources/Textures/Decals/bricktile.rsi/meta.json
index 313a68db1ac..2658bbe3b3c 100644
--- a/Resources/Textures/Decals/bricktile.rsi/meta.json
+++ b/Resources/Textures/Decals/bricktile.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC0-1.0",
- "copyright": "Edited by Flareguy, originally created by github user @moonheart08",
+ "copyright": "Made by github user @Morb0. Modified v2 by ko4erga (discord)",
"size": {
"x": 32,
"y": 32
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_box.png b/Resources/Textures/Decals/bricktile.rsi/steel_box.png
index f7e5af84967..124905eabfc 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_box.png and b/Resources/Textures/Decals/bricktile.rsi/steel_box.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_corner_ne.png b/Resources/Textures/Decals/bricktile.rsi/steel_corner_ne.png
index dcf9e52b7cd..f17f3c19991 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_corner_ne.png and b/Resources/Textures/Decals/bricktile.rsi/steel_corner_ne.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_corner_nw.png b/Resources/Textures/Decals/bricktile.rsi/steel_corner_nw.png
index 9601a55f50d..86fa0e9e007 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_corner_nw.png and b/Resources/Textures/Decals/bricktile.rsi/steel_corner_nw.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_corner_se.png b/Resources/Textures/Decals/bricktile.rsi/steel_corner_se.png
index 134997a6112..203dce3f83b 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_corner_se.png and b/Resources/Textures/Decals/bricktile.rsi/steel_corner_se.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_corner_sw.png b/Resources/Textures/Decals/bricktile.rsi/steel_corner_sw.png
index bb107cb037e..9eb1cfc533f 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_corner_sw.png and b/Resources/Textures/Decals/bricktile.rsi/steel_corner_sw.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_end_e.png b/Resources/Textures/Decals/bricktile.rsi/steel_end_e.png
index 58c70fb9485..fb05cd35c4f 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_end_e.png and b/Resources/Textures/Decals/bricktile.rsi/steel_end_e.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_end_n.png b/Resources/Textures/Decals/bricktile.rsi/steel_end_n.png
index 36092d5d0fe..e1e2e04c394 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_end_n.png and b/Resources/Textures/Decals/bricktile.rsi/steel_end_n.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_end_s.png b/Resources/Textures/Decals/bricktile.rsi/steel_end_s.png
index b377ac46b91..08070278254 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_end_s.png and b/Resources/Textures/Decals/bricktile.rsi/steel_end_s.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_end_w.png b/Resources/Textures/Decals/bricktile.rsi/steel_end_w.png
index e9fd6a05797..0eeb92f6f71 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_end_w.png and b/Resources/Textures/Decals/bricktile.rsi/steel_end_w.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_inner_ne.png b/Resources/Textures/Decals/bricktile.rsi/steel_inner_ne.png
index d8e5a50f8cf..33f2919865b 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_inner_ne.png and b/Resources/Textures/Decals/bricktile.rsi/steel_inner_ne.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_inner_nw.png b/Resources/Textures/Decals/bricktile.rsi/steel_inner_nw.png
index ea84f9755ff..644f5448cd0 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_inner_nw.png and b/Resources/Textures/Decals/bricktile.rsi/steel_inner_nw.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_inner_se.png b/Resources/Textures/Decals/bricktile.rsi/steel_inner_se.png
index 7d29fb22571..0f9072cc9e5 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_inner_se.png and b/Resources/Textures/Decals/bricktile.rsi/steel_inner_se.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_inner_sw.png b/Resources/Textures/Decals/bricktile.rsi/steel_inner_sw.png
index d8fac15ac82..cca9bc52c4b 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_inner_sw.png and b/Resources/Textures/Decals/bricktile.rsi/steel_inner_sw.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_line_e.png b/Resources/Textures/Decals/bricktile.rsi/steel_line_e.png
index 0eded8ad61f..10b910fe169 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_line_e.png and b/Resources/Textures/Decals/bricktile.rsi/steel_line_e.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_line_n.png b/Resources/Textures/Decals/bricktile.rsi/steel_line_n.png
index 8c2112e975a..0a6d337048b 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_line_n.png and b/Resources/Textures/Decals/bricktile.rsi/steel_line_n.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_line_s.png b/Resources/Textures/Decals/bricktile.rsi/steel_line_s.png
index 0624ec350e0..60bf358d658 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_line_s.png and b/Resources/Textures/Decals/bricktile.rsi/steel_line_s.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/steel_line_w.png b/Resources/Textures/Decals/bricktile.rsi/steel_line_w.png
index a67b6abc834..aff9dabab68 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/steel_line_w.png and b/Resources/Textures/Decals/bricktile.rsi/steel_line_w.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_box.png b/Resources/Textures/Decals/bricktile.rsi/white_box.png
index d4454f06763..f95af9e5d68 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_box.png and b/Resources/Textures/Decals/bricktile.rsi/white_box.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_corner_ne.png b/Resources/Textures/Decals/bricktile.rsi/white_corner_ne.png
index 292139bfe4c..90cda6ec336 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_corner_ne.png and b/Resources/Textures/Decals/bricktile.rsi/white_corner_ne.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_corner_nw.png b/Resources/Textures/Decals/bricktile.rsi/white_corner_nw.png
index 5624893809e..3fe0a9634c7 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_corner_nw.png and b/Resources/Textures/Decals/bricktile.rsi/white_corner_nw.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_corner_se.png b/Resources/Textures/Decals/bricktile.rsi/white_corner_se.png
index addb819cece..c4cdab83f1c 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_corner_se.png and b/Resources/Textures/Decals/bricktile.rsi/white_corner_se.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_corner_sw.png b/Resources/Textures/Decals/bricktile.rsi/white_corner_sw.png
index fb06423131e..a2157c064c4 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_corner_sw.png and b/Resources/Textures/Decals/bricktile.rsi/white_corner_sw.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_end_e.png b/Resources/Textures/Decals/bricktile.rsi/white_end_e.png
index 548bdd63039..6b857400be3 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_end_e.png and b/Resources/Textures/Decals/bricktile.rsi/white_end_e.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_end_n.png b/Resources/Textures/Decals/bricktile.rsi/white_end_n.png
index 68fe5bcf7b6..739e4dcdfcd 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_end_n.png and b/Resources/Textures/Decals/bricktile.rsi/white_end_n.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_end_s.png b/Resources/Textures/Decals/bricktile.rsi/white_end_s.png
index 4b96c7858aa..03b4eb7593e 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_end_s.png and b/Resources/Textures/Decals/bricktile.rsi/white_end_s.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_end_w.png b/Resources/Textures/Decals/bricktile.rsi/white_end_w.png
index c01877b1769..a982e97bec6 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_end_w.png and b/Resources/Textures/Decals/bricktile.rsi/white_end_w.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_inner_ne.png b/Resources/Textures/Decals/bricktile.rsi/white_inner_ne.png
index 0726c450660..e8d326d08d5 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_inner_ne.png and b/Resources/Textures/Decals/bricktile.rsi/white_inner_ne.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_inner_nw.png b/Resources/Textures/Decals/bricktile.rsi/white_inner_nw.png
index 5e75689308a..1b6e902e535 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_inner_nw.png and b/Resources/Textures/Decals/bricktile.rsi/white_inner_nw.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_inner_se.png b/Resources/Textures/Decals/bricktile.rsi/white_inner_se.png
index 82013151cb9..f41846183f0 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_inner_se.png and b/Resources/Textures/Decals/bricktile.rsi/white_inner_se.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_inner_sw.png b/Resources/Textures/Decals/bricktile.rsi/white_inner_sw.png
index 848d13c3710..dfddc4c38c5 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_inner_sw.png and b/Resources/Textures/Decals/bricktile.rsi/white_inner_sw.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_line_e.png b/Resources/Textures/Decals/bricktile.rsi/white_line_e.png
index ecbc891f6f7..1d70a2d6ede 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_line_e.png and b/Resources/Textures/Decals/bricktile.rsi/white_line_e.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_line_n.png b/Resources/Textures/Decals/bricktile.rsi/white_line_n.png
index 1d7203daab8..cfd681dcbbe 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_line_n.png and b/Resources/Textures/Decals/bricktile.rsi/white_line_n.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_line_s.png b/Resources/Textures/Decals/bricktile.rsi/white_line_s.png
index 408d3220d75..c92bae8346a 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_line_s.png and b/Resources/Textures/Decals/bricktile.rsi/white_line_s.png differ
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_line_w.png b/Resources/Textures/Decals/bricktile.rsi/white_line_w.png
index fd6bf603947..4bdf37aac22 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_line_w.png and b/Resources/Textures/Decals/bricktile.rsi/white_line_w.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_box.png b/Resources/Textures/Decals/minitile.rsi/dark_box.png
index 1e25897961e..87053060a3a 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_box.png and b/Resources/Textures/Decals/minitile.rsi/dark_box.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_corner_ne.png b/Resources/Textures/Decals/minitile.rsi/dark_corner_ne.png
index 000005cf10f..044d3ee58af 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_corner_ne.png and b/Resources/Textures/Decals/minitile.rsi/dark_corner_ne.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_corner_nw.png b/Resources/Textures/Decals/minitile.rsi/dark_corner_nw.png
index 428ce9c617f..92590b4a514 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_corner_nw.png and b/Resources/Textures/Decals/minitile.rsi/dark_corner_nw.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_corner_se.png b/Resources/Textures/Decals/minitile.rsi/dark_corner_se.png
index d369a1fee4e..8fe46845e13 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_corner_se.png and b/Resources/Textures/Decals/minitile.rsi/dark_corner_se.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_corner_sw.png b/Resources/Textures/Decals/minitile.rsi/dark_corner_sw.png
index bf3b1015df4..48e31919367 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_corner_sw.png and b/Resources/Textures/Decals/minitile.rsi/dark_corner_sw.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_end_e.png b/Resources/Textures/Decals/minitile.rsi/dark_end_e.png
index 15f5068670c..82b0087a037 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_end_e.png and b/Resources/Textures/Decals/minitile.rsi/dark_end_e.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_end_n.png b/Resources/Textures/Decals/minitile.rsi/dark_end_n.png
index 3bd2d26686b..b642ce1bf4b 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_end_n.png and b/Resources/Textures/Decals/minitile.rsi/dark_end_n.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_end_s.png b/Resources/Textures/Decals/minitile.rsi/dark_end_s.png
index 68b87cb6f32..114b1ac821b 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_end_s.png and b/Resources/Textures/Decals/minitile.rsi/dark_end_s.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_end_w.png b/Resources/Textures/Decals/minitile.rsi/dark_end_w.png
index d6e3ca96ea6..d9099511d8c 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_end_w.png and b/Resources/Textures/Decals/minitile.rsi/dark_end_w.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_inner_ne.png b/Resources/Textures/Decals/minitile.rsi/dark_inner_ne.png
index 82cfac92064..7dac62620b8 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_inner_ne.png and b/Resources/Textures/Decals/minitile.rsi/dark_inner_ne.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_inner_nw.png b/Resources/Textures/Decals/minitile.rsi/dark_inner_nw.png
index 6cebbf93f45..e3ef1166304 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_inner_nw.png and b/Resources/Textures/Decals/minitile.rsi/dark_inner_nw.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_inner_se.png b/Resources/Textures/Decals/minitile.rsi/dark_inner_se.png
index f6890fe52fe..3ddb20a5f4d 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_inner_se.png and b/Resources/Textures/Decals/minitile.rsi/dark_inner_se.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_inner_sw.png b/Resources/Textures/Decals/minitile.rsi/dark_inner_sw.png
index 0a5c96d7621..cc8919b283d 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_inner_sw.png and b/Resources/Textures/Decals/minitile.rsi/dark_inner_sw.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_line_e.png b/Resources/Textures/Decals/minitile.rsi/dark_line_e.png
index c50102d604c..544580f150f 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_line_e.png and b/Resources/Textures/Decals/minitile.rsi/dark_line_e.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_line_n.png b/Resources/Textures/Decals/minitile.rsi/dark_line_n.png
index e1ca99dbc64..ba8bb6a1769 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_line_n.png and b/Resources/Textures/Decals/minitile.rsi/dark_line_n.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_line_s.png b/Resources/Textures/Decals/minitile.rsi/dark_line_s.png
index 1005b61e533..d2419e8cd3b 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_line_s.png and b/Resources/Textures/Decals/minitile.rsi/dark_line_s.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/dark_line_w.png b/Resources/Textures/Decals/minitile.rsi/dark_line_w.png
index a53ed8a21c9..9f809bd964d 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/dark_line_w.png and b/Resources/Textures/Decals/minitile.rsi/dark_line_w.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/meta.json b/Resources/Textures/Decals/minitile.rsi/meta.json
index 313a68db1ac..50dd3a3a1b2 100644
--- a/Resources/Textures/Decals/minitile.rsi/meta.json
+++ b/Resources/Textures/Decals/minitile.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC0-1.0",
- "copyright": "Edited by Flareguy, originally created by github user @moonheart08",
+ "copyright": "Made by github user @Morb0",
"size": {
"x": 32,
"y": 32
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_box.png b/Resources/Textures/Decals/minitile.rsi/steel_box.png
index 25643de33c0..65bfc266e91 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_box.png and b/Resources/Textures/Decals/minitile.rsi/steel_box.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_corner_ne.png b/Resources/Textures/Decals/minitile.rsi/steel_corner_ne.png
index b11860e110e..0eaa625b811 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_corner_ne.png and b/Resources/Textures/Decals/minitile.rsi/steel_corner_ne.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_corner_nw.png b/Resources/Textures/Decals/minitile.rsi/steel_corner_nw.png
index 9cd5e7d03a4..8216073046e 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_corner_nw.png and b/Resources/Textures/Decals/minitile.rsi/steel_corner_nw.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_corner_se.png b/Resources/Textures/Decals/minitile.rsi/steel_corner_se.png
index 1446f6856ee..2535334eab0 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_corner_se.png and b/Resources/Textures/Decals/minitile.rsi/steel_corner_se.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_corner_sw.png b/Resources/Textures/Decals/minitile.rsi/steel_corner_sw.png
index 3d1a5dad3f4..81f8f263530 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_corner_sw.png and b/Resources/Textures/Decals/minitile.rsi/steel_corner_sw.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_end_e.png b/Resources/Textures/Decals/minitile.rsi/steel_end_e.png
index a01e46cc97f..a5bd0f3807f 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_end_e.png and b/Resources/Textures/Decals/minitile.rsi/steel_end_e.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_end_n.png b/Resources/Textures/Decals/minitile.rsi/steel_end_n.png
index 631f02a18a5..5ca76664588 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_end_n.png and b/Resources/Textures/Decals/minitile.rsi/steel_end_n.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_end_s.png b/Resources/Textures/Decals/minitile.rsi/steel_end_s.png
index 19eede5c2d1..58edc11fa10 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_end_s.png and b/Resources/Textures/Decals/minitile.rsi/steel_end_s.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_end_w.png b/Resources/Textures/Decals/minitile.rsi/steel_end_w.png
index 465299858c2..b03aa59c9c8 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_end_w.png and b/Resources/Textures/Decals/minitile.rsi/steel_end_w.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_inner_ne.png b/Resources/Textures/Decals/minitile.rsi/steel_inner_ne.png
index d8e5a50f8cf..b32452a8db8 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_inner_ne.png and b/Resources/Textures/Decals/minitile.rsi/steel_inner_ne.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_inner_nw.png b/Resources/Textures/Decals/minitile.rsi/steel_inner_nw.png
index ea84f9755ff..0bda9148f10 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_inner_nw.png and b/Resources/Textures/Decals/minitile.rsi/steel_inner_nw.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_inner_se.png b/Resources/Textures/Decals/minitile.rsi/steel_inner_se.png
index 7d29fb22571..de8f47511a8 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_inner_se.png and b/Resources/Textures/Decals/minitile.rsi/steel_inner_se.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_inner_sw.png b/Resources/Textures/Decals/minitile.rsi/steel_inner_sw.png
index d8fac15ac82..bdee5ab5e01 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_inner_sw.png and b/Resources/Textures/Decals/minitile.rsi/steel_inner_sw.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_line_e.png b/Resources/Textures/Decals/minitile.rsi/steel_line_e.png
index 3bdd0e2d4f7..ba161c6f186 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_line_e.png and b/Resources/Textures/Decals/minitile.rsi/steel_line_e.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_line_n.png b/Resources/Textures/Decals/minitile.rsi/steel_line_n.png
index 953586a1c50..f73aa627b9f 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_line_n.png and b/Resources/Textures/Decals/minitile.rsi/steel_line_n.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_line_s.png b/Resources/Textures/Decals/minitile.rsi/steel_line_s.png
index 89b0fe63f0b..fe8804e8c99 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_line_s.png and b/Resources/Textures/Decals/minitile.rsi/steel_line_s.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/steel_line_w.png b/Resources/Textures/Decals/minitile.rsi/steel_line_w.png
index 37a7a41a7f9..37f152f7ff1 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/steel_line_w.png and b/Resources/Textures/Decals/minitile.rsi/steel_line_w.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_box.png b/Resources/Textures/Decals/minitile.rsi/white_box.png
index 995c63267d0..b8f0174c49f 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_box.png and b/Resources/Textures/Decals/minitile.rsi/white_box.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_corner_ne.png b/Resources/Textures/Decals/minitile.rsi/white_corner_ne.png
index c584d398764..f0342975d29 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_corner_ne.png and b/Resources/Textures/Decals/minitile.rsi/white_corner_ne.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_corner_nw.png b/Resources/Textures/Decals/minitile.rsi/white_corner_nw.png
index 04cdc186e58..8d751af952e 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_corner_nw.png and b/Resources/Textures/Decals/minitile.rsi/white_corner_nw.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_corner_se.png b/Resources/Textures/Decals/minitile.rsi/white_corner_se.png
index be5170a0e22..54eea747f03 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_corner_se.png and b/Resources/Textures/Decals/minitile.rsi/white_corner_se.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_corner_sw.png b/Resources/Textures/Decals/minitile.rsi/white_corner_sw.png
index 756200c2631..b57417997e5 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_corner_sw.png and b/Resources/Textures/Decals/minitile.rsi/white_corner_sw.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_end_e.png b/Resources/Textures/Decals/minitile.rsi/white_end_e.png
index 3fd25f45991..e256a862352 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_end_e.png and b/Resources/Textures/Decals/minitile.rsi/white_end_e.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_end_n.png b/Resources/Textures/Decals/minitile.rsi/white_end_n.png
index edc8a69135d..a8ba5574771 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_end_n.png and b/Resources/Textures/Decals/minitile.rsi/white_end_n.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_end_s.png b/Resources/Textures/Decals/minitile.rsi/white_end_s.png
index ca2528efd15..55823a70963 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_end_s.png and b/Resources/Textures/Decals/minitile.rsi/white_end_s.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_end_w.png b/Resources/Textures/Decals/minitile.rsi/white_end_w.png
index b669f8e54dc..d570b8c404d 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_end_w.png and b/Resources/Textures/Decals/minitile.rsi/white_end_w.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_inner_ne.png b/Resources/Textures/Decals/minitile.rsi/white_inner_ne.png
index 7f8448e5026..76733f6c224 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_inner_ne.png and b/Resources/Textures/Decals/minitile.rsi/white_inner_ne.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_inner_nw.png b/Resources/Textures/Decals/minitile.rsi/white_inner_nw.png
index 5e75689308a..b368cd57316 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_inner_nw.png and b/Resources/Textures/Decals/minitile.rsi/white_inner_nw.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_inner_se.png b/Resources/Textures/Decals/minitile.rsi/white_inner_se.png
index 82013151cb9..819ebfa14df 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_inner_se.png and b/Resources/Textures/Decals/minitile.rsi/white_inner_se.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_inner_sw.png b/Resources/Textures/Decals/minitile.rsi/white_inner_sw.png
index 7b3b53dde22..dbcb0a02d40 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_inner_sw.png and b/Resources/Textures/Decals/minitile.rsi/white_inner_sw.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_line_e.png b/Resources/Textures/Decals/minitile.rsi/white_line_e.png
index 99edbdd838e..8b81f033897 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_line_e.png and b/Resources/Textures/Decals/minitile.rsi/white_line_e.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_line_n.png b/Resources/Textures/Decals/minitile.rsi/white_line_n.png
index 6846ec65fed..be0a78eb007 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_line_n.png and b/Resources/Textures/Decals/minitile.rsi/white_line_n.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_line_s.png b/Resources/Textures/Decals/minitile.rsi/white_line_s.png
index 54749e90f58..d825870a08c 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_line_s.png and b/Resources/Textures/Decals/minitile.rsi/white_line_s.png differ
diff --git a/Resources/Textures/Decals/minitile.rsi/white_line_w.png b/Resources/Textures/Decals/minitile.rsi/white_line_w.png
index 663ee84761e..53b8223cb19 100644
Binary files a/Resources/Textures/Decals/minitile.rsi/white_line_w.png and b/Resources/Textures/Decals/minitile.rsi/white_line_w.png differ
diff --git a/Resources/Textures/Interface/language.png b/Resources/Textures/Interface/language.png
new file mode 100644
index 00000000000..2b39424d12d
Binary files /dev/null and b/Resources/Textures/Interface/language.png differ
diff --git a/Resources/Textures/Objects/Devices/translator.rsi/icon.png b/Resources/Textures/Objects/Devices/translator.rsi/icon.png
new file mode 100644
index 00000000000..6871c808ccd
Binary files /dev/null and b/Resources/Textures/Objects/Devices/translator.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Devices/translator.rsi/meta.json b/Resources/Textures/Objects/Devices/translator.rsi/meta.json
new file mode 100644
index 00000000000..0202c0c39c7
--- /dev/null
+++ b/Resources/Textures/Objects/Devices/translator.rsi/meta.json
@@ -0,0 +1,17 @@
+{
+ "version": 2,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "baystation12",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "translator"
+ }
+ ]
+}
diff --git a/Resources/Textures/Objects/Devices/translator.rsi/translator.png b/Resources/Textures/Objects/Devices/translator.rsi/translator.png
new file mode 100644
index 00000000000..6c54a0b8636
Binary files /dev/null and b/Resources/Textures/Objects/Devices/translator.rsi/translator.png differ
diff --git a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_closed.png b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_closed.png
index 7c99615ffec..b84389a06bd 100644
Binary files a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_closed.png and b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_closed.png differ
diff --git a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_open.png b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_open.png
index 7909d14f269..0cf52827fca 100644
Binary files a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_open.png and b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_open.png differ
diff --git a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json
index 990bbf93567..2e60d4f4041 100644
--- a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json
+++ b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from https://github.com/tgstation/tgstation at commit 9bebd81ae0b0a7f952b59886a765c681205de31f",
+ "copyright": "Taken from https://github.com/ParadiseSS13/Paradise // Hand Sprites taken from https://github.com/tgstation/tgstation at commit 9bebd81ae0b0a7f952b59886a765c681205de31f",
"size": {
"x": 32,
"y": 32
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_capacitor.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_capacitor.png
index 039817e37b9..2be12b48a64 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_capacitor.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_capacitor.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_scan_module.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_scan_module.png
index 1871b477b63..0ee37e653da 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_scan_module.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_scan_module.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/advanced_matter_bin.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/advanced_matter_bin.png
index 819275417ba..7533331b835 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/advanced_matter_bin.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/advanced_matter_bin.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/bluespace_matter_bin.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/bluespace_matter_bin.png
index ba244f3f297..56d1aa2a36a 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/bluespace_matter_bin.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/bluespace_matter_bin.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/capacitor.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/capacitor.png
index 305087c37b6..242f217e4af 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/capacitor.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/capacitor.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/femto_mani.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/femto_mani.png
index f7e231248e5..04057ffa822 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/femto_mani.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/femto_mani.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/high_micro_laser.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/high_micro_laser.png
index 2bd8d3837da..c23c941e150 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/high_micro_laser.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/high_micro_laser.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/matter_bin.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/matter_bin.png
index c4603632dff..494582986fd 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/matter_bin.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/matter_bin.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/meta.json b/Resources/Textures/Objects/Misc/stock_parts.rsi/meta.json
index fac73084019..50a7fd96d53 100644
--- a/Resources/Textures/Objects/Misc/stock_parts.rsi/meta.json
+++ b/Resources/Textures/Objects/Misc/stock_parts.rsi/meta.json
@@ -5,7 +5,7 @@
"y": 32
},
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from https://github.com/tgstation/tgstation at 0d9c9a8233dfc3fc55edc538955a761a6328bee0, micro_mani by EmoGarbage404 (github)",
+ "copyright": "Taken from https://github.com/tgstation/tgstation at 0d9c9a8233dfc3fc55edc538955a761a6328bee0 // Taken from https://github.com/ParadiseSS13/Paradise/",
"states": [
{
"name": "adv_capacitor"
@@ -27,6 +27,7 @@
0.1,
0.1,
0.1,
+ 0.1,
0.1
]
]
@@ -53,7 +54,13 @@
"name": "bluespace_matter_bin",
"delays": [
[
- 0.3,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
0.1,
0.1,
0.1
@@ -146,15 +153,7 @@
]
},
{
- "name": "femto_mani",
- "delays": [
- [
- 0.3,
- 0.1,
- 0.1,
- 0.1
- ]
- ]
+ "name": "femto_mani"
},
{
"name": "hdd1"
@@ -184,24 +183,10 @@
"name": "pico_mani"
},
{
- "name": "quadratic_capacitor",
- "delays": [
- [
- 0.3,
- 0.1,
- 0.1,
- 0.1
- ]
- ]
+ "name": "quadratic_capacitor"
},
{
- "name": "quadultra_micro_laser",
- "delays": [
- [
- 0.1,
- 0.1
- ]
- ]
+ "name": "quadultra_micro_laser"
},
{
"name": "rom1"
@@ -222,7 +207,6 @@
0.1,
0.1,
0.1,
- 0.1,
0.1
]
]
@@ -260,7 +244,15 @@
"name": "super_matter_bin"
},
{
- "name": "super_scan_module"
+ "name": "super_scan_module",
+ "delays": [
+ [
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1
+ ]
+ ]
},
{
"name": "treatment_disk"
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_laser.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_laser.png
index c23eea56f85..0bf4296e9b3 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_laser.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_laser.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_mani.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_mani.png
index 8dca252f688..c63b141f11d 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_mani.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_mani.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/nano_mani.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/nano_mani.png
index 93b2d06f098..0c3defdefa4 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/nano_mani.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/nano_mani.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/pico_mani.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/pico_mani.png
index f3d1ff54dc9..2da4e416464 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/pico_mani.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/pico_mani.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/quadratic_capacitor.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/quadratic_capacitor.png
index 11633f753de..0cb5de4a3fd 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/quadratic_capacitor.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/quadratic_capacitor.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/quadultra_micro_laser.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/quadultra_micro_laser.png
index cc907fa5e26..b3bbe275e15 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/quadultra_micro_laser.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/quadultra_micro_laser.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/scan_module.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/scan_module.png
index b95b803d8f7..a05d626eea0 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/scan_module.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/scan_module.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_capacitor.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_capacitor.png
index d6d1f9d555a..054299f6d7a 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_capacitor.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_capacitor.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_matter_bin.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_matter_bin.png
index 54678e59150..b56c920f7be 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_matter_bin.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_matter_bin.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_scan_module.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_scan_module.png
index 240ab514d76..7fa4ceedfbd 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_scan_module.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_scan_module.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/triphasic_scan_module.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/triphasic_scan_module.png
index d3e7d72b57d..e2fd4e6fbff 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/triphasic_scan_module.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/triphasic_scan_module.png differ
diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/ultra_high_micro_laser.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/ultra_high_micro_laser.png
index 3e65d639a5e..6aec80e9dd5 100644
Binary files a/Resources/Textures/Objects/Misc/stock_parts.rsi/ultra_high_micro_laser.png and b/Resources/Textures/Objects/Misc/stock_parts.rsi/ultra_high_micro_laser.png differ
diff --git a/Resources/Textures/Objects/Tanks/anesthetic.rsi/icon.png b/Resources/Textures/Objects/Tanks/anesthetic.rsi/icon.png
index 027abc289fe..3ef540f37f7 100644
Binary files a/Resources/Textures/Objects/Tanks/anesthetic.rsi/icon.png and b/Resources/Textures/Objects/Tanks/anesthetic.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Tanks/emergency.rsi/icon.png b/Resources/Textures/Objects/Tanks/emergency.rsi/icon.png
index a1f124628be..1b7042332d0 100644
Binary files a/Resources/Textures/Objects/Tanks/emergency.rsi/icon.png and b/Resources/Textures/Objects/Tanks/emergency.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Tanks/emergency_double.rsi/icon.png b/Resources/Textures/Objects/Tanks/emergency_double.rsi/icon.png
index 78f1677a2b4..7a604ad671d 100644
Binary files a/Resources/Textures/Objects/Tanks/emergency_double.rsi/icon.png and b/Resources/Textures/Objects/Tanks/emergency_double.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Tanks/emergency_double_red.rsi/icon.png b/Resources/Textures/Objects/Tanks/emergency_double_red.rsi/icon.png
index 584a122e5bf..7f1735f36f5 100644
Binary files a/Resources/Textures/Objects/Tanks/emergency_double_red.rsi/icon.png and b/Resources/Textures/Objects/Tanks/emergency_double_red.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Tanks/emergency_extended.rsi/icon.png b/Resources/Textures/Objects/Tanks/emergency_extended.rsi/icon.png
index ab8bebedb66..2b73dad0b5b 100644
Binary files a/Resources/Textures/Objects/Tanks/emergency_extended.rsi/icon.png and b/Resources/Textures/Objects/Tanks/emergency_extended.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Tanks/emergency_extended_red.rsi/icon.png b/Resources/Textures/Objects/Tanks/emergency_extended_red.rsi/icon.png
index 8ea77e5c6c0..67d4bb4eb67 100644
Binary files a/Resources/Textures/Objects/Tanks/emergency_extended_red.rsi/icon.png and b/Resources/Textures/Objects/Tanks/emergency_extended_red.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Tanks/emergency_red.rsi/icon.png b/Resources/Textures/Objects/Tanks/emergency_red.rsi/icon.png
index 4fd5f559aca..cf68a7c1c7f 100644
Binary files a/Resources/Textures/Objects/Tanks/emergency_red.rsi/icon.png and b/Resources/Textures/Objects/Tanks/emergency_red.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Tanks/emergency_yellow.rsi/icon.png b/Resources/Textures/Objects/Tanks/emergency_yellow.rsi/icon.png
index ab8bebedb66..9fb5c277bf8 100644
Binary files a/Resources/Textures/Objects/Tanks/emergency_yellow.rsi/icon.png and b/Resources/Textures/Objects/Tanks/emergency_yellow.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Tanks/generic.rsi/icon.png b/Resources/Textures/Objects/Tanks/generic.rsi/icon.png
index 0202db50aad..1074a9dffa8 100644
Binary files a/Resources/Textures/Objects/Tanks/generic.rsi/icon.png and b/Resources/Textures/Objects/Tanks/generic.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Tanks/oxygen.rsi/icon.png b/Resources/Textures/Objects/Tanks/oxygen.rsi/icon.png
index 95c148e604f..79646901906 100644
Binary files a/Resources/Textures/Objects/Tanks/oxygen.rsi/icon.png and b/Resources/Textures/Objects/Tanks/oxygen.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Tanks/plasma.rsi/icon.png b/Resources/Textures/Objects/Tanks/plasma.rsi/icon.png
index a7fdcf8f676..2eb105e1cc1 100644
Binary files a/Resources/Textures/Objects/Tanks/plasma.rsi/icon.png and b/Resources/Textures/Objects/Tanks/plasma.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Tanks/red.rsi/icon.png b/Resources/Textures/Objects/Tanks/red.rsi/icon.png
index eb8ed16dce3..ec40cb38723 100644
Binary files a/Resources/Textures/Objects/Tanks/red.rsi/icon.png and b/Resources/Textures/Objects/Tanks/red.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/meta.json
index fc15bfadef2..d75e46fbf42 100644
--- a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/meta.json
+++ b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d",
+ "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/ // Hands sprites taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d",
"size": {
"x": 32,
"y": 32
diff --git a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_nocell.png b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_nocell.png
index 8c4fbac7fdb..bf08ef9cc76 100644
Binary files a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_nocell.png and b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_nocell.png differ
diff --git a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_off.png b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_off.png
index 59940f44ca4..8704ab6bcfc 100644
Binary files a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_off.png and b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_off.png differ
diff --git a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_on.png b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_on.png
index 2132190ad45..2adbe76e9e1 100644
Binary files a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_on.png and b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_on.png differ
diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner.png
index 8daa67ae23e..8db1e80fdd1 100644
Binary files a/Resources/Textures/Structures/Decoration/banner.rsi/banner.png and b/Resources/Textures/Structures/Decoration/banner.rsi/banner.png differ
diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_cargo.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_cargo.png
index ff808bbc8bb..899c8d6e4cb 100644
Binary files a/Resources/Textures/Structures/Decoration/banner.rsi/banner_cargo.png and b/Resources/Textures/Structures/Decoration/banner.rsi/banner_cargo.png differ
diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_engineering.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_engineering.png
index da76b044c1e..e45b9e35303 100644
Binary files a/Resources/Textures/Structures/Decoration/banner.rsi/banner_engineering.png and b/Resources/Textures/Structures/Decoration/banner.rsi/banner_engineering.png differ
diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_medical.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_medical.png
index 5bbd100773c..c2dc11d21bf 100644
Binary files a/Resources/Textures/Structures/Decoration/banner.rsi/banner_medical.png and b/Resources/Textures/Structures/Decoration/banner.rsi/banner_medical.png differ
diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_science.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_science.png
index 8ae607cdcd4..1da59b8a315 100644
Binary files a/Resources/Textures/Structures/Decoration/banner.rsi/banner_science.png and b/Resources/Textures/Structures/Decoration/banner.rsi/banner_science.png differ
diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_security.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_security.png
index 42114c515b2..cfd18620e04 100644
Binary files a/Resources/Textures/Structures/Decoration/banner.rsi/banner_security.png and b/Resources/Textures/Structures/Decoration/banner.rsi/banner_security.png differ
diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_syndicate.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_syndicate.png
index c8424057d02..6b39694e7a7 100644
Binary files a/Resources/Textures/Structures/Decoration/banner.rsi/banner_syndicate.png and b/Resources/Textures/Structures/Decoration/banner.rsi/banner_syndicate.png differ
diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/meta.json b/Resources/Textures/Structures/Decoration/banner.rsi/meta.json
index 2de33ea0290..2df45b016ce 100644
--- a/Resources/Textures/Structures/Decoration/banner.rsi/meta.json
+++ b/Resources/Textures/Structures/Decoration/banner.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "https://github.com/tgstation/tgstation/commit/fa9e44d937026d5a2ba72615afccf2f18a87c485 | banner_syndicate sprited by mureixlol (Discord)",
+ "copyright": "Taken from https://github.com/ParadiseSS13/Paradise // banner_revolution, banner-red, banner-blue, banner-yellow, banner-green Taken from https://github.com/tgstation/tgstation/commit/fa9e44d937026d5a2ba72615afccf2f18a87c485",
"size": {
"x": 32,
"y": 32
diff --git a/Resources/Textures/Structures/Furniture/furniture.rsi/meta.json b/Resources/Textures/Structures/Furniture/furniture.rsi/meta.json
index 1f7049dfbe1..5afc1b2b0f1 100644
--- a/Resources/Textures/Structures/Furniture/furniture.rsi/meta.json
+++ b/Resources/Textures/Structures/Furniture/furniture.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d5cb4288ec5f7cb9fb5b6f6e798f4c64cd82cd09, Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/9d7ff729b6b89eee0b3d750327f9fbaff4aeb045",
+ "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d5cb4288ec5f7cb9fb5b6f6e798f4c64cd82cd09, Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/9d7ff729b6b89eee0b3d750327f9fbaff4aeb045, Taken from https://github.com/ParadiseSS13/Paradise",
"size": {
"x": 32,
"y": 32
@@ -29,4 +29,4 @@
"name": "dresser"
}
]
-}
\ No newline at end of file
+}
diff --git a/Resources/Textures/Structures/Furniture/furniture.rsi/rack.png b/Resources/Textures/Structures/Furniture/furniture.rsi/rack.png
index b299cc49e14..cb146b54125 100644
Binary files a/Resources/Textures/Structures/Furniture/furniture.rsi/rack.png and b/Resources/Textures/Structures/Furniture/furniture.rsi/rack.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o0.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o0.png
index 5eefb01db6a..2cf968a8c32 100644
Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o0.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o0.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o1.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o1.png
index 1902bbd8b96..3d461d60296 100644
Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o1.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o1.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o2.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o2.png
index 57a1eaa3abf..ef543a5e09e 100644
Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o2.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o2.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o3.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o3.png
index 3522af81e5c..4e1dc10c29a 100644
Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o3.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o3.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-tank.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-tank.png
index 4d5049f7b4e..a48466d3b46 100644
Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-tank.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-tank.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_active.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_active.png
index 134c51bccb0..184b8801124 100644
Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_active.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_active.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_deactive.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_deactive.png
index e40e276e040..420179558ca 100644
Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_deactive.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_deactive.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_off.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_off.png
index a3cac04acb3..9da9ba51a10 100644
Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_off.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_off.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_on.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_on.png
index b9a49e1ec98..eb8cbc1f818 100644
Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_on.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_on.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/cu.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/cu.png
index 896c844149d..9da9ba51a10 100644
Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/cu.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/cu.png differ
diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json
index 1da3a0a7336..1c8714a8dbe 100644
--- a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json
+++ b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from goonstation at https://github.com/goonstation/goonstation/commit/cbe076402ed43b1cd861295bbcb95608c453de7a. Edited by chromiumboy",
+ "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/. Edited by FoxxoTrystan",
"size": {
"x": 32,
"y": 32
diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/static.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/static.png
index 6097982ee26..7d8c7a8c49c 100644
Binary files a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/static.png and b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/static.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/black-1.png b/Resources/Textures/Structures/Storage/canister.rsi/black-1.png
index 791f22c9585..2f7fc54a31d 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/black-1.png and b/Resources/Textures/Structures/Storage/canister.rsi/black-1.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/black.png b/Resources/Textures/Structures/Storage/canister.rsi/black.png
index c7c4d4732e8..2b07b2b087d 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/black.png and b/Resources/Textures/Structures/Storage/canister.rsi/black.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/blue-1.png b/Resources/Textures/Structures/Storage/canister.rsi/blue-1.png
index f07bedd7eab..1cb0f83ebf1 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/blue-1.png and b/Resources/Textures/Structures/Storage/canister.rsi/blue-1.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/blue.png b/Resources/Textures/Structures/Storage/canister.rsi/blue.png
index 412994d96c8..c39f1ff26e9 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/blue.png and b/Resources/Textures/Structures/Storage/canister.rsi/blue.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/can-connector.png b/Resources/Textures/Structures/Storage/canister.rsi/can-connector.png
index 7996e1b26db..9360a41c58b 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/can-connector.png and b/Resources/Textures/Structures/Storage/canister.rsi/can-connector.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/can-o0.png b/Resources/Textures/Structures/Storage/canister.rsi/can-o0.png
index 5f13bbacae6..89f617973f8 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/can-o0.png and b/Resources/Textures/Structures/Storage/canister.rsi/can-o0.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/can-o1.png b/Resources/Textures/Structures/Storage/canister.rsi/can-o1.png
index 2e548fcaca2..6f9566ee13c 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/can-o1.png and b/Resources/Textures/Structures/Storage/canister.rsi/can-o1.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/can-o2.png b/Resources/Textures/Structures/Storage/canister.rsi/can-o2.png
index 094ee1e3c60..1a0a4023636 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/can-o2.png and b/Resources/Textures/Structures/Storage/canister.rsi/can-o2.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/can-o3.png b/Resources/Textures/Structures/Storage/canister.rsi/can-o3.png
index 014ed7833d4..87a68af474a 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/can-o3.png and b/Resources/Textures/Structures/Storage/canister.rsi/can-o3.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/can-oa1.png b/Resources/Textures/Structures/Storage/canister.rsi/can-oa1.png
index 8153aa5ae7d..8489866f74b 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/can-oa1.png and b/Resources/Textures/Structures/Storage/canister.rsi/can-oa1.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/can-open.png b/Resources/Textures/Structures/Storage/canister.rsi/can-open.png
index 67f9117ebd8..61d286efb55 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/can-open.png and b/Resources/Textures/Structures/Storage/canister.rsi/can-open.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/darkblue-1.png b/Resources/Textures/Structures/Storage/canister.rsi/darkblue-1.png
index c8bea6c38af..1cb0f83ebf1 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/darkblue-1.png and b/Resources/Textures/Structures/Storage/canister.rsi/darkblue-1.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/darkblue.png b/Resources/Textures/Structures/Storage/canister.rsi/darkblue.png
index 06a097b0bd1..f664d0f3bf0 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/darkblue.png and b/Resources/Textures/Structures/Storage/canister.rsi/darkblue.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/frezon-1.png b/Resources/Textures/Structures/Storage/canister.rsi/frezon-1.png
index 7c02c3993e0..1cb0f83ebf1 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/frezon-1.png and b/Resources/Textures/Structures/Storage/canister.rsi/frezon-1.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/frezon.png b/Resources/Textures/Structures/Storage/canister.rsi/frezon.png
index 37b05e7c833..c39f1ff26e9 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/frezon.png and b/Resources/Textures/Structures/Storage/canister.rsi/frezon.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/grey-1.png b/Resources/Textures/Structures/Storage/canister.rsi/grey-1.png
index 1782cc29e89..d7bef4b366c 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/grey-1.png and b/Resources/Textures/Structures/Storage/canister.rsi/grey-1.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/grey.png b/Resources/Textures/Structures/Storage/canister.rsi/grey.png
index f7ef5a60f9a..6668cd6789b 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/grey.png and b/Resources/Textures/Structures/Storage/canister.rsi/grey.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/meta.json b/Resources/Textures/Structures/Storage/canister.rsi/meta.json
index 95d67cc8ae1..7c2915a3a7b 100644
--- a/Resources/Textures/Structures/Storage/canister.rsi/meta.json
+++ b/Resources/Textures/Structures/Storage/canister.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Frezon canister modified from tgstation, the rest are taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8581a636acfc1517611a680b7711a74fc7ef335",
+ "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/",
"size": {
"x": 32,
"y": 32
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/orange-1.png b/Resources/Textures/Structures/Storage/canister.rsi/orange-1.png
index 4d0714e5457..136b36ca3cd 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/orange-1.png and b/Resources/Textures/Structures/Storage/canister.rsi/orange-1.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/orange.png b/Resources/Textures/Structures/Storage/canister.rsi/orange.png
index 2c8b6b429fe..7681cc2f064 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/orange.png and b/Resources/Textures/Structures/Storage/canister.rsi/orange.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/red-1.png b/Resources/Textures/Structures/Storage/canister.rsi/red-1.png
index 0f43f9d1421..84ccd606c9d 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/red-1.png and b/Resources/Textures/Structures/Storage/canister.rsi/red-1.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/red.png b/Resources/Textures/Structures/Storage/canister.rsi/red.png
index 4e1a047b387..3ee22dae499 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/red.png and b/Resources/Textures/Structures/Storage/canister.rsi/red.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/redws-1.png b/Resources/Textures/Structures/Storage/canister.rsi/redws-1.png
index d5c412875d8..5f924fffce0 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/redws-1.png and b/Resources/Textures/Structures/Storage/canister.rsi/redws-1.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/redws.png b/Resources/Textures/Structures/Storage/canister.rsi/redws.png
index 8390cb6539a..63065177708 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/redws.png and b/Resources/Textures/Structures/Storage/canister.rsi/redws.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/water_vapor-1.png b/Resources/Textures/Structures/Storage/canister.rsi/water_vapor-1.png
index ec8c065097e..2f7fc54a31d 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/water_vapor-1.png and b/Resources/Textures/Structures/Storage/canister.rsi/water_vapor-1.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/water_vapor.png b/Resources/Textures/Structures/Storage/canister.rsi/water_vapor.png
index ee8b7979ce9..993c5ac4ff6 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/water_vapor.png and b/Resources/Textures/Structures/Storage/canister.rsi/water_vapor.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/yellow-1.png b/Resources/Textures/Structures/Storage/canister.rsi/yellow-1.png
index 3937104ebe7..c12694850d3 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/yellow-1.png and b/Resources/Textures/Structures/Storage/canister.rsi/yellow-1.png differ
diff --git a/Resources/Textures/Structures/Storage/canister.rsi/yellow.png b/Resources/Textures/Structures/Storage/canister.rsi/yellow.png
index 595ceb298b0..fc98a456822 100644
Binary files a/Resources/Textures/Structures/Storage/canister.rsi/yellow.png and b/Resources/Textures/Structures/Storage/canister.rsi/yellow.png differ
diff --git a/Resources/Textures/Structures/Wallmounts/screen.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/screen.rsi/meta.json
index a4c3148aa8e..25f0d7f1981 100644
--- a/Resources/Textures/Structures/Wallmounts/screen.rsi/meta.json
+++ b/Resources/Textures/Structures/Wallmounts/screen.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "From vgstation: https://github.com/vgstation-coders/vgstation13/commit/a7290010020e541ed6b57817a07023ca6bef26fe#diff-20395160138bed693d15eee6f16d671531b5fa533ec52c50e8df6d52370dbecd",
+ "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/",
"size": {
"x": 32,
"y": 32
diff --git a/Resources/Textures/Structures/Wallmounts/screen.rsi/screen.png b/Resources/Textures/Structures/Wallmounts/screen.rsi/screen.png
index a3e7a3fe55a..6b6329e83d0 100644
Binary files a/Resources/Textures/Structures/Wallmounts/screen.rsi/screen.png and b/Resources/Textures/Structures/Wallmounts/screen.rsi/screen.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/full.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/full.png
index bac03f82f18..31911eddb81 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/full.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/full.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/meta.json b/Resources/Textures/Structures/Walls/solid_rust.rsi/meta.json
index af5ebe04cf7..3b1da2fdae0 100644
--- a/Resources/Textures/Structures/Walls/solid_rust.rsi/meta.json
+++ b/Resources/Textures/Structures/Walls/solid_rust.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from https://github.com/tgstation/tgstation/commit/67a5373b4649937dd63dd94153e05e8506f40a5d and modified.",
+ "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/ and modified by FoxxoTrystan.",
"size": {
"x": 32,
"y": 32
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-0.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-0.png
index 3af17740393..81f7b75d7bb 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-0.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-0.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-1.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-1.png
index 57f9a29657b..69acb771155 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-1.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-1.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-2.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-2.png
index 122fb413982..63c1502b8a7 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-2.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-2.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-3.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-3.png
index 2e7be27dd05..ad5094443b9 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-3.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-3.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-4.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-4.png
index 48a07386adb..50b465c63be 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-4.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-4.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-5.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-5.png
index 0969ca3ecd7..c6d8dacab13 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-5.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-5.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over0.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over0.png
index 89314482b3a..ce5adc65b5d 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over0.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over0.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over1.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over1.png
index 79fb38bd6ac..dd8b232de26 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over1.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over1.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over2.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over2.png
index 89314482b3a..ce5adc65b5d 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over2.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over2.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over3.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over3.png
index 79fb38bd6ac..dd8b232de26 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over3.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over3.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over4.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over4.png
index 3fd3d1f3a26..e6c25bf9542 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over4.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over4.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over5.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over5.png
index a9d7e717378..d0384e6f2b4 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over5.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over5.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over6.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over6.png
index 3fd3d1f3a26..e6c25bf9542 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over6.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over6.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over7.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over7.png
index 970ef1f1f5d..45a43655f63 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over7.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over7.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/rgeneric.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/rgeneric.png
index 02a1c5c63bb..81f7b75d7bb 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/rgeneric.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/rgeneric.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid0.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid0.png
index b6720ad5a32..a82cf053371 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid0.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid0.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid1.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid1.png
index 9d1da43e6f0..88c852b3963 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid1.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid1.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid2.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid2.png
index b6720ad5a32..a82cf053371 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid2.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid2.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid3.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid3.png
index 9d1da43e6f0..88c852b3963 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid3.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid3.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid4.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid4.png
index f31f3a6bc98..ba6ac0281f9 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid4.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid4.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid5.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid5.png
index 7c18f9c11a7..d0384e6f2b4 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid5.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid5.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid6.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid6.png
index 8737894cbf0..ba6ac0281f9 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid6.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid6.png differ
diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid7.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid7.png
index 15f74bcaeed..45a43655f63 100644
Binary files a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid7.png and b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid7.png differ
diff --git a/Resources/Textures/Tiles/arcadeblue2.png b/Resources/Textures/Tiles/arcadeblue2.png
index 013af9f36f7..3def0f19c7e 100644
Binary files a/Resources/Textures/Tiles/arcadeblue2.png and b/Resources/Textures/Tiles/arcadeblue2.png differ
diff --git a/Resources/Textures/Tiles/attributions.yml b/Resources/Textures/Tiles/attributions.yml
index 7cfe5535a0a..124113a9032 100644
--- a/Resources/Textures/Tiles/attributions.yml
+++ b/Resources/Textures/Tiles/attributions.yml
@@ -6,27 +6,22 @@
copyright: "CEV-Eris commit 28e589f0ff72a009adf17db767e90be39054f0f2"
source: "https://github.com/discordia-space/CEV-Eris/"
-- files: ["plating.png"]
- license: "CC-BY-SA-3.0"
- copyright: "Taken from CEV-Eris commit 8e74e4370f4d5885f15c3f834973b1223ddb8b1b, modified by github user @Flareguy"
- source: "https://github.com/discordia-space/CEV-Eris/"
-
-- files: ["plating_damaged.png", "plating_burnt.png"]
- license: "CC-BY-SA-3.0"
- copyright: "Modified by github user @Flareguy from plating.png, using damaged plating sprites from /tg/station at commit https://github.com/tgstation/tgstation/blob/6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae/icons/turf/floors.dmi"
- source: "https://github.com/space-wizards/space-station-14/pull/21711"
-
-- files: [ "asteroid_red.png", "asteroid_tile.png", "elevator_shaft.png", "freezer.png", "green_circuit.png", "lino.png", "mono.png", "rock_vault.png", "showroom.png"]
+- files: [ "asteroid_red.png", "asteroid_tile.png", "elevator_shaft.png", "freezer.png", "lino.png", "mono.png", "rock_vault.png", "showroom.png"]
license: "CC-BY-SA-3.0"
copyright: "vgstation13 at roughly commit e4d3ea7f69d21c3667be12b114fa935c4640cb05, asteroid_red and asteroid_tile taken from commit /vg/station at commit 02b9f6894af4419c9f7e699a22c402b086d8067e."
source: "https://github.com/vgstation-coders/vgstation13"
-
+
- files: [ "asteroid.png", "asteroid_dug.png", "asteroid0.png"]
license: "CC-BY-SA-3.0"
copyright: "Taken from /tg/station at commit 6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae."
source: "https://github.com/tgstation/tgstation/"
-- files: ["blue_circuit.png", "cropped_parallax.png", "eighties.png", "gold.png", "grass.png", "ironsand1.png", "ironsand2.png", "ironsand3.png", "ironsand4.png", "junglegrass.png", "lattice.png", "reinforced.png", "silver.png", "snow.png", "wood.png"]
+- files: ["steel.png", "dark.png", "hydro.png", "plating.png", "reinforced.png", "steel_dirty.png", "white.png", "bar.png", "laundry.png", "mime.png", "clown.png", "kitchen.png"]
+ license: "CC-BY-SA-3.0"
+ copyright: "TauCetiStation commit 4cd533cf0a4243050364023af9a4fcaca209dce7"
+ source: "https://github.com/TauCetiStation/TauCetiClassic/"
+
+- files: ["cropped_parallax.png", "eighties.png", "gold.png", "grass.png", "ironsand1.png", "ironsand2.png", "ironsand3.png", "ironsand4.png", "junglegrass.png", "lattice.png", "plating.png", "reinforced.png", "silver.png", "snow.png", "wood.png"]
license: "CC-BY-SA-3.0"
copyright: "tgstation commit 8abb19545828230d92ba18827feeb42a67a55d49, cropped_parallax modified from parallax."
source: "https://github.com/tgstation/tgstation/"
@@ -40,7 +35,7 @@
license: "CC-BY-SA-3.0"
copyright: "Modified from plating.png by github user @Flareguy"
source: "https://github.com/space-wizards/space-station-14/"
-
+
- files: ["rglass.png"]
license: "CC-BY-SA-3.0"
copyright: "tgstation commit 8abb19545828230d92ba18827feeb42a67a55d49, rglass modified by github user @notquitehadouken."
@@ -51,6 +46,16 @@
copyright: "Created by github user @notquitehadouken."
source: "https://github.com/space-wizards/space-station-14/pull/17948"
+- files: [ "steel_diagonal.png", "steel_mini.png", "steel_offset.png", "steel_pavement.png", "white_diagonal.png", "white_mini.png", "white_offset.png", "white_pavement.png", "white_plastic.png", "dark_diagonal.png", "dark_mini.png", "dark_offset.png", "dark_pavement.png", "dark_plastic.png" ]
+ license: "CC0-1.0"
+ copyright: "Created by github user @morb0"
+ source: "https://github.com/space-syndicate/space-station-14/pull/489"
+
+- files: [ "cafeteria.png", "checker_dark.png" ]
+ license: "CC-BY-SA-3.0"
+ copyright: "Created by github user @Flareguy, original, unedited base tiles modified from /tg/station at commit 6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae and github user @moonheart08"
+ source: "https://github.com/space-wizards/space-station-14/"
+
- files: [ "bar.png", "lime.png", "blue.png", "kitchen.png", "laundry.png", "mime.png", "steel.png", "steel_dirty.png", "steel_diagonal.png", "steel_mini.png", "steel_offset.png", "steel_pavement.png", "white.png", "white_diagonal.png", "white_mini.png", "white_offset.png", "white_pavement.png", "dark.png", "dark_diagonal.png", "dark_mini.png", "dark_offset.png", "dark_pavement.png", "hydro.png", "plastic.png", "dark_plastic.png", "white_plastic.png", "cafeteria.png", "checker_dark.png", "clown.png" ]
license: "CC-BY-SA-3.0"
copyright: "Created by github user @Flareguy, original, unedited base tiles modified from /tg/station at commit 6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae and github user @moonheart08"
@@ -61,14 +66,14 @@
copyright: "arcadered renamed from eightiesred, arcadeblue by Peptide90 modified from arcadered.png, tgstation commit 8abb19545828230d92ba18827feeb42a67a55d49"
source: "https://github.com/tgstation/tgstation/"
-- files: ["hull", "hull_reinforced.png", "steel_damaged.png", "steel_burnt.png"]
+- files: ["hull", "hull_reinforced.png"]
license: "CC-BY-SA-3.0"
copyright: "Taken from /tg/station at commit 6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae"
- source: "https://github.com/tgstation/tgstation/"
+ source: "https://github.com/space-wizards/space-station-14/pull/18676"
-- files: ["shuttleblue.png", "shuttleorange.png", "shuttlepurple.png", "shuttlered.png", "shuttlewhite.png", "shuttlegrey.png", "shuttleblack.png"]
+- files: ["shuttleblue.png", "shuttleorange.png", "shuttlepurple.png", "shuttlered.png", "shuttlewhite.png", "shuttlegrey.png", "shuttleblack.png", "green_circuit.png", "blue_circuit.png", "red_circuit.png"]
license: "CC-BY-SA-3.0"
- copyright: "Modified by Flareguy for Space Station 14. Unmodified sprite from paradisestation commit 69c831afcd9aef25a2889b507e4f36a3a5fc6def, originally from /VG/ eris"
+ copyright: "Taken from Paradise Station at https://github.com/ParadiseSS13/Paradise/blob/master/icons/turf/floors.dmi"
source: "https://github.com/ParadiseSS13/Paradise"
- files: ["deprecated.png"]
@@ -90,7 +95,7 @@
license: "CC-BY-SA-3.0"
copyright: "Fortuna commit 2a9408a47e2f83d945335e4feeeeafb552173e6f, grasslight and dirt by Peptide based on grassdark.png and dirt."
source: "https://github.com/FortunaSS13/Fortuna"
-
+
- files: ["steel_maint.png", "grating_maint.png", "wood_tile.png"]
license: "CC-BY-SA-3.0"
copyright: "by brainfood for space-station-14, ."
@@ -105,7 +110,7 @@
license: "CC-BY-SA-3.0"
copyright: "taken at https://github.com/ParadiseSS13/Paradise/blob/8b7f4c8b69c74c6de5a755272eb8d3520f3d87c7/icons/turf/floors.dmi"
source: "https://github.com/ParadiseSS13/Paradise"
-
+
- files: ["chromite.png"]
license: "CC-BY-NC-SA-3.0"
copyright: "taken at commit 0587dd16e28108bdf0b0a28e2caae4319845e861, and recolored by TheShuEd"
diff --git a/Resources/Textures/Tiles/bar.png b/Resources/Textures/Tiles/bar.png
index c7dded0c6b9..d786d3ed763 100644
Binary files a/Resources/Textures/Tiles/bar.png and b/Resources/Textures/Tiles/bar.png differ
diff --git a/Resources/Textures/Tiles/blue_circuit.png b/Resources/Textures/Tiles/blue_circuit.png
index 021c5363d6e..529654b467b 100644
Binary files a/Resources/Textures/Tiles/blue_circuit.png and b/Resources/Textures/Tiles/blue_circuit.png differ
diff --git a/Resources/Textures/Tiles/cafeteria.png b/Resources/Textures/Tiles/cafeteria.png
index 69e8dc47f05..451b0825f55 100644
Binary files a/Resources/Textures/Tiles/cafeteria.png and b/Resources/Textures/Tiles/cafeteria.png differ
diff --git a/Resources/Textures/Tiles/checker_dark.png b/Resources/Textures/Tiles/checker_dark.png
index 01a91209588..3eefdfa34da 100644
Binary files a/Resources/Textures/Tiles/checker_dark.png and b/Resources/Textures/Tiles/checker_dark.png differ
diff --git a/Resources/Textures/Tiles/clown.png b/Resources/Textures/Tiles/clown.png
index 74e59719235..d81a759b12c 100644
Binary files a/Resources/Textures/Tiles/clown.png and b/Resources/Textures/Tiles/clown.png differ
diff --git a/Resources/Textures/Tiles/dark.png b/Resources/Textures/Tiles/dark.png
index 70d0a801fdc..5574f32a19d 100644
Binary files a/Resources/Textures/Tiles/dark.png and b/Resources/Textures/Tiles/dark.png differ
diff --git a/Resources/Textures/Tiles/dark_diagonal.png b/Resources/Textures/Tiles/dark_diagonal.png
index d9cacd31e13..22b474995a4 100644
Binary files a/Resources/Textures/Tiles/dark_diagonal.png and b/Resources/Textures/Tiles/dark_diagonal.png differ
diff --git a/Resources/Textures/Tiles/dark_diagonal_mini.png b/Resources/Textures/Tiles/dark_diagonal_mini.png
index c60af49c6d7..12a1e64b421 100644
Binary files a/Resources/Textures/Tiles/dark_diagonal_mini.png and b/Resources/Textures/Tiles/dark_diagonal_mini.png differ
diff --git a/Resources/Textures/Tiles/dark_herringbone.png b/Resources/Textures/Tiles/dark_herringbone.png
index 01e0c4ef60e..88b13a43b3f 100644
Binary files a/Resources/Textures/Tiles/dark_herringbone.png and b/Resources/Textures/Tiles/dark_herringbone.png differ
diff --git a/Resources/Textures/Tiles/dark_mini.png b/Resources/Textures/Tiles/dark_mini.png
index 02c75c56c4f..aeb982b732b 100644
Binary files a/Resources/Textures/Tiles/dark_mini.png and b/Resources/Textures/Tiles/dark_mini.png differ
diff --git a/Resources/Textures/Tiles/dark_mono.png b/Resources/Textures/Tiles/dark_mono.png
index 9e156c6e023..279a72f4097 100644
Binary files a/Resources/Textures/Tiles/dark_mono.png and b/Resources/Textures/Tiles/dark_mono.png differ
diff --git a/Resources/Textures/Tiles/dark_offset.png b/Resources/Textures/Tiles/dark_offset.png
index ca8a5b64aaa..422811bd8f9 100644
Binary files a/Resources/Textures/Tiles/dark_offset.png and b/Resources/Textures/Tiles/dark_offset.png differ
diff --git a/Resources/Textures/Tiles/dark_pavement.png b/Resources/Textures/Tiles/dark_pavement.png
index 1585211593b..6ad0bc4209b 100644
Binary files a/Resources/Textures/Tiles/dark_pavement.png and b/Resources/Textures/Tiles/dark_pavement.png differ
diff --git a/Resources/Textures/Tiles/dark_pavement_vertical.png b/Resources/Textures/Tiles/dark_pavement_vertical.png
index 776aaf605ec..02f7735dcd5 100644
Binary files a/Resources/Textures/Tiles/dark_pavement_vertical.png and b/Resources/Textures/Tiles/dark_pavement_vertical.png differ
diff --git a/Resources/Textures/Tiles/dark_plastic.png b/Resources/Textures/Tiles/dark_plastic.png
index 34c3e57ce68..79e0ff407e6 100644
Binary files a/Resources/Textures/Tiles/dark_plastic.png and b/Resources/Textures/Tiles/dark_plastic.png differ
diff --git a/Resources/Textures/Tiles/glass.png b/Resources/Textures/Tiles/glass.png
index 37adc67679e..bc782a9c6c3 100644
Binary files a/Resources/Textures/Tiles/glass.png and b/Resources/Textures/Tiles/glass.png differ
diff --git a/Resources/Textures/Tiles/green_circuit.png b/Resources/Textures/Tiles/green_circuit.png
index 1628c20ae77..c215175c499 100644
Binary files a/Resources/Textures/Tiles/green_circuit.png and b/Resources/Textures/Tiles/green_circuit.png differ
diff --git a/Resources/Textures/Tiles/hydro.png b/Resources/Textures/Tiles/hydro.png
index 5878bce5b70..0d1c6fef23f 100644
Binary files a/Resources/Textures/Tiles/hydro.png and b/Resources/Textures/Tiles/hydro.png differ
diff --git a/Resources/Textures/Tiles/kitchen.png b/Resources/Textures/Tiles/kitchen.png
index 83f371e63b8..38d4181bb08 100644
Binary files a/Resources/Textures/Tiles/kitchen.png and b/Resources/Textures/Tiles/kitchen.png differ
diff --git a/Resources/Textures/Tiles/laundry.png b/Resources/Textures/Tiles/laundry.png
index 60f079498ab..e89ae3d14cb 100644
Binary files a/Resources/Textures/Tiles/laundry.png and b/Resources/Textures/Tiles/laundry.png differ
diff --git a/Resources/Textures/Tiles/lime.png b/Resources/Textures/Tiles/lime.png
index bf528d278bd..3d421f3f7f6 100644
Binary files a/Resources/Textures/Tiles/lime.png and b/Resources/Textures/Tiles/lime.png differ
diff --git a/Resources/Textures/Tiles/mime.png b/Resources/Textures/Tiles/mime.png
index fee58f73708..bd85fa6111e 100644
Binary files a/Resources/Textures/Tiles/mime.png and b/Resources/Textures/Tiles/mime.png differ
diff --git a/Resources/Textures/Tiles/plastic.png b/Resources/Textures/Tiles/plastic.png
index 8fd68090319..8b004d5164b 100644
Binary files a/Resources/Textures/Tiles/plastic.png and b/Resources/Textures/Tiles/plastic.png differ
diff --git a/Resources/Textures/Tiles/plating.png b/Resources/Textures/Tiles/plating.png
index fef6a3554d5..5bdbadaa6ae 100644
Binary files a/Resources/Textures/Tiles/plating.png and b/Resources/Textures/Tiles/plating.png differ
diff --git a/Resources/Textures/Tiles/plating_burnt.png b/Resources/Textures/Tiles/plating_burnt.png
index 7c89de081eb..899e6c91880 100644
Binary files a/Resources/Textures/Tiles/plating_burnt.png and b/Resources/Textures/Tiles/plating_burnt.png differ
diff --git a/Resources/Textures/Tiles/red_circuit.png b/Resources/Textures/Tiles/red_circuit.png
new file mode 100644
index 00000000000..d7cee0fb61f
Binary files /dev/null and b/Resources/Textures/Tiles/red_circuit.png differ
diff --git a/Resources/Textures/Tiles/rglass.png b/Resources/Textures/Tiles/rglass.png
index bae2908132b..6dd3bb59172 100644
Binary files a/Resources/Textures/Tiles/rglass.png and b/Resources/Textures/Tiles/rglass.png differ
diff --git a/Resources/Textures/Tiles/shuttleblack.png b/Resources/Textures/Tiles/shuttleblack.png
index e5dc3ff666f..8f3981a39f4 100644
Binary files a/Resources/Textures/Tiles/shuttleblack.png and b/Resources/Textures/Tiles/shuttleblack.png differ
diff --git a/Resources/Textures/Tiles/shuttleblue.png b/Resources/Textures/Tiles/shuttleblue.png
index 8a57cf8b0a1..98d7ea81d80 100644
Binary files a/Resources/Textures/Tiles/shuttleblue.png and b/Resources/Textures/Tiles/shuttleblue.png differ
diff --git a/Resources/Textures/Tiles/shuttlegrey.png b/Resources/Textures/Tiles/shuttlegrey.png
index 337fef7d30d..8ffd372ab06 100644
Binary files a/Resources/Textures/Tiles/shuttlegrey.png and b/Resources/Textures/Tiles/shuttlegrey.png differ
diff --git a/Resources/Textures/Tiles/shuttleorange.png b/Resources/Textures/Tiles/shuttleorange.png
index 0e42ad3467d..904d236f864 100644
Binary files a/Resources/Textures/Tiles/shuttleorange.png and b/Resources/Textures/Tiles/shuttleorange.png differ
diff --git a/Resources/Textures/Tiles/shuttlepurple.png b/Resources/Textures/Tiles/shuttlepurple.png
index 2236948d382..05601b839f6 100644
Binary files a/Resources/Textures/Tiles/shuttlepurple.png and b/Resources/Textures/Tiles/shuttlepurple.png differ
diff --git a/Resources/Textures/Tiles/shuttlered.png b/Resources/Textures/Tiles/shuttlered.png
index 732cf385d64..8757c81aadc 100644
Binary files a/Resources/Textures/Tiles/shuttlered.png and b/Resources/Textures/Tiles/shuttlered.png differ
diff --git a/Resources/Textures/Tiles/shuttlewhite.png b/Resources/Textures/Tiles/shuttlewhite.png
index 1308a78d9e4..db7513c5acb 100644
Binary files a/Resources/Textures/Tiles/shuttlewhite.png and b/Resources/Textures/Tiles/shuttlewhite.png differ
diff --git a/Resources/Textures/Tiles/steel.png b/Resources/Textures/Tiles/steel.png
index b7792ef138e..e5a1ed2879a 100644
Binary files a/Resources/Textures/Tiles/steel.png and b/Resources/Textures/Tiles/steel.png differ
diff --git a/Resources/Textures/Tiles/steel_diagonal.png b/Resources/Textures/Tiles/steel_diagonal.png
index 0f540532955..b0c1f6927d0 100644
Binary files a/Resources/Textures/Tiles/steel_diagonal.png and b/Resources/Textures/Tiles/steel_diagonal.png differ
diff --git a/Resources/Textures/Tiles/steel_diagonal_mini.png b/Resources/Textures/Tiles/steel_diagonal_mini.png
index 0b56a7794d2..51cbdf8b040 100644
Binary files a/Resources/Textures/Tiles/steel_diagonal_mini.png and b/Resources/Textures/Tiles/steel_diagonal_mini.png differ
diff --git a/Resources/Textures/Tiles/steel_dirty.png b/Resources/Textures/Tiles/steel_dirty.png
index 660fdf88685..fda6fabe1fc 100644
Binary files a/Resources/Textures/Tiles/steel_dirty.png and b/Resources/Textures/Tiles/steel_dirty.png differ
diff --git a/Resources/Textures/Tiles/steel_herringbone.png b/Resources/Textures/Tiles/steel_herringbone.png
index 2f676827d7a..19ae3bb8717 100644
Binary files a/Resources/Textures/Tiles/steel_herringbone.png and b/Resources/Textures/Tiles/steel_herringbone.png differ
diff --git a/Resources/Textures/Tiles/steel_mini.png b/Resources/Textures/Tiles/steel_mini.png
index 40a8706441a..8fa958f3fe5 100644
Binary files a/Resources/Textures/Tiles/steel_mini.png and b/Resources/Textures/Tiles/steel_mini.png differ
diff --git a/Resources/Textures/Tiles/steel_mono.png b/Resources/Textures/Tiles/steel_mono.png
index 94121926a3d..a2a72581e08 100644
Binary files a/Resources/Textures/Tiles/steel_mono.png and b/Resources/Textures/Tiles/steel_mono.png differ
diff --git a/Resources/Textures/Tiles/steel_offset.png b/Resources/Textures/Tiles/steel_offset.png
index 850daeffd5c..796fbcd5955 100644
Binary files a/Resources/Textures/Tiles/steel_offset.png and b/Resources/Textures/Tiles/steel_offset.png differ
diff --git a/Resources/Textures/Tiles/steel_pavement.png b/Resources/Textures/Tiles/steel_pavement.png
index 5b561e9ae65..200471ea995 100644
Binary files a/Resources/Textures/Tiles/steel_pavement.png and b/Resources/Textures/Tiles/steel_pavement.png differ
diff --git a/Resources/Textures/Tiles/steel_pavement_vertical.png b/Resources/Textures/Tiles/steel_pavement_vertical.png
index 1c38de21e7a..950a2c0e5f1 100644
Binary files a/Resources/Textures/Tiles/steel_pavement_vertical.png and b/Resources/Textures/Tiles/steel_pavement_vertical.png differ
diff --git a/Resources/Textures/Tiles/white.png b/Resources/Textures/Tiles/white.png
index 0ec2c911915..048c1fe179c 100644
Binary files a/Resources/Textures/Tiles/white.png and b/Resources/Textures/Tiles/white.png differ
diff --git a/Resources/Textures/Tiles/white_diagonal.png b/Resources/Textures/Tiles/white_diagonal.png
index e25e448a710..e9d52ab7d98 100644
Binary files a/Resources/Textures/Tiles/white_diagonal.png and b/Resources/Textures/Tiles/white_diagonal.png differ
diff --git a/Resources/Textures/Tiles/white_diagonal_mini.png b/Resources/Textures/Tiles/white_diagonal_mini.png
index 736733753a6..e4e32c65cd9 100644
Binary files a/Resources/Textures/Tiles/white_diagonal_mini.png and b/Resources/Textures/Tiles/white_diagonal_mini.png differ
diff --git a/Resources/Textures/Tiles/white_herringbone.png b/Resources/Textures/Tiles/white_herringbone.png
index fef9466a174..80d006810bf 100644
Binary files a/Resources/Textures/Tiles/white_herringbone.png and b/Resources/Textures/Tiles/white_herringbone.png differ
diff --git a/Resources/Textures/Tiles/white_mini.png b/Resources/Textures/Tiles/white_mini.png
index b0fc32c2c83..717ec462c44 100644
Binary files a/Resources/Textures/Tiles/white_mini.png and b/Resources/Textures/Tiles/white_mini.png differ
diff --git a/Resources/Textures/Tiles/white_mono.png b/Resources/Textures/Tiles/white_mono.png
index 66eedee0f69..763f08b9d20 100644
Binary files a/Resources/Textures/Tiles/white_mono.png and b/Resources/Textures/Tiles/white_mono.png differ
diff --git a/Resources/Textures/Tiles/white_offset.png b/Resources/Textures/Tiles/white_offset.png
index 19537e3896b..0b6239a3249 100644
Binary files a/Resources/Textures/Tiles/white_offset.png and b/Resources/Textures/Tiles/white_offset.png differ
diff --git a/Resources/Textures/Tiles/white_pavement.png b/Resources/Textures/Tiles/white_pavement.png
index 78fcf0195d2..69da122ba61 100644
Binary files a/Resources/Textures/Tiles/white_pavement.png and b/Resources/Textures/Tiles/white_pavement.png differ
diff --git a/Resources/Textures/Tiles/white_pavement_vertical.png b/Resources/Textures/Tiles/white_pavement_vertical.png
index 5126f699db5..20d887903c5 100644
Binary files a/Resources/Textures/Tiles/white_pavement_vertical.png and b/Resources/Textures/Tiles/white_pavement_vertical.png differ
diff --git a/Resources/Textures/Tiles/white_plastic.png b/Resources/Textures/Tiles/white_plastic.png
index 99d6c60e881..b31ea0e8553 100644
Binary files a/Resources/Textures/Tiles/white_plastic.png and b/Resources/Textures/Tiles/white_plastic.png differ
diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml
index 346156159a7..24da641a078 100644
--- a/Resources/keybinds.yml
+++ b/Resources/keybinds.yml
@@ -184,6 +184,9 @@ binds:
- function: OpenCharacterMenu
type: State
key: C
+- function: OpenLanguageMenu
+ type: State
+ key: L
- function: TextCursorSelect
# TextCursorSelect HAS to be above ExamineEntity
# So that LineEdit receives it correctly.
diff --git a/flake.lock b/flake.lock
index 6ab38fa41bd..7baaa468ea5 100644
--- a/flake.lock
+++ b/flake.lock
@@ -5,11 +5,11 @@
"systems": "systems"
},
"locked": {
- "lastModified": 1705309234,
- "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
+ "lastModified": 1710146030,
+ "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide",
"repo": "flake-utils",
- "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
+ "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github"
},
"original": {
@@ -20,16 +20,16 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1708210246,
- "narHash": "sha256-Q8L9XwrBK53fbuuIFMbjKvoV7ixfLFKLw4yV+SD28Y8=",
+ "lastModified": 1717352157,
+ "narHash": "sha256-hbBzucWOhwxt3QzeAyUojtD6/aHH81JssDfhFfmqOy0=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "69405156cffbdf2be50153f13cbdf9a0bea38e49",
+ "rev": "44f538ab12e2726af450877a5529f4fd88ddb0fb",
"type": "github"
},
"original": {
"owner": "NixOS",
- "ref": "release-23.11",
+ "ref": "release-24.05",
"repo": "nixpkgs",
"type": "github"
}
diff --git a/flake.nix b/flake.nix
index e2e119eb997..095e6b017c7 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,7 +1,7 @@
{
description = "Development environment for Space Station 14";
- inputs.nixpkgs.url = "github:NixOS/nixpkgs/release-23.11";
+ inputs.nixpkgs.url = "github:NixOS/nixpkgs/release-24.05";
inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = { self, nixpkgs, flake-utils }:
diff --git a/global.json b/global.json
index 2244195a209..c8526b0a8ba 100644
--- a/global.json
+++ b/global.json
@@ -1,6 +1,6 @@
{
"sdk": {
"version": "8.0.100",
- "rollForward": "disable"
+ "rollForward": "patch"
}
}
diff --git a/shell.nix b/shell.nix
index 9a1b0ca4290..e93db685da5 100644
--- a/shell.nix
+++ b/shell.nix
@@ -7,7 +7,7 @@ in import (builtins.fetchTarball {
let
dependencies = with pkgs; [
- dotnetCorePackages.sdk_8_0
+ dotnetCorePackages.sdk_8_0_1xx
glfw
SDL2
libGL