]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Port fancy speech bubbles (#29349)
authorlzk <124214523+lzk228@users.noreply.github.com>
Tue, 6 May 2025 17:49:42 +0000 (19:49 +0200)
committerGitHub <noreply@github.com>
Tue, 6 May 2025 17:49:42 +0000 (20:49 +0300)
26 files changed:
Content.Client/Chat/TypingIndicator/TypingIndicatorSystem.cs
Content.Client/Chat/TypingIndicator/TypingIndicatorVisualizerSystem.cs
Content.Client/Holopad/HolopadSystem.cs
Content.Client/UserInterface/Systems/Chat/ChatUIController.cs
Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml.cs
Content.Server/Holopad/HolopadSystem.cs
Content.Shared/Chat/TypingIndicator/SharedTypingIndicatorSystem.cs
Content.Shared/Chat/TypingIndicator/TypingIndicatorEvents.cs
Content.Shared/Chat/TypingIndicator/TypingIndicatorPrototype.cs
Content.Shared/Chat/TypingIndicator/TypingIndicatorState.cs [new file with mode: 0644]
Content.Shared/Chat/TypingIndicator/TypingIndicatorVisuals.cs
Content.Shared/Holopad/HolopadUserComponent.cs
Resources/Prototypes/typing_indicator.yml
Resources/Textures/Effects/speech.rsi/alien3.png [new file with mode: 0644]
Resources/Textures/Effects/speech.rsi/alienroyal3.png [new file with mode: 0644]
Resources/Textures/Effects/speech.rsi/default3.png [new file with mode: 0644]
Resources/Textures/Effects/speech.rsi/guardian3.png [new file with mode: 0644]
Resources/Textures/Effects/speech.rsi/holo3.png [new file with mode: 0644]
Resources/Textures/Effects/speech.rsi/lawyer3.png [new file with mode: 0644]
Resources/Textures/Effects/speech.rsi/lizard3.png [new file with mode: 0644]
Resources/Textures/Effects/speech.rsi/meta.json
Resources/Textures/Effects/speech.rsi/moth3.png [new file with mode: 0644]
Resources/Textures/Effects/speech.rsi/robot3.png [new file with mode: 0644]
Resources/Textures/Effects/speech.rsi/slime3.png [new file with mode: 0644]
Resources/Textures/Effects/speech.rsi/spider3.png [new file with mode: 0644]
Resources/Textures/Effects/speech.rsi/syndibot3.png [new file with mode: 0644]

index 33dbc06ad8786993ec37371bcfa5d393b4d067c2..c126f08db1f8fa2e26506c63183544dfe692feaa 100644 (file)
@@ -16,6 +16,7 @@ public sealed class TypingIndicatorSystem : SharedTypingIndicatorSystem
     private readonly TimeSpan _typingTimeout = TimeSpan.FromSeconds(2);
     private TimeSpan _lastTextChange;
     private bool _isClientTyping;
+    private bool _isClientChatFocused;
 
     public override void Initialize()
     {
@@ -31,7 +32,8 @@ public sealed class TypingIndicatorSystem : SharedTypingIndicatorSystem
             return;
 
         // client typed something - show typing indicator
-        ClientUpdateTyping(true);
+        _isClientTyping = true;
+        ClientUpdateTyping();
         _lastTextChange = _time.CurTime;
     }
 
@@ -42,7 +44,19 @@ public sealed class TypingIndicatorSystem : SharedTypingIndicatorSystem
             return;
 
         // client submitted text - hide typing indicator
-        ClientUpdateTyping(false);
+        _isClientTyping = false;
+        ClientUpdateTyping();
+    }
+
+    public void ClientChangedChatFocus(bool isFocused)
+    {
+        // don't update it if player don't want to show typing
+        if (!_cfg.GetCVar(CCVars.ChatShowTypingIndicator))
+            return;
+
+        // client submitted text - hide typing indicator
+        _isClientChatFocused = isFocused;
+        ClientUpdateTyping();
     }
 
     public override void Update(float frameTime)
@@ -55,23 +69,25 @@ public sealed class TypingIndicatorSystem : SharedTypingIndicatorSystem
             var dif = _time.CurTime - _lastTextChange;
             if (dif > _typingTimeout)
             {
-                // client didn't typed anything for a long time - hide indicator
-                ClientUpdateTyping(false);
+                // client didn't typed anything for a long time - change indicator
+                _isClientTyping = false;
+                ClientUpdateTyping();
             }
         }
     }
 
