From ad525c86c672b60715f689a936a8376fb36836d6 Mon Sep 17 00:00:00 2001 From: Remuchi <72476615+Remuchi@users.noreply.github.com> Date: Sat, 2 Mar 2024 21:16:27 +0700 Subject: [PATCH] =?UTF-8?q?[Fix]=20=D0=A0=D0=B0=D0=B7=D0=BD=D1=8B=D0=B5=20?= =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=D1=8B=20(#161)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: фикс отображений в ахелпе * fix: нотисы в чат больше не отправляют сообщение в консоль * fix: исправлена текстура секретной двери * fix: ошибки перевода при вылизывании ран --- .../UI/Bwoink/BwoinkControl.xaml.cs | 66 +++++------------- .../CustomControls/PlayerListControl.xaml.cs | 10 ++- Content.Client/Popups/PopupSystem.cs | 10 ++- .../_White/SelfHeal/SelfHealSystem.cs | 15 ++-- .../components/self-healing-component.ftl | 12 ++-- .../components/self-healing-component.ftl | 12 ++-- .../doors/secretdoor/secretdoor.ftl | 10 +++ .../Doors/secret_door.rsi/assembly.png | Bin 305 -> 859 bytes .../Doors/secret_door.rsi/closed.png | Bin 171 -> 1637 bytes .../Doors/secret_door.rsi/closing.png | Bin 516 -> 3212 bytes .../Structures/Doors/secret_door.rsi/open.png | Bin 219 -> 772 bytes .../Doors/secret_door.rsi/opening.png | Bin 530 -> 2985 bytes 12 files changed, 60 insertions(+), 75 deletions(-) create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/doors/secretdoor/secretdoor.ftl diff --git a/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml.cs b/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml.cs index af977f763c..5ab3a71bb3 100644 --- a/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml.cs +++ b/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml.cs @@ -12,7 +12,6 @@ using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; using Robust.Shared.Network; using Robust.Shared.Utility; -using Robust.Shared.Timing; using Robust.Shared.Configuration; namespace Content.Client.Administration.UI.Bwoink @@ -49,39 +48,11 @@ namespace Content.Client.Administration.UI.Bwoink ChannelSelector.OnSelectionChanged += sel => { _currentPlayer = sel; - SwitchToChannel(sel?.SessionId); + SwitchToChannel(sel.SessionId); ChannelSelector.PlayerListContainer.DirtyList(); }; - ChannelSelector.OverrideText += (info, text) => - { - var sb = new StringBuilder(); - - if (info.Connected) - sb.Append('●'); - else - sb.Append(info.ActiveThisRound ? '○' : '·'); - - sb.Append(' '); - if (AHelpHelper.TryGetChannel(info.SessionId, out var panel) && panel.Unread > 0) - { - if (panel.Unread < 11) - sb.Append(new Rune('➀' + (panel.Unread-1))); - else - sb.Append(new Rune(0x2639)); // ☹ - sb.Append(' '); - } - - if (info.Antag && info.ActiveThisRound) - sb.Append(new Rune(0x1F5E1)); // 🗡 - - if (info.OverallPlaytime <= TimeSpan.FromSeconds(_cfg.GetCVar(CCVars.NewPlayerThreshold))) - sb.Append(new Rune(0x23F2)); // ⏲ - - sb.AppendFormat("\"{0}\"", text); - - return sb.ToString(); - }; + ChannelSelector.OverrideText += (info, _) => FormatTabTitle(info); ChannelSelector.Comparison = (a, b) => { @@ -166,11 +137,10 @@ namespace Content.Client.Administration.UI.Bwoink ChannelSelector.PopulateList(); } - public void SelectChannel(NetUserId channel) { if (!ChannelSelector.PlayerInfo.TryFirstOrDefault( - i => i.SessionId == channel, out var info)) + i => i.SessionId == channel, out var info)) return; // clear filter if we're trying to select a channel for a player that isn't currently filtered @@ -208,33 +178,33 @@ namespace Content.Client.Administration.UI.Bwoink Follow.Disabled = !Follow.Visible || disabled; } - private string FormatTabTitle(ItemList.Item li, PlayerInfo? pl = default) + private string FormatTabTitle(PlayerInfo info) { - pl ??= (PlayerInfo) li.Metadata!; var sb = new StringBuilder(); - sb.Append(pl.Connected ? '●' : '○'); + sb.Append(info.Connected ? '●' : + info.ActiveThisRound ? '○' : '·' + ); + sb.Append(' '); - if (AHelpHelper.TryGetChannel(pl.SessionId, out var panel) && panel.Unread > 0) + if (AHelpHelper.TryGetChannel(info.SessionId, out var panel) && panel.Unread > 0) { - if (panel.Unread < 11) - sb.Append(new Rune('➀' + (panel.Unread-1))); - else - sb.Append(new Rune(0x2639)); // ☹ + sb.Append(panel.Unread < 11 ? new Rune('➀' + (panel.Unread - 1)) : new Rune(0x2639)); // ☹ + sb.Append(' '); } - if (pl.Antag) + if (info.Antag) sb.Append(new Rune(0x1F5E1)); // 🗡 - if (pl.OverallPlaytime <= TimeSpan.FromSeconds(_cfg.GetCVar(CCVars.NewPlayerThreshold))) + if (info.OverallPlaytime <= TimeSpan.FromSeconds(_cfg.GetCVar(CCVars.NewPlayerThreshold))) sb.Append(new Rune(0x23F2)); // ⏲ - sb.AppendFormat("\"{0}\"", pl.CharacterName); + sb.Append($"\"{info.CharacterName}\""); - if (pl.IdentityName != pl.CharacterName && pl.IdentityName != string.Empty) - sb.Append(' ').AppendFormat("[{0}]", pl.IdentityName); + if (info.IdentityName != info.CharacterName && info.IdentityName != string.Empty) + sb.Append(' ').Append($"[{info.IdentityName}]"); - sb.Append(' ').Append(pl.Username); + sb.Append(' ').Append(info.Username); return sb.ToString(); } @@ -257,4 +227,4 @@ namespace Content.Client.Administration.UI.Bwoink UpdateButtons(); } } -} +} \ No newline at end of file diff --git a/Content.Client/Administration/UI/CustomControls/PlayerListControl.xaml.cs b/Content.Client/Administration/UI/CustomControls/PlayerListControl.xaml.cs index e02b22f4a2..7366fc5633 100644 --- a/Content.Client/Administration/UI/CustomControls/PlayerListControl.xaml.cs +++ b/Content.Client/Administration/UI/CustomControls/PlayerListControl.xaml.cs @@ -1,10 +1,12 @@ using System.Linq; using Content.Client.Administration.Systems; +using Content.Client.Stylesheets; using Content.Client.UserInterface.Controls; using Content.Client.Verbs.UI; using Content.Shared.Administration; using Robust.Client.AutoGenerated; using Robust.Client.Graphics; +using Robust.Client.ResourceManagement; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; @@ -26,15 +28,18 @@ namespace Content.Client.Administration.UI.CustomControls public Func? OverrideText; public Comparison? Comparison; - private IEntityManager _entManager; - private IUserInterfaceManager _uiManager; + private readonly IEntityManager _entManager; + private readonly IUserInterfaceManager _uiManager; private PlayerInfo? _selectedPlayer; + private readonly Font _fontOverride; + public PlayerListControl() { _entManager = IoCManager.Resolve(); _uiManager = IoCManager.Resolve(); + _fontOverride = IoCManager.Resolve().NotoStack(size: 12); _adminSystem = _entManager.System(); RobustXamlLoader.Load(this); // Fill the Option data @@ -137,6 +142,7 @@ namespace Content.Client.Administration.UI.CustomControls new Label { ClipText = true, + FontOverride = _fontOverride, Text = GetText(info) } } diff --git a/Content.Client/Popups/PopupSystem.cs b/Content.Client/Popups/PopupSystem.cs index 821e4a8993..77197aa8ea 100644 --- a/Content.Client/Popups/PopupSystem.cs +++ b/Content.Client/Popups/PopupSystem.cs @@ -11,6 +11,7 @@ using Robust.Client.ResourceManagement; using Robust.Client.UserInterface; using Robust.Shared.Configuration; using Robust.Shared.Map; +using Robust.Shared.Network; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Replays; @@ -30,6 +31,7 @@ namespace Content.Client.Popups [Dependency] private readonly IUserInterfaceManager _uiManager = default!; [Dependency] private readonly IReplayRecordingManager _replayRecording = default!; [Dependency] private readonly IChatManager _chatManager = default!; + [Dependency] private readonly IClientNetManager _clientNet = default!; public IReadOnlyList WorldLabels => _aliveWorldLabels; public IReadOnlyList CursorLabels => _aliveCursorLabels; @@ -99,12 +101,14 @@ namespace Content.Client.Popups { PopupType.LargeCaution, "15" } }; - var fontsize = fontSizeDict.ContainsKey(type) ? fontSizeDict[type] : "10"; - var fontcolor = (type == PopupType.LargeCaution || type == PopupType.MediumCaution || type == PopupType.SmallCaution) ? "c62828" : "aeabc4"; + var fontsize = fontSizeDict.GetValueOrDefault(type, "10"); + var fontcolor = type is PopupType.LargeCaution or PopupType.MediumCaution or PopupType.SmallCaution ? "c62828" : "aeabc4"; if (isLogging) { - _chatManager.SendMessage($"notice [font size={fontsize}][color=#{fontcolor}]{message}[/color][/font]", ChatSelectChannel.Console); + var wrappedMEssage = $"[font size={fontsize}][color=#{fontcolor}]{message}[/color][/font]"; + var chatMsg = new ChatMessage(ChatChannel.Emotes, message, wrappedMEssage, GetNetEntity(EntityUid.Invalid), null); + _clientNet.DispatchLocalNetMessage(new MsgChatMessage { Message = chatMsg }); } } diff --git a/Content.Server/_White/SelfHeal/SelfHealSystem.cs b/Content.Server/_White/SelfHeal/SelfHealSystem.cs index 14c0bd9132..853d01c4b6 100644 --- a/Content.Server/_White/SelfHeal/SelfHealSystem.cs +++ b/Content.Server/_White/SelfHeal/SelfHealSystem.cs @@ -72,7 +72,7 @@ public sealed class SelfHealSystem: EntitySystem // Logic to determine the whether or not to repeat the healing action args.Repeat = (HasDamage(component, healing) && !dontRepeat); if (!args.Repeat && !dontRepeat) - _popupSystem.PopupEntity(Loc.GetString("self-heal-finished-using", ("verb", Loc.GetString("self-heal-lick")), ("name", uid)), uid, args.User); + _popupSystem.PopupEntity(Loc.GetString("self-heal-finished-using", ("name", uid)), uid, args.User); args.Handled = true; @@ -90,8 +90,8 @@ public sealed class SelfHealSystem: EntitySystem var targetString = EntityManager.ToPrettyString(uid); var healMessage = uid != args.User - ? $"{userString:user} healed {targetString:target} for {total:damage} with {Loc.GetString("self-heal-lick")}" - : $"{userString:user} healed themselves for {total:damage} with {Loc.GetString("self-heal-lick")}"; + ? $"{userString:user} healed {targetString:target} for {total:damage} by licking" + : $"{userString:user} healed themselves for {total:damage} by licking"; _adminLogger.Add(LogType.Healed, $"{healMessage}"); if (TryComp(args.User, out var selfHealComponent)) @@ -100,7 +100,7 @@ public sealed class SelfHealSystem: EntitySystem var audioParams = new AudioParams().WithVariation(2f).WithVolume(-5f); _audio.PlayPvs(audio, args.User, audioParams); - _popupSystem.PopupEntity(Loc.GetString("self-heal-using-other", ("name", uid), ("verb", Loc.GetString("self-heal-lick"))), uid); + _popupSystem.PopupEntity(Loc.GetString("self-heal-using-other", ("user", args.Args.User), ("target", uid)), uid); } } @@ -114,8 +114,7 @@ public sealed class SelfHealSystem: EntitySystem if (!HasDamage(targetDamage, component)) { - var popup = Loc.GetString("self-heal-cant-use", ("verb", Loc.GetString("self-heal-lick")), - ("name", target)); + var popup = Loc.GetString("self-heal-cant-use", ("name", target)); _popupSystem.PopupEntity(popup, user, user); return false; } @@ -128,7 +127,7 @@ public sealed class SelfHealSystem: EntitySystem EntityManager.TryGetComponent(blockedClothing, out var blocker) && blocker.Enabled) { - var popup = Loc.GetString("self-heal-cant-use-clothing", ("verb", Loc.GetString("self-heal-lick")), ("clothing", blockedClothing)); + var popup = Loc.GetString("self-heal-cant-use-clothing", ("clothing", blockedClothing)); _popupSystem.PopupEntity(popup, user, user); return false; } @@ -141,7 +140,7 @@ public sealed class SelfHealSystem: EntitySystem { if (_inventorySystem.TryGetSlotEntity(target, clothing, out var blockedClothing)) { - var popup = Loc.GetString("self-heal-cant-use-clothing-other", ("verb", Loc.GetString("self-heal-lick")), ("name", target), ("clothing", blockedClothing)); + var popup = Loc.GetString("self-heal-cant-use-clothing-other", ("name", target), ("clothing", blockedClothing)); _popupSystem.PopupEntity(popup, user, user); return false; } diff --git a/Resources/Locale/en-US/medical/components/self-healing-component.ftl b/Resources/Locale/en-US/medical/components/self-healing-component.ftl index e654d44cbf..751f084b8f 100644 --- a/Resources/Locale/en-US/medical/components/self-healing-component.ftl +++ b/Resources/Locale/en-US/medical/components/self-healing-component.ftl @@ -1,8 +1,6 @@ -self-heal-finished-using = You have finished {$verb}ing all {$name}`s wounds -self-heal-cant-use = There is no damage you can heal by {$verb}ing {$name} -self-heal-stop-bleeding = They have stopped bleeding -self-heal-lick = lick -self-heal-cant-use-clothing = You cant {$verb}ing yourself while wearing a {$clothing} -self-heal-cant-use-clothing-other = You cant {$verb}ing {$name} while {$name} is wearing a {$clothing} +self-heal-finished-using = You have finished licking all {$name}`s wounds +self-heal-cant-use = There is no damage you can heal by licking {$name} +self-heal-cant-use-clothing = You cant lick yourself while wearing a {$clothing} +self-heal-cant-use-clothing-other = You cant lick {$name} while {$name} is wearing a {$clothing} self-heal-action = Lick the wounds -self-heal-using-other = {$name} have {$verb}ed some of {$name} wounds +self-heal-using-other = {$user} have licked some of {$target} wounds diff --git a/Resources/Locale/ru-RU/medical/components/self-healing-component.ftl b/Resources/Locale/ru-RU/medical/components/self-healing-component.ftl index ec2db16b58..db06a99529 100644 --- a/Resources/Locale/ru-RU/medical/components/self-healing-component.ftl +++ b/Resources/Locale/ru-RU/medical/components/self-healing-component.ftl @@ -1,9 +1,7 @@ -self-heal-finished-using = Вы закончили {$verb} все раны {$name}! -self-heal-cant-use = {$name} не имеет ран, которые вы могли бы {$verb} -self-heal-stop-bleeding = Оно перестало кровоточить -self-heal-lick = вылизывать -self-heal-cant-use-clothing = Вы не можете {$verb}, пока на вас {$clothing} -self-heal-cant-use-clothing-other = Вы не можете {$verb} {$name}, пока {$name} носит {$clothing} +self-heal-finished-using = Вы закончили вылизывать все раны {$name}! +self-heal-cant-use = {$name} не имеет ран, которые вы могли бы вылизать +self-heal-cant-use-clothing = Вы не можете вылизываться, пока на вас {$clothing} +self-heal-cant-use-clothing-other = Вы не можете вылизать {$name}, пока {$name} носит {$clothing} self-heal-action = Зализать раны -self-heal-using-other = {$name} закончил {$verb} часть {$name} ран +self-heal-using-other = {$user} вылизывает часть ран {$target} ent-SelfHealAction = Зализать раны diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/doors/secretdoor/secretdoor.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/doors/secretdoor/secretdoor.ftl new file mode 100644 index 0000000000..fdf5e1336b --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/doors/secretdoor/secretdoor.ftl @@ -0,0 +1,10 @@ +ent-BaseSecretDoor = { ent-WallSolid } + .desc = { ent-WallSolid.desc } + .suffix = секретная дверь + +ent-BaseSecretDoorAssembly = каркас секретной двери + .desc = Она открывается, закрывается, и даже может вас раздавить! + +ent-SolidSecretDoor = { ent-BaseSecretDoor } + .desc = { ent-WallSolid.desc } + \ No newline at end of file diff --git a/Resources/Textures/Structures/Doors/secret_door.rsi/assembly.png b/Resources/Textures/Structures/Doors/secret_door.rsi/assembly.png index 6518b7245c721677990edb252828d4ce34c776f5..e872d82c5d4e2781f67cad1c369e25bc5199e936 100644 GIT binary patch delta 837 zcmV-L1G@aN0^0_VBYy)TNkl6BVhr#a{B%ktrL#uQ((v*2*p=jHqDbvtXR zZg)ihM1)48#dJDWB(!dKMdqv!0(NU_i#*RU#$b$PIvuCvvwyz6zF;|5qC1@)olb`k z0?w65;lTe`wpKG-zWf2x=@GNp3_u<{_&r$|c6Z-lp)Ool6%kOX%7eYV&v^LofK(!S zy;YgBtj)0fejlhlwA)MEzWtp7*x&y`?%us~<{}1z{({wNwNYzp8v>w|qF!(D^ywc- zt6*(yL*}eJpMPOR6h(0Y2q!0RQnCTa^ZXr_{rt;)VvJaup|#@MZ@x|{;MP~S7OYpV z{>DB!cub5DqYWf=KHR*yCyx#uW3)jVO;O}n?;SBlFcGayQg~73)xktWOw|b`2DH+| z7;)Yufq(Szr*iM!PYU41jZb9G3O-<4?GE0Rgcy({cz^iym!B8G&9ZF4YP6f^7(6J2 zQi@uwmPo=WJH_(BqpQTL?k3vOsH% z_ve!XA%8>!0TG;wSYr$b75p4LAR=h3VLlVgtH4-`cWFA|X)B5xL=X|8M65Pd5^7UD z$xVSV7Ns>>Y3$W&LzGfzttnl}k3W2$l)t^bjWMPQ1EA)6fl?Zg$no*ZoOSh8IS+M7{g$&!DRAhB|tiua^;#pH5Ea1Y1QpslzP2MQM^F}UcXLThL-dRK P00000NkvXXu0mjf>J5@4 delta 279 zcmV+y0qFkQ2C)K=BYyw^b5ch_0Itp)=>Px#>q$gGR9J=WmoW;2Fc3w5G@W2!FL(;U z-eOLWLwW*lAmkd;TUZO(Vqr-}S6E1d#e7H;#=OUnfTQ}pckp7ZRY(}g(_PmE1=iY> zd`O;V=A=Lw$t%jTguje2?#s7PB6)>U3jShd5K%G-$dyIF86H$MC97GJ?!f{;Qosm$1&)_EgiUeQO~-BSs)8! zfh>>(vcP`{#2iqr&QkIZrD+;$+xD3cVugrYUDsIGHP}CNfSIGif%m|3HisSrmSssc do}Zol0zPa_Ob}aCGBE%E002ovPDHLkV1ns&N(FI-o10rdFA+o z5Q%YQSq|KMw%Zft`GC6t;O=ZTJC^0D$E6f*TT7li`P4U?Eq{l@C92A1vt^#In5Kyr zFJAJ&2ft&QCQ_<}hhb!%XF>>s5Lwry$0@Dcww3~j2Z`9E;NHFaOw+{0#Sa~-@4kD=H{bk?r%(TZi1ZJ9 z_~FOAe*Kcm%YREg`sfcmK0ddpCHL>2yE~MU5dn7)ffy%JTH3(c^Ksme($dGcJ0Lxd zap1PK;*%$T;?0{^eWoJ9!-tP~`SOBN3IJw>v$IEBUjD-2aM?+?-=AcGX zqBS;aL^245Y9QwX!Eg_hQZTbBFA++~xI+pFLAw0RtWI7E8bid~arYY^D3}$%38IMB zL>0lUpdy$V%R0Xkmz=voglfeC6}g7(v3AKB+<%Fur+51wb@fg$Lul}~hL}|}N-pHI zQmo*>FbqB3?6-{5rV&k05mHWUw|i8ZIt1LVl@zTM9It(DlW-gj0V^4^3bmP4h)aeB z@i>mX&^V6doCzf(qID8olGS>_acc-Q zQtB{=5Ub>hT_fvG3=zli#_0r{IpLc37qPP|AsA zS=jGSx-|)qOGZN=r`$ax=Y)pp6;U;SD}N%+Fpg|CyLwO%?PWrMaU2ODR#|EQcZNYJ zrLJz&z&LKYd}FNY(h{4;$c+uFxs5Ao=8aTGxqua`gmK6G=npN&oSYJ+lx8S&iK$8- zUrOQVy4SnoO)sh6jq5sdbvQ6i6T96WL|E1ZSp^N+tkY1b7FtR{Rmr*bJ;vHo+49>R#I;N~3>4WS|yBBF{)ZA~-J zx~I4kqxXG6HQ*S7Lx= zyloobzTxcb5kLR@maD5nd*_^<-eI%Z^5)H}Tjrgz+3emqw5lp{_wIe)ZckX2t8Nki z<9L0xJ3b+Vb~CCMj_r2;UVnK_3T(G0#4o@6qCZhUK%6tC&`)XkB$S0rt*^dkkA#i^Fn2U>lbw~joJUHXovwyPR zZ~MFb{)EfRUw$L+oM+FT{VH$2KjFoTA8HFe|NIM|=NU7rQfq_WzE1tAv9_*go)g>c z*tgXXwB7M;pEph0c6Xes4BcU~*|M%H?xhijcHGu}t*VbOO&ay%Eh88EcO+d1>k>7)Ls+oyt0=IN(70HC}@Q49q-WqJzUT viLp9g?1Nktuk-gfu?tbjjKzK;ADFk<3jci5&GQCmAt!^UtDnm{r-UW|7veOj diff --git a/Resources/Textures/Structures/Doors/secret_door.rsi/closing.png b/Resources/Textures/Structures/Doors/secret_door.rsi/closing.png index 0bb895b050f0d11e75d4ceed4e62cdac855c6d56..96bba25801db58b70b39c432e8bc0e48bb4017cf 100644 GIT binary patch literal 3212 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 diff --git a/Resources/Textures/Structures/Doors/secret_door.rsi/open.png b/Resources/Textures/Structures/Doors/secret_door.rsi/open.png index 81862e1eade5b452853842c8baaa21f5413914aa..7ca06de1ed329debf7c292448d995390a53eaf02 100644 GIT binary patch delta 749 zcmVbk~Si?xo`s?6zgdV0FEynk{0j{n-TL9+4gA-K+W4b!HyZex}2By;!-CE8SxY=w5 zbPqTL6qP)OE;;160-R&MM0ir)p@L4WMi`pRxz2>-s;I z`{Bo@q?B;3K!3#W>n}fN4e;!zXFKcmw!*!7`I?jxRxD&KzizyG`5G%0u|m_-xDY%k zC9nw*n>|1X9&AF@cAZdDM2wJ9!Uvx{fEcs0Vu-lmXiV@eF-0^x4@FVzto~?#q!_>$ zj4||jz5EIOWrY}!uJF2dSKY@Pe6|eWeA^OZB*cJoMSpg_ZJM3sy~j+RlK2DPoqQ@Asmm1i92?0b5u5BAcgb?;q z12HBP1y#IHIBP8^9lnPdP*p?(wr7IvF0jrKeEv?@G&QKAsw7P~v0V|0?XK*@fVB=I zf*8R)`hV_Qj4_A^t#A3`_usPm7Z(>;YrACt%=W*)7(q30fB!N2e*wV3!H^JIT)#iS zxgIG6RF(Vtk2!q?gCWipgy0zt4{>K_XY~66-oJl`h;VcBHfw;(%PSU(x4W)uX0va! zt~dXr8?juz$+`qbM_+16X?O1~FCSryVLtzg#b%;pxqOq;=gE`D%w}^|t9RX5v@EXy zsH!{G>%X$%0A+d2a(Tmi{xyq5i9pwpHk);J9AG>B%Vo*o;RJVmz2M+rK+}BMM<=GL f?r7T<)d;}fZjXTCTkGe900000NkvXXu0mjfbgp&p delta 192 zcmZo+yUjR3xt@WsILO_JVcj{ImkbOHQ$1ZALn2z=UNq!tRupIn?7dvsCU4XF{e6pV z>jTL*BA1VO2E7Zjo~yKnzh~<;VLLS?LybP$DM9Pll@`5Z|7LJ3fVJ|C;?fkU19C|r ze?P6?*gj`-CPQ^Z_Dr@7-;J);pJBE+fItifq%8NGFZR34@U7t7&(9(0ZxY|<0=3S2 pzEdwMdlloGh2Ph4eY#Q2Eb>=xO`G%HHlPa`JYD@<);T3K0RX2VR2u*Q diff --git a/Resources/Textures/Structures/Doors/secret_door.rsi/opening.png b/Resources/Textures/Structures/Doors/secret_door.rsi/opening.png index 9d14324686769b131f947fdce1c02423f2cd3823..861f6fbbc341cbca6db828e396cffef6d990a175 100644 GIT binary patch literal 2985 zcmYjTc|4SB8y*Z}i6KIRv2{esl5KR%AWn8l2qhv*jj=D;37KPLUn*nkL?!z&B8+`W z$2LqD`z|4*p|N}~r|*2@QWDIxKra1Ct)<1>k|2L zN19jiCvSrkE4cQPQ8+)7y-JCzUb;{x< z9M_(C-!C?Da-t!2^U>q&Z3Q`njyaaXhY$$mU{_YDY5w$P z71qmw=PoLBw+{&sB3oBsDl3q$iu1-p*>}2{jXnEmG;dJTj~^T*w(3m-11bH})Tyb? zi4S3|2Q;dNcHV#qsy32D;>KrX&CDgZN3A)wS5;S6Be6jnlm60>qm|eGOaWgvURS0F z`uQ!2(OaT5z*vxWI9a?3Gr_V;v$cvJAo%XaVL`cN#l8_Un08Ow#^6RT;mPs(3tDPe z$>&+Kx$YA`FJ&WxV6e@GS(veLyj?LP2;p2_;~!pGse(|aI^WWk%PgMR-@oW;^1AZw z?WV)S9e;vS6m6}h?-oZWYD!?=Jdk3yl6eE0*G@{2LAV4wY5l1Z98RFIn5V7cri#N=1 z-+l-2KiwbVwhRsMc_4tr^gQ$9qz=E!2_*Fkot-VOS9(=;Q}Da+(f;{39r3tp;zQV0u4t*(-W=9^b`pw4+=Q^hJw^%ASsrQZd%0_=jx6WtCFm7eRoS?F zZYsmu4wlpp8@;~S9xS}mg!k4RYXcSR!|e1!ys_&caXnN*48hgJq7m-R5qm}>yqY)m zjHUdSI(lhFCWce|4*Ro?icBCm1rQO+rCI*i*N?Nt78?2p@rmJB87_%LaF%yQFHf#z z^PiF25GERC=~h&)s)nkZG(U;{qo#JVHQQ2ff|!^kT7Y4igDOJ`9~>`P|K+$ea#Wt<%Wmbi+x zHk7EuWnT+_kF#nwy_`-d*=5 z_D^JdsEFZkjq9^GT6_*4c_hCtPgP8OI736||(HD+Hr&M=LQ^R{Lsz+u|1TwI|d{lrDX#>u@FT z7WjdiEEz0V3zY7mFotXv7yhJ_u4TQ8RPzEL&$tF;DSV)_`##aAKq*^Mu`zsG*4Ilno zW0_az6k;`3F}nF}X5!w)Czd!&t9SeYNgZS-f!JJSL9gXACa|ENuJ=Zoxe=cP&fC34 zEEl{jL#XSh!tPzkqSJnp2^-?H^sKq>Z?|PYb#&<14ay=P-eu*gDrPhJ`Roi2t=-T@ zR+#9=CW5vrGMfF-W3AGq<&y-Q*#4fN8`X%;`&S~p4+rRzGOU!Rg>T8F(u*)Nlwo%( zDOn*$R$C152&{-;qU|zge|1XBu^{P^N2NIGN-pqITC5)ec_2W&HVGQ2sGd9^6%}M3FmK0+B8`) ztQQ!x9ok4eYo2&+UI>=gyyNebb~K0I>2YW+rzsS%Pmmd*^E(UhSIRqu`2c#brGf)PF*&lT$PR< zb$wD;Qny!<6KJ*6Qgue-G*$iR@bky=srQ}^i80(oyoOh-!&_m;S|4NHxuq_n0*5<_StP53x_lN1nQ zY9 z!Rwow3BcspTOtb2dwO_WI%Z78{m?l5FM=uS_MVcU(1H6x9%+3Y4oB_FI#ufJPPh`D z0Fz{6#63O+D%@B-1^my=o!6b2{6L-1m#z0*C7jxPbhxhwglZzK@PJw{)4RL!WU_Kg z43^m>Cwq5qEnmeF*FGBb)qfvHYXG=;`)_B1!qvi=<=`g$itO61R5~9nHjW#0C8}}P zxQBN3rVrB70Kww;WFY~ZZ-K7P5b}M%SMTq3Dq7bV1yLclTBl^4UCs0ND>=6`OFNU9 z0!fS(SQVYEP;fx<>-M!%rIpX;-~?7TMW2>EwMP5=cm;q67?r~VLqcMQ?gSIH~1<=;&m? zQOIWCm|Xiyo&zddktBP!{?rlgbjX*@x$_7VYQ<|SA!w~{>Y=a(P=1KWab~>uFPQ;) yh_UMkTn?f(#++L`k)(gG(+mf-t21tASKY|}wCPIP;_*csr1yuhcF9${$NvFp63cu5 literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^2|(b=ZN&^=a>}IR_^M|M)jI(J%3XaQkgp6o;ec)3?=6WWL@`mnpgbeX^Bdhe7*MNB!yD&8I4q&LkFI z$o%#FxsI&hvkew6zE+h6Ncy)}>hM*`v_s{86n;?PHDHinV>rx^Ai==H+>pp%z{AkS zcmTKH;#FN`FPy;U?7uG?a!fdpue;f9zGk@de*rL4j-P$%N0%9gA1(N7W4+?X=5?=c ze?MXQYWsPM7u#~xOOrsV4qw@H`Cq2~zGdIn{oDTj+qVt-Za=zMBL4wR=wXq(Kw@~j zN_+e1T8Ea{+KDo9dfyoZ%f7l6RqVLK?sDU*_{oQGMeP51S&8=tSY;0}=DJ_5J+OT5 qk6HJ2|GK~L_U*&J^12c3(Vtkmw&2XHnTvsu%;4$j=d#Wzp$P!4QQz+X