From 740ce0e8ad522393d6f05430954742e969b449c6 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Tue, 6 May 2025 19:49:42 +0200 Subject: [PATCH] Port fancy speech bubbles (#29349) --- .../TypingIndicator/TypingIndicatorSystem.cs | 41 ++-- .../TypingIndicatorVisualizerSystem.cs | 14 +- Content.Client/Holopad/HolopadSystem.cs | 2 +- .../Systems/Chat/ChatUIController.cs | 5 + .../Systems/Chat/Widgets/ChatBox.xaml.cs | 14 ++ Content.Server/Holopad/HolopadSystem.cs | 4 +- .../SharedTypingIndicatorSystem.cs | 10 +- .../TypingIndicator/TypingIndicatorEvents.cs | 6 +- .../TypingIndicatorPrototype.cs | 3 + .../TypingIndicator/TypingIndicatorState.cs | 11 ++ .../TypingIndicator/TypingIndicatorVisuals.cs | 2 +- .../Holopad/HolopadUserComponent.cs | 7 +- Resources/Prototypes/typing_indicator.yml | 13 ++ .../Textures/Effects/speech.rsi/alien3.png | Bin 0 -> 522 bytes .../Effects/speech.rsi/alienroyal3.png | Bin 0 -> 759 bytes .../Textures/Effects/speech.rsi/default3.png | Bin 0 -> 431 bytes .../Textures/Effects/speech.rsi/guardian3.png | Bin 0 -> 540 bytes .../Textures/Effects/speech.rsi/holo3.png | Bin 0 -> 610 bytes .../Textures/Effects/speech.rsi/lawyer3.png | Bin 0 -> 839 bytes .../Textures/Effects/speech.rsi/lizard3.png | Bin 0 -> 647 bytes .../Textures/Effects/speech.rsi/meta.json | 180 +++++++++++++++++- .../Textures/Effects/speech.rsi/moth3.png | Bin 0 -> 2010 bytes .../Textures/Effects/speech.rsi/robot3.png | Bin 0 -> 787 bytes .../Textures/Effects/speech.rsi/slime3.png | Bin 0 -> 504 bytes .../Textures/Effects/speech.rsi/spider3.png | Bin 0 -> 591 bytes .../Textures/Effects/speech.rsi/syndibot3.png | Bin 0 -> 869 bytes 26 files changed, 273 insertions(+), 39 deletions(-) create mode 100644 Content.Shared/Chat/TypingIndicator/TypingIndicatorState.cs create mode 100644 Resources/Textures/Effects/speech.rsi/alien3.png create mode 100644 Resources/Textures/Effects/speech.rsi/alienroyal3.png create mode 100644 Resources/Textures/Effects/speech.rsi/default3.png create mode 100644 Resources/Textures/Effects/speech.rsi/guardian3.png create mode 100644 Resources/Textures/Effects/speech.rsi/holo3.png create mode 100644 Resources/Textures/Effects/speech.rsi/lawyer3.png create mode 100644 Resources/Textures/Effects/speech.rsi/lizard3.png create mode 100644 Resources/Textures/Effects/speech.rsi/moth3.png create mode 100644 Resources/Textures/Effects/speech.rsi/robot3.png create mode 100644 Resources/Textures/Effects/speech.rsi/slime3.png create mode 100644 Resources/Textures/Effects/speech.rsi/spider3.png create mode 100644 Resources/Textures/Effects/speech.rsi/syndibot3.png diff --git a/Content.Client/Chat/TypingIndicator/TypingIndicatorSystem.cs b/Content.Client/Chat/TypingIndicator/TypingIndicatorSystem.cs index 33dbc06ad8..c126f08db1 100644 --- a/Content.Client/Chat/TypingIndicator/TypingIndicatorSystem.cs +++ b/Content.Client/Chat/TypingIndicator/TypingIndicatorSystem.cs @@ -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(); } } } diff --git a/Content.Client/Chat/TypingIndicator/TypingIndicatorVisualizerSystem.cs b/Content.Client/Chat/TypingIndicator/TypingIndicatorVisualizerSystem.cs index e89f7ab500..a9af045c0c 100644 --- a/Content.Client/Chat/TypingIndicator/TypingIndicatorVisualizerSystem.cs +++ b/Content.Client/Chat/TypingIndicator/TypingIndicatorVisualizerSystem.cs @@ -35,7 +35,6 @@ public sealed class TypingIndicatorVisualizerSystem : VisualizerSystem(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(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; + } } } diff --git a/Content.Client/Holopad/HolopadSystem.cs b/Content.Client/Holopad/HolopadSystem.cs index 6aad39fe24..40226b9851 100644 --- a/Content.Client/Holopad/HolopadSystem.cs +++ b/Content.Client/Holopad/HolopadSystem.cs @@ -46,7 +46,7 @@ public sealed class HolopadSystem : SharedHolopadSystem if (!HasComp(uid)) return; - var netEv = new HolopadUserTypingChangedEvent(GetNetEntity(uid.Value), ev.IsTyping); + var netEv = new HolopadUserTypingChangedEvent(GetNetEntity(uid.Value), ev.State); RaiseNetworkEvent(netEv); } diff --git a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs index a77bc10f7b..1ccba1ae20 100644 --- a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs +++ b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs @@ -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) diff --git a/Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml.cs b/Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml.cs index 62b3b19e38..068cf4e87e 100644 --- a/Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml.cs +++ b/Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml.cs @@ -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); diff --git a/Content.Server/Holopad/HolopadSystem.cs b/Content.Server/Holopad/HolopadSystem.cs index af8c5a36a1..f2bd0e05ad 100644 --- a/Content.Server/Holopad/HolopadSystem.cs +++ b/Content.Server/Holopad/HolopadSystem.cs @@ -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); diff --git a/Content.Shared/Chat/TypingIndicator/SharedTypingIndicatorSystem.cs b/Content.Shared/Chat/TypingIndicator/SharedTypingIndicatorSystem.cs index 9d60d334db..bc5c95c8ab 100644 --- a/Content.Shared/Chat/TypingIndicator/SharedTypingIndicatorSystem.cs +++ b/Content.Shared/Chat/TypingIndicator/SharedTypingIndicatorSystem.cs @@ -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 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); } } diff --git a/Content.Shared/Chat/TypingIndicator/TypingIndicatorEvents.cs b/Content.Shared/Chat/TypingIndicator/TypingIndicatorEvents.cs index 600f86c0d2..29a5d85be8 100644 --- a/Content.Shared/Chat/TypingIndicator/TypingIndicatorEvents.cs +++ b/Content.Shared/Chat/TypingIndicator/TypingIndicatorEvents.cs @@ -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; } } diff --git a/Content.Shared/Chat/TypingIndicator/TypingIndicatorPrototype.cs b/Content.Shared/Chat/TypingIndicator/TypingIndicatorPrototype.cs index fbd647d035..970fed969a 100644 --- a/Content.Shared/Chat/TypingIndicator/TypingIndicatorPrototype.cs +++ b/Content.Shared/Chat/TypingIndicator/TypingIndicatorPrototype.cs @@ -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 index 0000000000..087610a11b --- /dev/null +++ b/Content.Shared/Chat/TypingIndicator/TypingIndicatorState.cs @@ -0,0 +1,11 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Chat.TypingIndicator; + +[Serializable, NetSerializable] +public enum TypingIndicatorState +{ + None = 0, + Idle = 1, + Typing = 2, +} diff --git a/Content.Shared/Chat/TypingIndicator/TypingIndicatorVisuals.cs b/Content.Shared/Chat/TypingIndicator/TypingIndicatorVisuals.cs index 0368819eff..b9ed15fe9a 100644 --- a/Content.Shared/Chat/TypingIndicator/TypingIndicatorVisuals.cs +++ b/Content.Shared/Chat/TypingIndicator/TypingIndicatorVisuals.cs @@ -5,7 +5,7 @@ namespace Content.Shared.Chat.TypingIndicator; [Serializable, NetSerializable] public enum TypingIndicatorVisuals : byte { - IsTyping + State } [Serializable] diff --git a/Content.Shared/Holopad/HolopadUserComponent.cs b/Content.Shared/Holopad/HolopadUserComponent.cs index c9c2a8828b..d8e4699ee0 100644 --- a/Content.Shared/Holopad/HolopadUserComponent.cs +++ b/Content.Shared/Holopad/HolopadUserComponent.cs @@ -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 /// /// The typing indicator state /// - 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; } } diff --git a/Resources/Prototypes/typing_indicator.yml b/Resources/Prototypes/typing_indicator.yml index 295af30d16..99c06496ac 100644 --- a/Resources/Prototypes/typing_indicator.yml +++ b/Resources/Prototypes/typing_indicator.yml @@ -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 index 0000000000000000000000000000000000000000..83080b2c184e6bca52ac14076686b0c7e53e6b28 GIT binary patch literal 522 zcmeAS@N?(olHy`uVBq!ia0vp^4nUm1!3HGP9xZtRq&N#aB8wRq_>O=u<5X=vX$A(y zJ)SO(Ar*0N?|AbaQV?iJ%(iKk-hOX^_4-FY_jK*PcVMlwzhZLNLVeXn$qWC~)V6Jt z{juP}i6d#oRa<|5uHAD!SN_kwcZD;5THV)s{lhn+gtN|S+vHm@`FD?n{^^~te%E2` zsU82>BDmglujmcX`WLp^wEpQXhCg23nNue_8l*{WnZa0N`D~eE=lgH_`A*vM@>ey4 znS1Ze>;E*Xt(ZB)o`dc3W83nli>1>ZzSQ~k=L)mxzB^3+%slqWJy&jEVB%1~Bvy;g zSi`NO>l48lso(SFP*-ilqG|V^bU$U^VYKR~y8VGw+1I6(|5|F8Yr(K*15eQ;c9ZXy z&hby0asN^F*Or4i7y7?UHrZ)c?31g)C++A~bCYlL)hC~W9xplMlgH@z;eDZFQ1j6_ z_U3o9z8zT4DfI8)kw=yZe|&_#@vP;UIK%Cs1dD(J10xoqv0iY6p8Wx-ZL9t;yguc< zC+iclS4dpaCaV~)ebaWVe$N>Cx89*MPSBKhSJTYDy?&f5NlKW$gZcP?70bM@^A3Nu Ty``Q4j9dm!S3j3^P63NZkczmsvmN~o8wj{ECoxB>IIKOwb&hKzyDk;w(CuJ*S=y_1D<)UaxeUj@z@`Kvpqb9 z^VeFI8>wn)70hSj7-ywSSy3O*Wbz<&rkAGc(wFj67Tma`{5mj8Q_J`NrO*re>+M3$ z2j$vpE|Yb?o$v8CjH%+AuUm56??CxG_rIQ!GI}8RH`k+n-}C)1Bj&1yQ>1*%}(VNp(9h-Ij#)G}u z3S|o>y-)w}WlzjI$urkNB#)_nmQX2s%O&yTw9^+J&IGo3i9v!w91RS(k%J!72X+gO zZ!i5D><<`E{ryS(fcyhbhc{}8Z;zS$U|z$*^AITGu%=<(U(OHg9V|zt$weMa@)rEV z*q7dLEq%dD_WFhjwu(Q3>Ysr+6~Y|u|7%(Ek71TAH`fEpaB$y%oTe O%;4$j=d#Wzp$P!|(N;46 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/speech.rsi/default3.png b/Resources/Textures/Effects/speech.rsi/default3.png new file mode 100644 index 0000000000000000000000000000000000000000..7c157169755dd915bba94ca6ed1b7fbf90f17b66 GIT binary patch literal 431 zcmeAS@N?(olHy`uVBq!ia0vp^4nUm1!3HGP9xZtRq&N#aB8wRq_>O=u<5X=vX$A(y zL{AsTkczmscO3be3TKL%(&3=pJkR@|0TVKz;z)Z_PR~~|4H=B zige!|U2SfmlHB52P;1ksSfhN?*M8oYuxw{wWMbhEP;h8KX8h&ODQ}x5xBT7t z?e}JEG!2VsRQvsT?PvEJl3cMK3@xAdE>u`D>z%h+5W8LYRr9nn{y!Dx+>U;5vGeWs zNXuy(9er&F?O%HBy zMzI<0mRQa&5%Lqbu0+>5ym~Nw!@Pg?3bh}+7rgzb_C~h#-(Q{$9ARn6uZ?#0O=u<5X=vX$A(y zbDl1aAr*0N?-=?WHV`@XQLM20-5SRg!RmgEGbRWG^Pf0(Bqa3Ise9H2kFHNTQ7HUK z>-|l>zu``cLT8=-cXZ|2Uk8f>ZLaapcK&fI@BdD&_{~-KroZ2GtLD1c)fdtKbA;kT zuZH^{Qe-_8P#1eW?dR!bo9j#dRdi$@nXBrw?vM1LarKK;GT$>kxA z6CUc@+Xy%?FtT7H)Hvq6<(?8Dudw^lS@T1;;(O08vO5r)@QQiOE8(vDlCuh`-S>(% zXe_I*3An;h@cn)=SM$QRA2;TH*39i*#a}QrS$X1MaVTIRM05gT zY8|pxFM7osRK9Ps;iT8^zZaL>I^T0k=ImXM(=`k_rOylAfr6xdkx=2$uv@8Ff-_~B haF_O=u<5X=vX$A%+ z5ltJ~ z|BRO@WnZmb>ik5BeKD7_ugv)qH%)c_l9%uIew|tnZs)s_EUZn0wR6Yqdo!WsvzU-M_kP`O$? zpW($`r&}LYl@IurE%gkrmf-%of#+A`J=TxuoReGIK{g zlkGh*@mEpXkDC8wj4p39{_pU4qQLj~9o%=1%%8wMZw^mq!9n>AsSyE<0hg~^h#r!^ zu&0OpwLtxWgIw2a?zDerSJB%ziQgeD%}_sM_mQN(HKrFX@hdC%`R&`kzqaO7g|_AK zsQ#l;F>9Zwwi_^casKq}O#8Zh%j2^btc>*PFW=zaqNn!P5!F>lZnfZJ%&tFhZ^@yZ z4s(9|nljC1wRqprwew{zGhLo)@1T7$YJcoc<}-{DED38n?GNl?y7mjm*GY(Z%3siU z@^z`6+16_7xxA+n%KpsV@8Q`cyggEc+ZR0)knC$XV9)u7iGk>Ow`Tqa_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/speech.rsi/lawyer3.png b/Resources/Textures/Effects/speech.rsi/lawyer3.png new file mode 100644 index 0000000000000000000000000000000000000000..7d9d7af8fe262d587b55f8ef17376197f20209c3 GIT binary patch literal 839 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GGLLkg|>2BR01_q{| zo-U3d6>)FpUd+91Aka4R-2?IOXZ`0bXfxj+e~Xjr`~%*uMY0F1w+NRs_ytsSr|@1q z{-uT4dAHD_&zuk49Xez#{yEw&;(7bOr{+Wj21brE?FZ5}zZC0s6)$!3eJ$UA{9TP* z`R=>x@>zE4AGeiWUiw#MgQ=(gl9seT-q-6-<0~bn9iH@M(#q-vzQ!`SU1ltML;tEg z-lej3L7muz|F1W$tlnGp@!Hqloe_-F<&W%{HovTAV|ZBiFZ2DCA0mGC{9LuT^snKX z6Woj(4h&2J4Gb)xV8O{WR=e_4Z-$sBZop%kAy0>=gCc*VxBv<-fhT)b)1qB(1OS-=6R9@jvnH%jK6}Hr#*D zzV__4+iw@tBpXfrwbyoUQsDP%=fC~o-@iWU%kpdWg7Om%{$0J}$K%xMKU?2a?)vdq zf9dTX4ZDATUjO2{)kN>V*&i9VzL>K8)%pH)_8%D!eiZ!c;!|_rvn-R+BjLPrGv&1B z8%{2H{VO?QqBvpif&8E5(;$CwmC> z?{MaN{_n4|hUN2z|Nfq9h!3v$a!NVszv-I_ef(iA(BNRuxc}=F-uP`dj-3bQ3T5g?vxAsMR_I=Z``DSPLUEA01w&MIo8c z#lz6K@&ckKj~u*uh27_ieN{y1b9NVZlS>YvUm2Ba{V(lZ^_h8+i^(OA(C6$uUu-?U pzdFb7AtdUC>2c)X;1K-5`rX<);!p8oU0}*$@O1TaS?83{1OSWg3UdGe literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/speech.rsi/meta.json b/Resources/Textures/Effects/speech.rsi/meta.json index 17cf95079d..82e676cfb0 100644 --- a/Resources/Textures/Effects/speech.rsi/meta.json +++ b/Resources/Textures/Effects/speech.rsi/meta.json @@ -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", @@ -26,9 +26,39 @@ { "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, @@ -40,12 +70,6 @@ ] ] }, - { - "name": "alienroyal1" - }, - { - "name": "alienroyal2" - }, { "name": "blob0", "delays": [ @@ -125,6 +149,18 @@ { "name": "default2" }, + { + "name": "default3", + "delays": [ + [ + 0.2, + 0.3, + 0.3, + 0.5, + 0.5 + ] + ] + }, { "name": "diona0", "delays": [ @@ -176,6 +212,18 @@ { "name": "guardian2" }, + { + "name": "guardian3", + "delays": [ + [ + 0.2, + 0.3, + 0.3, + 0.5, + 0.5 + ] + ] + }, { "name": "holo0", "delays": [ @@ -195,6 +243,18 @@ { "name": "holo2" }, + { + "name": "holo3", + "delays": [ + [ + 0.2, + 0.3, + 0.3, + 0.5, + 0.5 + ] + ] + }, { "name": "lawyer0", "delays": [ @@ -232,6 +292,21 @@ ] ] }, + { + "name": "lawyer3", + "delays": [ + [ + 0.15, + 0.15, + 0.15, + 0.15, + 0.125, + 0.1, + 0.125, + 0.15 + ] + ] + }, { "name": "lizard0", "delays": [ @@ -249,6 +324,18 @@ { "name": "lizard2" }, + { + "name": "lizard3", + "delays": [ + [ + 0.2, + 0.3, + 0.3, + 0.5, + 0.5 + ] + ] + }, { "name": "moth0", "delays": [ @@ -286,6 +373,27 @@ ] ] }, + { + "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": [ @@ -320,6 +428,20 @@ { "name": "robot2" }, + { + "name": "robot3", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, { "name": "slime0", "delays": [ @@ -361,6 +483,18 @@ ] ] }, + { + "name": "slime3", + "delays": [ + [ + 0.2, + 0.3, + 0.3, + 0.5, + 0.5 + ] + ] + }, { "name": "swarmer0", "delays": [ @@ -429,6 +563,20 @@ { "name": "syndibot2" }, + { + "name": "syndibot3", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, { "name": "spider0", "delays": [ @@ -446,7 +594,19 @@ { "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 index 0000000000000000000000000000000000000000..93b1d1be74e1b0a263d3e7fc3ca3cd411f95287e GIT binary patch literal 2010 zcmbVNc{JOJ7XHPSNGW11)fDxrs$-1zv}b~#w(=rWi!w^3XlrlnThdZXEn!R34-_su)!yZ8I!JLjHrm+#z6XD2&Zs5%q?0NHEy z*4K|2_bnh&$GOA&4&#`l!|iW90)P{+Zvpx|m3#;Q;OuMGmN#N=uM*Msyls@a&+Arb z=;T8)p;YHQKX&I69Qj9-CHKIsi(5s(Y~{9J#iCy@eUA1Ksa|2y;Q4v6XIx^_ zf$j`MWZYAr{V?#1;fNseON?TFP;1XNkNnfWm~X$)E$~#+;HZAuw}$8tu1jEIrgUmK*j=00 zFRLWmhyEN_1Z^%M2W}K=JhnYauF)wn=X=1iD;&36WR~5pF7$}G(B@hsVjl#7V(DCp zVFJ*j#K3V@8T6-Jl{kiEA?2qa966dQy`$cG z8G8qp)6-a++e;~#UY=EPZfzN^e@s+)a;z(S(~tDA@q<2SJy@#P+eFBhD#|P`x7`cN z$PDIf1R`qekRc4e71e_I{ivs7Cu<1&;^5IOfg;{xW4fZle1?>wX31v#@E41WfACvi5)Dh>O zPQlF*lK{$qp&Ov}Y_+U+Xk&FLpsj}I&y|wjuya(rM@8sqf_e5hiT@E3s8Tk`j8}f# z%I5K`tJi1H?i(c&9k3Lz_%7JKP+Jb0OohcS)FUnWabzT1l3O(>0&;~4d5OE=@Fi5K zW9@q+$BQHc`RT?Awp}tx1S@h(FKF{2p9-U_62lh zI1su1j-Hv`(BB@^5O{0Xj+q3=oaJ5pRf!3ICIb9ug0E(ERx`+z>@Jl?8_uVn@RRK5 z%J?mH%uurQh>?XI1~-yP53T7oUl?z5I@JTk@rj@}{frfLAYv*|zxTxhyt_qCExditN1_JH$eFg=3N zUA;2D?G(8X#=LZ7a_oeHbe0 z@HUQdk$$n>!0pK-p|fmB4p&Xr3Z3LF3}=b1e86l%>2IGS>v~D}ad+*sWC0gQnz_?c zIw29yXBk=W=E^7P*i|=8v(b?SociEdo#{t|fVZ@O2lj}cMRP?(|DifpVLJS0K{w*UTbfR#-{lFl6*=BaPgp z?W3LcH=(cqGo@Syq%6I&(yV%bA4yj%lzY5%rjuRhy|f)qFfVh>sVCjzp32H9=^& z*_pe$s?1RD?jOJglFTn?x_R3KX}TgO3D+1MP)IQ)PD%zZ;yKv#DkSYzg3f8Z)toSY zsIlbgB6^QKkQx?4>fTnMkayPx^zH2a+VTI_DQ^joL$KKlAL)8`BLDbV1J`VvtlwDq GKKTz{7qG?v literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/speech.rsi/robot3.png b/Resources/Textures/Effects/speech.rsi/robot3.png new file mode 100644 index 0000000000000000000000000000000000000000..b1686502eb54bedd227766ad662bb4b72a88ecf4 GIT binary patch literal 787 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GGLLkg|>2BR01_q|1 zo-U3d6>)FxZuC0hAkgs8_M+1fcYz$1&n)Sg`RR)L8WQp|b2IgSFexReM?^)u5MHuD zu!coYn$`IA)4a*OLPuumY_FH{w=~{;|D2j;+B>(rG8>ll^;J8sKDMo|^`7=o+sVZCl&(ffoq*RIXI{ll-V zN=9tsYYC(D?VDb`D$M9pjAHm6vg^^83N}6FjW+khwpiLzf%*R$5~fy9ar^hX?!_B^j%wy5 ze*1RVY=6x^;n0niDrT3M%}!S9`uL0&t>XDM_0Tl;(5W)t)FaG0GQyp=Yd-$RpvlSK z?`bw`tz&@P`{XF|jv2mRtONEiui}}q=JuYwyX0%@bR_%Jqx$W0r(~$Nd}@#?uat*{=%Wqz`#V1XlQfr`pYQw z+56ud&#&w%>z5iFSoi76cdc_pKO}$k_HPcCa5=ZU=hWrb{(94`D(}xojGZ^{X4a9v zj58T|Z10|9i0St3kczmsw*&i{3}PV!mp`z7=CH>vm8vz`gO-~1~s>d#$~OZ@xRz5dMf&eT=Vt0$iIjdk;X z+a<4eO->c`>fOI}*VKZ$rA#6Tb0^;n6gkjScDFU3>%sf4A6H)c{y%firAPgn7d&K? zPP0xl+fuF|KaKx>!~Ei!>5sqfy8rpJd++82*6*3w+du!A8gHY#hkuF2zo1o$`({t8 z=e0ldxZC;H?B&)S-Acvs+u#58-@mdbpr=~QSYZW2O-$$;!6Xl-FdoZ>oF`2O61XpL zb{=?B#?8*eq0qp9i#T8}yyGRe)>`}cSpRG69oh$eF%&Ys=v&5+#8_DIk8!7H!b@f=``+*B8owT2ea#%gI`in+ zMYh)5oRb_F7+C}y4n#DFY8^WeBM0JuMHJi_mmRbWYn=n-g9SlE#qtCE&$fSgs^AzI Q0*p!qPgg&ebxsLQ02+(S6#xJL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/speech.rsi/spider3.png b/Resources/Textures/Effects/speech.rsi/spider3.png new file mode 100644 index 0000000000000000000000000000000000000000..4cf57ba5630b5ebfb0f3cfff8b30116fe67ba620 GIT binary patch literal 591 zcmeAS@N?(olHy`uVBq!ia0vp^4nUm1!3HGP9xZtRq&N#aB8wRqxP?HN@zUM8KMV{^ zjGiuzAr*0N?;OlKWWdvqIHTo*O*{;jh3U?rpWcEgS%8oF;EP20lv<$deQC53+k z7kO^8kjuMnxo_U2{g2naQ{AgyKYibwNAk&sW?k8tIct4lS?=vP<));mE)$;IeZ<`m zxA^4i*~~4MtQR!P9*(#E_x#AT`CbNhS1lDN@jG2}^fC8=+TW640Y$H~Ew2BNFBHAz zf6(e&!cFOjt9%e}+D({8mg+dh82?RsjW-?ig0k6ueA#4fqM zW9!GgpNx*~ZTZj7azON;>5lSG%lbPVITRWgm@tSBLQGMzWvkD-t8V|XTfg_Byuh}E zbt+TqrgvX|zW4EEc>{}$DOI2W_J zh!g%R_`Uw@)U~y|kay^wY3O`@Zi|-hOWc0Up8K_vG4s!iFT$Ij%FE7UOty6hn(MpJ z>pSOCTc?+I_BQ1-Ow8H$SyNa3NqHL!d;c*^KVq7}`2BR01_owv zPZ!6KinzCT4f8Jt2plM6-|DQiv1Ek+hd`2Nn_lFdjltpj7`2&$)K&Je2nz|V`OCJ( zhll6nq^ogSOT5-FwXYPxA1segF5}Ba2J1x4qJiAE@5< z=H)}F^*djCFY4L0`TL*yG%v-j)^AVEAADubO0W0Sx@~$?cY3ny?x%_@+Z*4lJF=VEXfJQC zPF<=k9~X<~8LRIvq^>W!@p$^O(uccSj>*L@-e9TD#G%l@K#*9Vvtg6rYNc(N$zePn zXYzm86mz`B>1j=ay|lvHm+yIQA6;s=&2uy3B>A&-7pLw$e`$rb!l~&8cV6}m|8z3N z!lf?3R$1 zgf5Vta-#P+^RmKJvx5n43LXu+?^)NJeSLq`lVd{De>OylUa^%AjO^d|{rUC1|BW=k zbp7l8#7Bxmcn7FNT407*TB+6C(p&m`#~*)WJ5te2vV7iodl}PN{l)`}QdC|LbY*H(or=Z^x{)?)zJ}_X(%P&8IgUwU#XpKO#FJ zZrWeQUL&uMwFmmmCaCxb1)SsfY@4w8VxqeA%~n9!L{Da8tm6fsutE(fB|3 afxc+h`#O)R6UTu0hQZU-&t;ucLK6Uq%Y6#~ literal 0 HcmV?d00001 -- 2.51.2