-    private void ClientUpdateTyping(bool isClientTyping)
+    private void ClientUpdateTyping()
     {
-        if (_isClientTyping == isClientTyping)
-            return;
-
-        // check if player controls any entity.
+        // check if player controls any pawn
         if (_playerManager.LocalEntity == null)
             return;
 
-        _isClientTyping = isClientTyping;
-        RaisePredictiveEvent(new TypingChangedEvent(isClientTyping));
+        var state = TypingIndicatorState.None;
+        if (_isClientChatFocused)
+            state = _isClientTyping ? TypingIndicatorState.Typing : TypingIndicatorState.Idle;
+
+        // send a networked event to server
+        RaisePredictiveEvent(new TypingChangedEvent(state));
     }
 
     private void OnShowTypingChanged(bool showTyping)
@@ -79,7 +95,8 @@ public sealed class TypingIndicatorSystem : SharedTypingIndicatorSystem
         // hide typing indicator immediately if player don't want to show it anymore
         if (!showTyping)
         {
-            ClientUpdateTyping(false);
+            _isClientTyping = false;
+            ClientUpdateTyping();
         }
     }
 }
index e89f7ab500252f7ff5072b097e3d424eade7c7ec..a9af045c0cf5f8565629b7d0eb2fc9e124a7b987 100644 (file)
@@ -35,7 +35,6 @@ public sealed class TypingIndicatorVisualizerSystem : VisualizerSystem<TypingInd
             return;
         }
 
-        AppearanceSystem.TryGetData<bool>(uid, TypingIndicatorVisuals.IsTyping, out var isTyping, args.Component);
         var layerExists = args.Sprite.LayerMapTryGet(TypingIndicatorLayers.Base, out var layer);
         if (!layerExists)
             layer = args.Sprite.LayerMapReserveBlank(TypingIndicatorLayers.Base);
@@ -44,6 +43,17 @@ public sealed class TypingIndicatorVisualizerSystem : VisualizerSystem<TypingInd
         args.Sprite.LayerSetState(layer, proto.TypingState);
         args.Sprite.LayerSetShader(layer, proto.Shader);
         args.Sprite.LayerSetOffset(layer, proto.Offset);
-        args.Sprite.LayerSetVisible(layer, isTyping);
+
+        AppearanceSystem.TryGetData<TypingIndicatorState>(uid, TypingIndicatorVisuals.State, out var state);
+        args.Sprite.LayerSetVisible(layer, state != TypingIndicatorState.None);
+        switch (state)
+        {
+            case TypingIndicatorState.Idle:
+                args.Sprite.LayerSetState(layer, proto.IdleState);
+                break;
+            case TypingIndicatorState.Typing:
+                args.Sprite.LayerSetState(layer, proto.TypingState);
+                break;
+        }
     }
 }
index 6aad39fe2473a271250553c3599dc2156bebb70d..40226b985139eb481ec74344c8df62aeb39829c6 100644 (file)
@@ -46,7 +46,7 @@ public sealed class HolopadSystem : SharedHolopadSystem
         if (!HasComp<HolopadUserComponent>(uid))
             return;
 
-        var netEv = new HolopadUserTypingChangedEvent(GetNetEntity(uid.Value), ev.IsTyping);
+        var netEv = new HolopadUserTypingChangedEvent(GetNetEntity(uid.Value), ev.State);
         RaiseNetworkEvent(netEv);
     }
 
index a77bc10f7bf72fe49cf9eee66a9b7379830db0de..1ccba1ae202c7bb3a3397a11a99537cae1148745 100644 (file)
@@ -918,6 +918,11 @@ public sealed class ChatUIController : UIController
         _typingIndicator?.ClientChangedChatText();
     }
 
