From 05b65bd8a196197ba770dbaf29c905bcf8c4bce2 Mon Sep 17 00:00:00 2001 From: gardsnake Date: Wed, 22 Jul 2026 18:30:33 +0400 Subject: [PATCH 1/5] =?UTF-8?q?=D0=A0=D0=B0=D0=B7=D0=B4=D0=B2=D0=BE=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B9=20=D1=8F=D0=B7=D1=8B=D0=BA=20=D1=83?= =?UTF-8?q?=D0=BD=D0=B0=D1=82=D1=85=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Locale/ru-RU/_Arcane/markings/tongue.ftl | 1 + .../_Arcane/Mobs/Customization/reptilian.yml | 8 +++ .../reptilian_tongue.rsi/meta.json | 64 ++++++++++++++++++ .../reptilian_tongue.rsi/reptilian_tongue.png | Bin 0 -> 341 bytes .../reptilian_tongue.rsi/tongue.png | Bin 0 -> 389 bytes 5 files changed, 73 insertions(+) create mode 100644 Resources/Locale/ru-RU/_Arcane/markings/tongue.ftl create mode 100644 Resources/Prototypes/_Arcane/Mobs/Customization/reptilian.yml create mode 100644 Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/meta.json create mode 100644 Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/reptilian_tongue.png create mode 100644 Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/tongue.png diff --git a/Resources/Locale/ru-RU/_Arcane/markings/tongue.ftl b/Resources/Locale/ru-RU/_Arcane/markings/tongue.ftl new file mode 100644 index 00000000000..347494fab37 --- /dev/null +++ b/Resources/Locale/ru-RU/_Arcane/markings/tongue.ftl @@ -0,0 +1 @@ +marking-LizardTongue = Раздвоенный язык \ No newline at end of file diff --git a/Resources/Prototypes/_Arcane/Mobs/Customization/reptilian.yml b/Resources/Prototypes/_Arcane/Mobs/Customization/reptilian.yml new file mode 100644 index 00000000000..57aa35249c5 --- /dev/null +++ b/Resources/Prototypes/_Arcane/Mobs/Customization/reptilian.yml @@ -0,0 +1,8 @@ +- type: marking + id: LizardTongue + bodyPart: Face + markingCategory: Face + speciesRestriction: [ Reptilian ] + sprites: + - sprite: _Arcane/Mobs/Customization/reptilian_tongue.rsi + state: reptilian_tongue \ No newline at end of file diff --git a/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/meta.json b/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/meta.json new file mode 100644 index 00000000000..6133dab43b0 --- /dev/null +++ b/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/meta.json @@ -0,0 +1,64 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by gardsnake (github/discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "reptilian_tongue", + "directions": 4, + "delays": [ + [ + 0.250, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.250, + 3.250 + ], + [ + 0.250, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.250, + 3.250 + ], + [ + 0.250, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.250, + 1.250 + ], + [ + 0.250, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.250, + 3.250 + ] + ] + }, + { + "name": "tongue" + } + ] +} diff --git a/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/reptilian_tongue.png b/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/reptilian_tongue.png new file mode 100644 index 0000000000000000000000000000000000000000..903407cad58b16e914e991870c681d64bcb4f59e GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0y~yU{nCI8#vg2T)%RgWK8pix$xU}p$J4`JFbi?;o_tb5jFMavf60-KiqtLaJW9oi> zy8Lrx&W~CDm}lOTCuH`Ir7(BSUlFy@_02u^eScQ|4FB;@BIg%>N>x1${S|AaXTM)- TD#0!G0;Iyz)z4*}Q$iB}l=5O3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/tongue.png b/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/tongue.png new file mode 100644 index 0000000000000000000000000000000000000000..9f9cc91d67b9e09104f6d55987024acfd8882680 GIT binary patch literal 389 zcmV;00eb$4P)Px$KS@MER9J=WmAwkWFc8O2@j*lo1P33$T_3{HMIXR!PHru`wK)JMr+?STWF#cz*#2s@FrFI(fRL0gmvhucX{JD6 zur{C*YgCOyU<_8+Od!1gOjW8w5t8y&Z6hS*Me#B&8z0#pi#6_&xvVfsAdHeBt}4}( zogc(iR`n(J+f<=*1t`swz3pb*x)Ou5ppSkF;Qn|5WBEsWuvYZ~2%`kHn>A`A(zFlwBJB8$WEtW={*&%Yx1 j&DTxBuK_qYIhphZ@`W|?@n04W00000NkvXXu0mjf^Gc`5 literal 0 HcmV?d00001 From 8ed2d5f9f19f7a41098a3b579350c3bb43e041e8 Mon Sep 17 00:00:00 2001 From: gardsnake Date: Fri, 24 Jul 2026 15:06:40 +0400 Subject: [PATCH 2/5] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BA=D0=BB=D1=8E=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=8F=D0=B7=D1=8B=D1=87=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_Arcane/Flicking/TongueFlickingSystem.cs | 137 ++++++++++++++++++ .../Flicking/TongueFlickingComponent.cs | 28 ++++ .../Locale/en-US/_Arcane/actions/tongue.ftl | 2 + .../Locale/en-US/_Arcane/markings/tongue.ftl | 1 + .../Locale/ru-RU/_Arcane/actions/tongue.ftl | 2 + .../Locale/ru-RU/_Arcane/markings/tongue.ftl | 2 +- .../Prototypes/_Arcane/Actions/flicking.yml | 12 ++ .../_Arcane/Mobs/Customization/reptilian.yml | 15 +- .../forked_tongue.png} | Bin .../Customization/forked_tongue.rsi/meta.json | 70 +++++++++ .../forked_tongue.rsi/no_tongue.png | Bin 0 -> 96 bytes .../forked_tongue.rsi/tongue_off.png | Bin 0 -> 918 bytes .../tongue_on.png} | Bin .../reptilian_tongue.rsi/meta.json | 18 ++- 14 files changed, 277 insertions(+), 10 deletions(-) create mode 100644 Content.Server/_Arcane/Flicking/TongueFlickingSystem.cs create mode 100644 Content.Shared/_Arcane/Flicking/TongueFlickingComponent.cs create mode 100644 Resources/Locale/en-US/_Arcane/actions/tongue.ftl create mode 100644 Resources/Locale/en-US/_Arcane/markings/tongue.ftl create mode 100644 Resources/Locale/ru-RU/_Arcane/actions/tongue.ftl create mode 100644 Resources/Prototypes/_Arcane/Actions/flicking.yml rename Resources/Textures/_Arcane/Mobs/Customization/{reptilian_tongue.rsi/reptilian_tongue.png => forked_tongue.rsi/forked_tongue.png} (100%) create mode 100644 Resources/Textures/_Arcane/Mobs/Customization/forked_tongue.rsi/meta.json create mode 100644 Resources/Textures/_Arcane/Mobs/Customization/forked_tongue.rsi/no_tongue.png create mode 100644 Resources/Textures/_Arcane/Mobs/Customization/forked_tongue.rsi/tongue_off.png rename Resources/Textures/_Arcane/Mobs/Customization/{reptilian_tongue.rsi/tongue.png => forked_tongue.rsi/tongue_on.png} (100%) diff --git a/Content.Server/_Arcane/Flicking/TongueFlickingSystem.cs b/Content.Server/_Arcane/Flicking/TongueFlickingSystem.cs new file mode 100644 index 00000000000..d5ff6f326e9 --- /dev/null +++ b/Content.Server/_Arcane/Flicking/TongueFlickingSystem.cs @@ -0,0 +1,137 @@ +// SPDX-FileCopyrightText: 2024 ArchPigeon +// SPDX-FileCopyrightText: 2024 DrSmugleaf +// SPDX-FileCopyrightText: 2024 Krunklehorn <42424291+Krunklehorn@users.noreply.github.com> +// SPDX-FileCopyrightText: 2024 Morb <14136326+Morb0@users.noreply.github.com> +// SPDX-FileCopyrightText: 2024 metalgearsloth +// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +// +// SPDX-License-Identifier: MIT + +using Content.Server.Actions; +using Content.Server.Humanoid; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Markings; +using Content.Shared.Mobs; +using Content.Shared.Toggleable; +using Content.Shared.Flicking; +using Robust.Shared.Prototypes; + +namespace Content.Server.Flicking; + +public sealed class TongueFlickingSystem : EntitySystem +{ + [Dependency] private readonly ActionsSystem _actions = default!; + [Dependency] private readonly HumanoidAppearanceSystem _humanoidAppearance = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnTongueFlickingMapInit); + SubscribeLocalEvent(OnTongueFlickingShutdown); + SubscribeLocalEvent(OnTongueFlickingToggle); + SubscribeLocalEvent(OnMobStateChanged); + SubscribeLocalEvent(OnHumanoidStartup); + } + + private void OnHumanoidStartup(EntityUid uid, HumanoidAppearanceComponent component, ComponentStartup args) + { + Robust.Shared.Timing.Timer.Spawn(100, () => + { + if (!TryComp(uid, out var humanoid)) + return; + + if (!humanoid.MarkingSet.TryGetCategory(MarkingCategories.Face, out var faceMarkings)) + return; + + foreach (var marking in faceMarkings) + { + if (marking.MarkingId.StartsWith("ForkedTongue")) + { + EnsureComp(uid); + return; + } + } + }); + } + + private void OnTongueFlickingMapInit(EntityUid uid, TongueFlickingComponent component, MapInitEvent args) + { + _actions.AddAction(uid, ref component.ActionEntity, component.Action, uid); + } + + private void OnTongueFlickingShutdown(EntityUid uid, TongueFlickingComponent component, ComponentShutdown args) + { + _actions.RemoveAction(uid, component.ActionEntity); + } + + private void OnTongueFlickingToggle(EntityUid uid, TongueFlickingComponent component, ref ToggleActionEvent args) + { + if (args.Handled) + return; + + if (args.Action != component.ActionEntity) + return; + + if (TryToggleTongueFlicking(uid, tongueFlicking: component)) + args.Handled = true; + } + + private void OnMobStateChanged(EntityUid uid, TongueFlickingComponent component, MobStateChangedEvent args) + { + if (component.TongueOut) + TryToggleTongueFlicking(uid, tongueFlicking: component); + } + + public bool TryToggleTongueFlicking(EntityUid uid, TongueFlickingComponent? tongueFlicking = null, HumanoidAppearanceComponent? humanoid = null) + { + if (!Resolve(uid, ref tongueFlicking, ref humanoid)) + return false; + + if (!humanoid.MarkingSet.Markings.TryGetValue(MarkingCategories.Face, out var markings)) + return false; + + var tongueIndex = -1; + + for (var idx = 0; idx < markings.Count; idx++) + { + if (markings[idx].MarkingId.StartsWith("ForkedTongue")) + { + tongueIndex = idx; + break; + } + } + + if (tongueIndex == -1) + return false; + + var currentMarkingId = markings[tongueIndex].MarkingId; + string newMarkingId; + + if (!tongueFlicking.TongueOut) + { + newMarkingId = $"{currentMarkingId}{tongueFlicking.Suffix}"; + } + else + { + newMarkingId = currentMarkingId[..^tongueFlicking.Suffix.Length]; + } + + if (!_prototype.HasIndex(newMarkingId)) + return false; + + tongueFlicking.TongueOut = !tongueFlicking.TongueOut; + + _actions.SetToggled(tongueFlicking.ActionEntity, tongueFlicking.TongueOut); + + _humanoidAppearance.SetMarkingId( + uid, + MarkingCategories.Face, + tongueIndex, + newMarkingId, + humanoid: humanoid); + + return true; + } +} \ No newline at end of file diff --git a/Content.Shared/_Arcane/Flicking/TongueFlickingComponent.cs b/Content.Shared/_Arcane/Flicking/TongueFlickingComponent.cs new file mode 100644 index 00000000000..1bee17e5306 --- /dev/null +++ b/Content.Shared/_Arcane/Flicking/TongueFlickingComponent.cs @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: 2024 DrSmugleaf +// SPDX-FileCopyrightText: 2024 Kara +// SPDX-FileCopyrightText: 2024 Morb <14136326+Morb0@users.noreply.github.com> +// SPDX-FileCopyrightText: 2024 Piras314 +// SPDX-FileCopyrightText: 2024 metalgearsloth +// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Flicking; + +[RegisterComponent, NetworkedComponent] +public sealed partial class TongueFlickingComponent : Component +{ + [DataField] + public EntProtoId Action = "ActionToggleFlicking"; + + [DataField] + public EntityUid? ActionEntity; + + public string Suffix = "Flicking"; + + [DataField] + public bool TongueOut = false; +} \ No newline at end of file diff --git a/Resources/Locale/en-US/_Arcane/actions/tongue.ftl b/Resources/Locale/en-US/_Arcane/actions/tongue.ftl new file mode 100644 index 00000000000..9b0b8094bab --- /dev/null +++ b/Resources/Locale/en-US/_Arcane/actions/tongue.ftl @@ -0,0 +1,2 @@ +ent-ActionToggleFlicking = Flicking Tongue + .desc = Start or stop flicking your tongue. \ No newline at end of file diff --git a/Resources/Locale/en-US/_Arcane/markings/tongue.ftl b/Resources/Locale/en-US/_Arcane/markings/tongue.ftl new file mode 100644 index 00000000000..f38913f3306 --- /dev/null +++ b/Resources/Locale/en-US/_Arcane/markings/tongue.ftl @@ -0,0 +1 @@ +marking-ForkedTongue = Forked Tongue (Toggleable) \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_Arcane/actions/tongue.ftl b/Resources/Locale/ru-RU/_Arcane/actions/tongue.ftl new file mode 100644 index 00000000000..2e0fef02af9 --- /dev/null +++ b/Resources/Locale/ru-RU/_Arcane/actions/tongue.ftl @@ -0,0 +1,2 @@ +ent-ActionToggleFlicking = Шевелить языком + .desc = Начать/перестать шевелить языком. \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_Arcane/markings/tongue.ftl b/Resources/Locale/ru-RU/_Arcane/markings/tongue.ftl index 347494fab37..2cd41476e84 100644 --- a/Resources/Locale/ru-RU/_Arcane/markings/tongue.ftl +++ b/Resources/Locale/ru-RU/_Arcane/markings/tongue.ftl @@ -1 +1 @@ -marking-LizardTongue = Раздвоенный язык \ No newline at end of file +marking-ForkedTongue = Раздвоенный Язык (Переключаемый) \ No newline at end of file diff --git a/Resources/Prototypes/_Arcane/Actions/flicking.yml b/Resources/Prototypes/_Arcane/Actions/flicking.yml new file mode 100644 index 00000000000..9c33773a6c8 --- /dev/null +++ b/Resources/Prototypes/_Arcane/Actions/flicking.yml @@ -0,0 +1,12 @@ +- type: entity + parent: BaseToggleAction + id: ActionToggleFlicking + name: Flicking Tongue + description: Start or stop flicking your tongue. + components: + - type: Action + icon: { sprite: _Arcane/Mobs/Customization/forked_tongue.rsi, state: tongue_off } + iconOn: { sprite: _Arcane/Mobs/Customization/forked_tongue.rsi, state: tongue_on } + itemIconStyle: NoItem + useDelay: 1 + checkCanInteract: false \ No newline at end of file diff --git a/Resources/Prototypes/_Arcane/Mobs/Customization/reptilian.yml b/Resources/Prototypes/_Arcane/Mobs/Customization/reptilian.yml index 57aa35249c5..376c087cd89 100644 --- a/Resources/Prototypes/_Arcane/Mobs/Customization/reptilian.yml +++ b/Resources/Prototypes/_Arcane/Mobs/Customization/reptilian.yml @@ -1,8 +1,17 @@ - type: marking - id: LizardTongue + id: ForkedTongue bodyPart: Face markingCategory: Face speciesRestriction: [ Reptilian ] sprites: - - sprite: _Arcane/Mobs/Customization/reptilian_tongue.rsi - state: reptilian_tongue \ No newline at end of file + - sprite: _Arcane/Mobs/Customization/forked_tongue.rsi + state: no_tongue + +- type: marking + id: ForkedTongueFlicking + bodyPart: Face + markingCategory: Face + speciesRestriction: [ ] + sprites: + - sprite: _Arcane/Mobs/Customization/forked_tongue.rsi + state: forked_tongue \ No newline at end of file diff --git a/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/reptilian_tongue.png b/Resources/Textures/_Arcane/Mobs/Customization/forked_tongue.rsi/forked_tongue.png similarity index 100% rename from Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/reptilian_tongue.png rename to Resources/Textures/_Arcane/Mobs/Customization/forked_tongue.rsi/forked_tongue.png diff --git a/Resources/Textures/_Arcane/Mobs/Customization/forked_tongue.rsi/meta.json b/Resources/Textures/_Arcane/Mobs/Customization/forked_tongue.rsi/meta.json new file mode 100644 index 00000000000..82969dedd38 --- /dev/null +++ b/Resources/Textures/_Arcane/Mobs/Customization/forked_tongue.rsi/meta.json @@ -0,0 +1,70 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by gardsnake (github/discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "forked_tongue", + "directions": 4, + "delays": [ + [ + 0.250, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.250, + 2.250 + ], + [ + 0.250, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.250, + 2.250 + ], + [ + 0.250, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.250, + 2.250 + ], + [ + 0.250, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.250, + 2.250 + ] + ] + }, + { + "name": "no_tongue" + }, + { + "name": "tongue_on" + }, + { + "name": "tongue_off" + } + ] +} diff --git a/Resources/Textures/_Arcane/Mobs/Customization/forked_tongue.rsi/no_tongue.png b/Resources/Textures/_Arcane/Mobs/Customization/forked_tongue.rsi/no_tongue.png new file mode 100644 index 0000000000000000000000000000000000000000..7244b37f5c785d78eee7767f9a4aa6bef3263b07 GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ql2i3ArY-_ n4>B?Wc})uc*XMaSfSB*u1QZw;-5D2j067evu6{1-oD!MPx&P)S5VR9J=0mrqEOaTv!xY2>U9LQs?&wG=ey>d{-|bF z%&{HROCW-Wxf#0@6kQ_vM@Y?Fj!aQE>d;}H)Wy4g9o)O#y??fMPO1l9c=y}$Jm2s0 zeSYtc=Li3rIicro=5AL02*PkT#4f<<2UtE#@BsKO!;>!9c@M8O4nY{60g(X_1>pqG zVSzir6D{SQ0TF~@wL{Ms6f+}dq+jCZQ*<9*GGM z6DGlp2pl!5N{@H{3rhO^ILKk69TzzOY_yXlN0L2$_y^0rX3R7JC5eRJkBb~O&I6ET zlLQ59<01B%+UiM3Q(fLQY-#BW>+2h&)2rn*<-2Lq+XIqR6t80QrG3y+I^kL>-lHJg z;F9Cj=f(X84>fy0SAnO`UTN0eEiAC;_28fd8&o5aki0Wg+L%@xjd6WJ{-44Z+WZB6MHr zqx(u9->(Hps+3stddPoTEa#dC&&Y+6Ep%AZ7Vs;WY zxT+P|Z1hI}e4VNH{SGV@;NPzWDV)B*+FF+N^$qg*ZKkJ2k9>yDCn3E{(Q}R+Y*;zR zF1tvcpLRPpMs8}V2hd$~f~OZ^{aCPKC09CRKK8jdcJWf#Z+dD}6YmCBFT@>+*ah}@ z3EoFAUri0DGLY1gQfaYJTN=!^$3#yNzw$?&FQjLPFylgyAtL s9>#@4Z2|C&K~ZxnQrq9Yoc?qB4NZ+pk@mKB{Qv*}07*qoM6N<$g7Q9`4*&oF literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/tongue.png b/Resources/Textures/_Arcane/Mobs/Customization/forked_tongue.rsi/tongue_on.png similarity index 100% rename from Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/tongue.png rename to Resources/Textures/_Arcane/Mobs/Customization/forked_tongue.rsi/tongue_on.png diff --git a/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/meta.json b/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/meta.json index 6133dab43b0..82969dedd38 100644 --- a/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/meta.json +++ b/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/meta.json @@ -8,7 +8,7 @@ }, "states": [ { - "name": "reptilian_tongue", + "name": "forked_tongue", "directions": 4, "delays": [ [ @@ -20,7 +20,7 @@ 0.125, 0.125, 0.250, - 3.250 + 2.250 ], [ 0.250, @@ -31,7 +31,7 @@ 0.125, 0.125, 0.250, - 3.250 + 2.250 ], [ 0.250, @@ -42,7 +42,7 @@ 0.125, 0.125, 0.250, - 1.250 + 2.250 ], [ 0.250, @@ -53,12 +53,18 @@ 0.125, 0.125, 0.250, - 3.250 + 2.250 ] ] }, { - "name": "tongue" + "name": "no_tongue" + }, + { + "name": "tongue_on" + }, + { + "name": "tongue_off" } ] } From a8fa1f53f69610375ba56aa77ede4efd82cbe3ff Mon Sep 17 00:00:00 2001 From: gardsnake Date: Sun, 26 Jul 2026 16:27:10 +0400 Subject: [PATCH 3/5] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D1=83=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reptilian_tongue.rsi/meta.json | 70 ------------------- 1 file changed, 70 deletions(-) delete mode 100644 Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/meta.json diff --git a/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/meta.json b/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/meta.json deleted file mode 100644 index 82969dedd38..00000000000 --- a/Resources/Textures/_Arcane/Mobs/Customization/reptilian_tongue.rsi/meta.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Made by gardsnake (github/discord)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "forked_tongue", - "directions": 4, - "delays": [ - [ - 0.250, - 0.125, - 0.125, - 0.125, - 0.125, - 0.125, - 0.125, - 0.250, - 2.250 - ], - [ - 0.250, - 0.125, - 0.125, - 0.125, - 0.125, - 0.125, - 0.125, - 0.250, - 2.250 - ], - [ - 0.250, - 0.125, - 0.125, - 0.125, - 0.125, - 0.125, - 0.125, - 0.250, - 2.250 - ], - [ - 0.250, - 0.125, - 0.125, - 0.125, - 0.125, - 0.125, - 0.125, - 0.250, - 2.250 - ] - ] - }, - { - "name": "no_tongue" - }, - { - "name": "tongue_on" - }, - { - "name": "tongue_off" - } - ] -} From 4c892e058eec649beb3edca6a32af1b5b9c3549d Mon Sep 17 00:00:00 2001 From: gardsnake Date: Wed, 29 Jul 2026 15:01:47 +0400 Subject: [PATCH 4/5] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BF=D0=B0=D1=80=D1=83=20=D0=BC=D0=BE=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=B2=20=D1=81=D0=B8=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=BC=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Content.Server/_Arcane/Flicking/TongueFlickingSystem.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/_Arcane/Flicking/TongueFlickingSystem.cs b/Content.Server/_Arcane/Flicking/TongueFlickingSystem.cs index d5ff6f326e9..1381658ff1f 100644 --- a/Content.Server/_Arcane/Flicking/TongueFlickingSystem.cs +++ b/Content.Server/_Arcane/Flicking/TongueFlickingSystem.cs @@ -28,7 +28,7 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnTongueFlickingMapInit); + SubscribeLocalEvent(OnTongueFlickingStartup); SubscribeLocalEvent(OnTongueFlickingShutdown); SubscribeLocalEvent(OnTongueFlickingToggle); SubscribeLocalEvent(OnMobStateChanged); @@ -56,7 +56,7 @@ private void OnHumanoidStartup(EntityUid uid, HumanoidAppearanceComponent compon }); } - private void OnTongueFlickingMapInit(EntityUid uid, TongueFlickingComponent component, MapInitEvent args) + private void OnTongueFlickingStartup(EntityUid uid, TongueFlickingComponent component, ComponentStartup args) { _actions.AddAction(uid, ref component.ActionEntity, component.Action, uid); } From a541e74217be8d176edfb657a995f4960dcd9e10 Mon Sep 17 00:00:00 2001 From: gardsnake Date: Fri, 31 Jul 2026 15:01:29 +0400 Subject: [PATCH 5/5] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D1=81=D0=BE=D0=B2=D0=B5=D1=82=D1=83=20ReWAFF?= =?UTF-8?q?lution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Content.Server/_Arcane/Flicking/TongueFlickingSystem.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Content.Server/_Arcane/Flicking/TongueFlickingSystem.cs b/Content.Server/_Arcane/Flicking/TongueFlickingSystem.cs index 1381658ff1f..bdcc1c99df6 100644 --- a/Content.Server/_Arcane/Flicking/TongueFlickingSystem.cs +++ b/Content.Server/_Arcane/Flicking/TongueFlickingSystem.cs @@ -18,11 +18,11 @@ namespace Content.Server.Flicking; -public sealed class TongueFlickingSystem : EntitySystem +public sealed partial class TongueFlickingSystem : EntitySystem { - [Dependency] private readonly ActionsSystem _actions = default!; - [Dependency] private readonly HumanoidAppearanceSystem _humanoidAppearance = default!; - [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private ActionsSystem _actions = default!; + [Dependency] private HumanoidAppearanceSystem _humanoidAppearance = default!; + [Dependency] private IPrototypeManager _prototype = default!; public override void Initialize() {