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