+    public void NotifyChatFocus(bool isFocused)
+    {
+        _typingIndicator?.ClientChangedChatFocus(isFocused);
+    }
+
     public void Repopulate()
     {
         foreach (var chat in _chats)
index 62b3b19e38b2349a23b03bca2c6fe054bdd2d9ba..068cf4e87eeb26754eaafc23af8d014bb1cc204a 100644 (file)
@@ -34,6 +34,8 @@ public partial class ChatBox : UIWidget
         ChatInput.Input.OnTextEntered += OnTextEntered;
         ChatInput.Input.OnKeyBindDown += OnInputKeyBindDown;
         ChatInput.Input.OnTextChanged += OnTextChanged;
+        ChatInput.Input.OnFocusEnter += OnFocusEnter;
+        ChatInput.Input.OnFocusExit += OnFocusExit;
         ChatInput.ChannelSelector.OnChannelSelect += OnChannelSelect;
         ChatInput.FilterButton.Popup.OnChannelFilter += OnChannelFilter;
 
@@ -174,6 +176,18 @@ public partial class ChatBox : UIWidget
         _controller.NotifyChatTextChange();
     }
 
+    private void OnFocusEnter(LineEditEventArgs args)
+    {
+        // Warn typing indicator about focus
+        _controller.NotifyChatFocus(true);
+    }
+
+    private void OnFocusExit(LineEditEventArgs args)
+    {
+        // Warn typing indicator about focus
+        _controller.NotifyChatFocus(false);
+    }
+
     protected override void Dispose(bool disposing)
     {
         base.Dispose(disposing);
index af8c5a36a18cd57f38ef7b67a0e82163e9b35187..f2bd0e05adf7db1541e8ff5800b4d65f9340380c 100644 (file)
@@ -309,7 +309,7 @@ public sealed class HolopadSystem : SharedHolopadSystem
                 if (receiverHolopad.Comp.Hologram == null)
                     continue;
 
-                _appearanceSystem.SetData(receiverHolopad.Comp.Hologram.Value.Owner, TypingIndicatorVisuals.IsTyping, ev.IsTyping);
+                _appearanceSystem.SetData(receiverHolopad.Comp.Hologram.Value.Owner, TypingIndicatorVisuals.State, ev.State);
             }
         }
     }
@@ -591,7 +591,7 @@ public sealed class HolopadSystem : SharedHolopadSystem
                 continue;
 
             if (user == null)
-                _appearanceSystem.SetData(linkedHolopad.Comp.Hologram.Value.Owner, TypingIndicatorVisuals.IsTyping, false);
+                _appearanceSystem.SetData(linkedHolopad.Comp.Hologram.Value.Owner, TypingIndicatorVisuals.State, false);
 
             linkedHolopad.Comp.Hologram.Value.Comp.LinkedEntity = user;
             Dirty(linkedHolopad.Comp.Hologram.Value);
index 9d60d334dbea39a14082c85b04b487312991e492..bc5c95c8abed1c763bb6ed12d9aee71cf877e995 100644 (file)
@@ -45,7 +45,7 @@ public abstract class SharedTypingIndicatorSystem : EntitySystem
     private void OnPlayerDetached(EntityUid uid, TypingIndicatorComponent component, PlayerDetachedEvent args)
     {
         // player left entity body - hide typing indicator
-        SetTypingIndicatorEnabled(uid, false);
+        SetTypingIndicatorState(uid, TypingIndicatorState.None);
     }
 
     private void OnGotEquipped(Entity<TypingIndicatorClothingComponent> entity, ref ClothingGotEquippedEvent args)
@@ -76,18 +76,18 @@ public abstract class SharedTypingIndicatorSystem : EntitySystem
         if (!_actionBlocker.CanEmote(uid.Value) && !_actionBlocker.CanSpeak(uid.Value))
         {
             // nah, make sure that typing indicator is disabled
-            SetTypingIndicatorEnabled(uid.Value, false);
+            SetTypingIndicatorState(uid.Value, TypingIndicatorState.None);
             return;
         }
 
-        SetTypingIndicatorEnabled(uid.Value, ev.IsTyping);
+        SetTypingIndicatorState(uid.Value, ev.State);
     }
 
-    private void SetTypingIndicatorEnabled(EntityUid uid, bool isEnabled, AppearanceComponent? appearance = null)
+    private void SetTypingIndicatorState(EntityUid uid, TypingIndicatorState state, AppearanceComponent? appearance = null)
     {
         if (!Resolve(uid, ref appearance, false))
             return;
 
-        _appearance.SetData(uid, TypingIndicatorVisuals.IsTyping, isEnabled, appearance);
+        _appearance.SetData(uid, TypingIndicatorVisuals.State, state, appearance);
     }
 }
index 600f86c0d2c4ea685060d8d33db097ad0d3ffe64..29a5d85be8f11cb35c99331bb18dedc5698260ef 100644 (file)
@@ -12,11 +12,11 @@ namespace Content.Shared.Chat.TypingIndicator;
 [Serializable, NetSerializable]
 public sealed class TypingChangedEvent : EntityEventArgs
 {
-    public readonly bool IsTyping;
+    public readonly TypingIndicatorState State;
 
-    public TypingChangedEvent(bool isTyping)
+    public TypingChangedEvent(TypingIndicatorState state)
     {
-        IsTyping = isTyping;
+        State = state;
     }
 }
 
index fbd647d0350971ec9dbe5a14e969bb3ff6cbcf90..970fed969a98841a70d567d6025bead546ad7e8c 100644 (file)
@@ -19,6 +19,9 @@ public sealed partial class TypingIndicatorPrototype : IPrototype
     [DataField("typingState", required: true)]
     public string TypingState = default!;
 
+    [DataField("idleState", required: true)]
+    public string IdleState = default!;
+
     [DataField("offset")]
     public Vector2 Offset = new(0, 0);
 
diff --git a/Content.Shared/Chat/TypingIndicator/TypingIndicatorState.cs b/Content.Shared/Chat/TypingIndicator/TypingIndicatorState.cs
new file mode 100644 (file)
index 0000000..087610a
--- /dev/null
@@ -0,0 +1,11 @@
+using Robust.Shared.Serialization;
+
+namespace Content.Shared.Chat.TypingIndicator;
+
+[Serializable, NetSerializable]
+public enum TypingIndicatorState
+{
+    None = 0,
+    Idle = 1,
+    Typing = 2,
+}
index 0368819eff25fdba88d81cb37ec55cafc4a894f8..b9ed15fe9a468a136624f0a64f2a08bfa506a36d 100644 (file)
@@ -5,7 +5,7 @@ namespace Content.Shared.Chat.TypingIndicator;
 [Serializable, NetSerializable]
 public enum TypingIndicatorVisuals : byte
 {
-    IsTyping
+    State
 }
 
 [Serializable]
index c9c2a8828b2022e2c8911c18ce17a66deb8eb1a9..d8e4699ee09d7bd81e65f362189094d78934278c 100644 (file)
@@ -1,3 +1,4 @@
+using Content.Shared.Chat.TypingIndicator;
 using Robust.Shared.GameStates;
 using Robust.Shared.Serialization;
 
@@ -34,11 +35,11 @@ public sealed class HolopadUserTypingChangedEvent : EntityEventArgs
     /// <summary>
     /// The typing indicator state
     /// </summary>
-    public readonly bool IsTyping;
+    public readonly TypingIndicatorState State;
 
-    public HolopadUserTypingChangedEvent(NetEntity user, bool isTyping)
+    public HolopadUserTypingChangedEvent(NetEntity user, TypingIndicatorState state)
     {
         User = user;
-        IsTyping = isTyping;
+        State = state;
     }
 }
index 295af30d163f29cbd45cecd94d69c1dc667e7bbc..99c06496acf51a13fa7f80f948281c44948690bf 100644 (file)
@@ -1,60 +1,73 @@
 - type: typingIndicator
   id: default
   typingState: default0
+  idleState: default3
 
 - type: typingIndicator
   id: robot
   typingState: robot0
+  idleState: robot3
 
 - type: typingIndicator
   id: alien
   typingState: alien0
+  idleState: alien3
 
 - type: typingIndicator
   id: guardian
   typingState: guardian0
+  idleState: guardian3
 
 - type: typingIndicator
   id: holo
   typingState: holo0
+  idleState: holo3
   offset: 0, 0.0625
 
 - type: typingIndicator
   id: lawyer
   typingState: lawyer0
+  idleState: lawyer3
   offset: 0, 0.125
 
 - type: typingIndicator
   id: moth
   typingState: moth0
+  idleState: moth3
   offset: 0, 0.125
 
 - type: typingIndicator
   id: spider
   typingState: spider0
+  idleState: spider3
   offset: 0, 0.125
 
 - type: typingIndicator
   id: vox
   typingState: vox0
+  idleState: vox0 # TODO add idle state sprite
   offset: -0.125, 0.125
 
 - type: typingIndicator
   id: lizard
   typingState: lizard0
+  idleState: lizard3
   offset: 0, 0.0625
 
 - type: typingIndicator
   id: slime
   typingState: slime0
+  idleState: slime3
   offset: 0, 0.125
 
 - type: typingIndicator
   id: gingerbread
   typingState: gingerbread0
+  idleState: gingerbread0
   offset: 0, 0.125
 
 - type: typingIndicator
   id: diona
   typingState: diona0
+  idleState: diona0
   offset: 0, 0.125
diff --git a/Resources/Textures/Effects/speech.rsi/alien3.png b/Resources/Textures/Effects/speech.rsi/alien3.png
new file mode 100644 (file)
index 0000000..83080b2
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/alien3.png differ
diff --git a/Resources/Textures/Effects/speech.rsi/alienroyal3.png b/Resources/Textures/Effects/speech.rsi/alienroyal3.png
new file mode 100644 (file)
index 0000000..d619232
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/alienroyal3.png differ
diff --git a/Resources/Textures/Effects/speech.rsi/default3.png b/Resources/Textures/Effects/speech.rsi/default3.png
new file mode 100644 (file)
index 0000000..7c15716
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/default3.png differ
diff --git a/Resources/Textures/Effects/speech.rsi/guardian3.png b/Resources/Textures/Effects/speech.rsi/guardian3.png
new file mode 100644 (file)
index 0000000..730a821
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/guardian3.png differ
diff --git a/Resources/Textures/Effects/speech.rsi/holo3.png b/Resources/Textures/Effects/speech.rsi/holo3.png
new file mode 100644 (file)
index 0000000..d2ed579
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/holo3.png differ
diff --git a/Resources/Textures/Effects/speech.rsi/lawyer3.png b/Resources/Textures/Effects/speech.rsi/lawyer3.png
new file mode 100644 (file)
index 0000000..7d9d7af
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/lawyer3.png differ
diff --git a/Resources/Textures/Effects/speech.rsi/lizard3.png b/Resources/Textures/Effects/speech.rsi/lizard3.png
new file mode 100644 (file)
index 0000000..75095cf
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/lizard3.png differ
index 17cf95079da47d2ab33649d402d000db53bdf961..82e676cfb0d11eb33748fa036186061e6ec3d52a 100644 (file)
@@ -1,11 +1,11 @@
 {
     "version": 1,
+    "license": "CC-BY-SA-3.0",
+    "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 | Moth sprites made by PuroSlavKing (Github) | Spider sprites made by PixelTheKermit (Github) | Lizard sprites made by AmalgoMyte (Github) | Diona and Gingerbread sprites made by YoungThugSS14 (Github)",
     "size": {
         "x": 32,
         "y": 32
     },
-    "license": "CC-BY-SA-3.0",
-    "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 | Moth sprites made by PuroSlavKing (Github) | Spider sprites made by PixelTheKermit (Github) | Lizard sprites made by AmalgoMyte (Github) | Diona and Gingerbread sprites made by YoungThugSS14 (Github)",
     "states": [
         {
             "name": "alien0",
         {
             "name": "alien2"
         },
+        {
+            "name": "alien3",
+            "delays": [
+                    [
+                        0.2,
+                        0.3,
+                        0.3,
+                        0.5,
+                        0.5
+                    ]
+                ]
+        },
         {
             "name": "alienroyal0",
-
+            "delays": [
+                    [
+                        0.2,
+                        0.3,
+                        0.3,
+                        0.3,
+                        0.3,
+                        0.5
+                    ]
+                ]
+        },
+        {
+            "name": "alienroyal1"
+        },
+        {
+            "name": "alienroyal2"
+        },
+        {
+            "name": "alienroyal3",
             "delays": [
                 [
                     0.2,
                 ]
             ]
         },
-        {
-            "name": "alienroyal1"
-        },
-        {
-            "name": "alienroyal2"
-        },
         {
             "name": "blob0",
             "delays": [
         {
             "name": "default2"
         },
+        {
+            "name": "default3",
+            "delays": [
+                [
+                    0.2,
+                    0.3,
+                    0.3,
+                    0.5,
+                    0.5
+                ]
+            ]
+        },
         {
             "name": "diona0",
             "delays": [
         {
             "name": "guardian2"
         },
+        {
+            "name": "guardian3",
+            "delays": [
+                [
+                    0.2,
+                    0.3,
+                    0.3,
+                    0.5,
+                    0.5
+                ]
+            ]
+        },
         {
             "name": "holo0",
             "delays": [
         {
             "name": "holo2"
         },
+        {
+            "name": "holo3",
+            "delays": [
+                [
+                    0.2,
+                    0.3,
+                    0.3,
+                    0.5,
+                    0.5
+                ]
+            ]
+        },
         {
             "name": "lawyer0",
             "delays": [
                 ]
             ]
         },
+        {
+            "name": "lawyer3",
+            "delays": [
+                [
+                    0.15,
+                    0.15,
+                    0.15,
+                    0.15,
+                    0.125,
+                    0.1,
+                    0.125,
+                    0.15
+                ]
+            ]
+        },
         {
             "name": "lizard0",
             "delays": [
         {
             "name": "lizard2"
         },
+        {
+            "name": "lizard3",
+            "delays": [
+                [
+                    0.2,
+                    0.3,
+                    0.3,
+                    0.5,
+                    0.5
+                ]
+            ]
+        },
         {
             "name": "moth0",
             "delays": [
                 ]
             ]
         },
+        {
+            "name": "moth3",
+            "delays": [
+                [
+                    0.1,
+                    0.1,
+                    0.1,
+                    0.1,
+                    0.1,
+                    0.1,
+                    0.1,
+                    0.1,
+                    0.1,
+                    0.1,
+                    0.1,
+                    0.1,
+                    0.1,
+                    0.1
+                ]
+            ]
+        },
         {
             "name": "machine0",
             "delays": [
         {
             "name": "robot2"
         },
+        {
+            "name": "robot3",
+            "delays": [
+                [
+                    0.2,
+                    0.2,
+                    0.2,
+                    0.2,
+                    0.2,
+                    0.2,
+                    0.2
+                ]
+            ]
+        },
         {
             "name": "slime0",
             "delays": [
                 ]
             ]
         },
+        {
+            "name": "slime3",
+            "delays": [
+                [
+                    0.2,
+                    0.3,
+                    0.3,
+                    0.5,
+                    0.5
+                ]
+            ]
+        },
         {
             "name": "swarmer0",
             "delays": [
         {
             "name": "syndibot2"
         },
+        {
+            "name": "syndibot3",
+            "delays": [
+                [
+                    0.2,
+                    0.2,
+                    0.2,
+                    0.2,
+                    0.2,
+                    0.2,
+                    0.2
+                ]
+            ]
+        },
         {
             "name": "spider0",
             "delays": [
         {
             "name": "spider2"
         },
-                {
+        {
+            "name": "spider3",
+            "delays": [
+                [
+                    0.2,
+                    0.3,
+                    0.3,
+                    0.5,
+                    0.5
+                ]
+            ]
+        },
+        {
             "name": "vox0",
             "delays": [
                 [
diff --git a/Resources/Textures/Effects/speech.rsi/moth3.png b/Resources/Textures/Effects/speech.rsi/moth3.png
new file mode 100644 (file)
index 0000000..93b1d1b
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/moth3.png differ
diff --git a/Resources/Textures/Effects/speech.rsi/robot3.png b/Resources/Textures/Effects/speech.rsi/robot3.png
new file mode 100644 (file)
index 0000000..b168650
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/robot3.png differ
diff --git a/Resources/Textures/Effects/speech.rsi/slime3.png b/Resources/Textures/Effects/speech.rsi/slime3.png
new file mode 100644 (file)
index 0000000..155ab5e
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/slime3.png differ
diff --git a/Resources/Textures/Effects/speech.rsi/spider3.png b/Resources/Textures/Effects/speech.rsi/spider3.png
new file mode 100644 (file)
index 0000000..4cf57ba
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/spider3.png differ
diff --git a/Resources/Textures/Effects/speech.rsi/syndibot3.png b/Resources/Textures/Effects/speech.rsi/syndibot3.png
new file mode 100644 (file)
index 0000000..5f58ab3
Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/syndibot3.png differ