From cfccb5959a04f36ddac048fac7fe19fa3a179d74 Mon Sep 17 00:00:00 2001 From: Kara Date: Mon, 14 Aug 2023 19:29:24 -0700 Subject: [PATCH] Lavaland chasms (#19154) --- .../Chasm/ChasmFallingVisualsSystem.cs | 74 +++++++++++++++++ Content.Shared/Chasm/ChasmComponent.cs | 17 ++++ Content.Shared/Chasm/ChasmFallingComponent.cs | 37 +++++++++ Content.Shared/Chasm/ChasmSystem.cs | 78 ++++++++++++++++++ .../StepTrigger/Systems/StepTriggerSystem.cs | 13 ++- Resources/Audio/Effects/attributions.yml | 7 +- Resources/Audio/Effects/falling.ogg | Bin 0 -> 10771 bytes Resources/Prototypes/Entities/Tiles/chasm.yml | 47 +++++++++++ .../Prototypes/Procedural/biome_templates.yml | 14 ++++ .../Textures/Tiles/Planet/chasm.rsi/chasm.png | Bin 0 -> 151 bytes .../Tiles/Planet/chasm.rsi/chasm0.png | Bin 0 -> 1305 bytes .../Tiles/Planet/chasm.rsi/chasm1.png | Bin 0 -> 923 bytes .../Tiles/Planet/chasm.rsi/chasm2.png | Bin 0 -> 1305 bytes .../Tiles/Planet/chasm.rsi/chasm3.png | Bin 0 -> 923 bytes .../Tiles/Planet/chasm.rsi/chasm4.png | Bin 0 -> 914 bytes .../Tiles/Planet/chasm.rsi/chasm5.png | Bin 0 -> 422 bytes .../Tiles/Planet/chasm.rsi/chasm6.png | Bin 0 -> 914 bytes .../Tiles/Planet/chasm.rsi/chasm7.png | Bin 0 -> 96 bytes .../Textures/Tiles/Planet/chasm.rsi/full.png | Bin 0 -> 443 bytes .../Textures/Tiles/Planet/chasm.rsi/meta.json | 49 +++++++++++ 20 files changed, 331 insertions(+), 5 deletions(-) create mode 100644 Content.Client/Chasm/ChasmFallingVisualsSystem.cs create mode 100644 Content.Shared/Chasm/ChasmComponent.cs create mode 100644 Content.Shared/Chasm/ChasmFallingComponent.cs create mode 100644 Content.Shared/Chasm/ChasmSystem.cs create mode 100644 Resources/Audio/Effects/falling.ogg create mode 100644 Resources/Prototypes/Entities/Tiles/chasm.yml create mode 100644 Resources/Textures/Tiles/Planet/chasm.rsi/chasm.png create mode 100644 Resources/Textures/Tiles/Planet/chasm.rsi/chasm0.png create mode 100644 Resources/Textures/Tiles/Planet/chasm.rsi/chasm1.png create mode 100644 Resources/Textures/Tiles/Planet/chasm.rsi/chasm2.png create mode 100644 Resources/Textures/Tiles/Planet/chasm.rsi/chasm3.png create mode 100644 Resources/Textures/Tiles/Planet/chasm.rsi/chasm4.png create mode 100644 Resources/Textures/Tiles/Planet/chasm.rsi/chasm5.png create mode 100644 Resources/Textures/Tiles/Planet/chasm.rsi/chasm6.png create mode 100644 Resources/Textures/Tiles/Planet/chasm.rsi/chasm7.png create mode 100644 Resources/Textures/Tiles/Planet/chasm.rsi/full.png create mode 100644 Resources/Textures/Tiles/Planet/chasm.rsi/meta.json diff --git a/Content.Client/Chasm/ChasmFallingVisualsSystem.cs b/Content.Client/Chasm/ChasmFallingVisualsSystem.cs new file mode 100644 index 0000000000..a22ea945ef --- /dev/null +++ b/Content.Client/Chasm/ChasmFallingVisualsSystem.cs @@ -0,0 +1,74 @@ +using Content.Shared.Chasm; +using Robust.Client.Animations; +using Robust.Client.GameObjects; +using Robust.Shared.Animations; + +namespace Content.Client.Chasm; + +/// +/// Handles the falling animation for entities that fall into a chasm. +/// +public sealed class ChasmFallingVisualsSystem : EntitySystem +{ + [Dependency] private readonly AnimationPlayerSystem _anim = default!; + + private readonly string _chasmFallAnimationKey = "chasm_fall"; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent(OnComponentRemove); + } + + private void OnComponentInit(EntityUid uid, ChasmFallingComponent component, ComponentInit args) + { + if (!TryComp(uid, out var sprite)) + return; + + component.OriginalScale = sprite.Scale; + + var player = EnsureComp(uid); + if (_anim.HasRunningAnimation(player, _chasmFallAnimationKey)) + return; + + _anim.Play(player, GetFallingAnimation(component), _chasmFallAnimationKey); + } + + private void OnComponentRemove(EntityUid uid, ChasmFallingComponent component, ComponentRemove args) + { + if (!TryComp(uid, out var sprite)) + return; + + var player = EnsureComp(uid); + if (_anim.HasRunningAnimation(player, _chasmFallAnimationKey)) + _anim.Stop(player, _chasmFallAnimationKey); + + sprite.Scale = component.OriginalScale; + } + + private Animation GetFallingAnimation(ChasmFallingComponent component) + { + var length = component.AnimationTime; + + return new Animation() + { + Length = length, + AnimationTracks = + { + new AnimationTrackComponentProperty() + { + ComponentType = typeof(SpriteComponent), + Property = nameof(SpriteComponent.Scale), + KeyFrames = + { + new AnimationTrackProperty.KeyFrame(component.OriginalScale, 0.0f), + new AnimationTrackProperty.KeyFrame(component.AnimationScale, length.Seconds), + }, + InterpolationMode = AnimationInterpolationMode.Cubic + } + } + }; + } +} diff --git a/Content.Shared/Chasm/ChasmComponent.cs b/Content.Shared/Chasm/ChasmComponent.cs new file mode 100644 index 0000000000..6a36653129 --- /dev/null +++ b/Content.Shared/Chasm/ChasmComponent.cs @@ -0,0 +1,17 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; + +namespace Content.Shared.Chasm; + +/// +/// Marks a component that will cause entities to fall into them on a step trigger activation +/// +[NetworkedComponent, RegisterComponent, Access(typeof(ChasmSystem))] +public sealed class ChasmComponent : Component +{ + /// + /// Sound that should be played when an entity falls into the chasm + /// + [DataField("fallingSound")] + public SoundSpecifier FallingSound = new SoundPathSpecifier("/Audio/Effects/falling.ogg"); +} diff --git a/Content.Shared/Chasm/ChasmFallingComponent.cs b/Content.Shared/Chasm/ChasmFallingComponent.cs new file mode 100644 index 0000000000..726c561ab9 --- /dev/null +++ b/Content.Shared/Chasm/ChasmFallingComponent.cs @@ -0,0 +1,37 @@ +using System.Numerics; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.Chasm; + +/// +/// Added to entities which have started falling into a chasm. +/// +[RegisterComponent, NetworkedComponent] +public sealed class ChasmFallingComponent : Component +{ + /// + /// Time it should take for the falling animation (scaling down) to complete. + /// + [DataField("animationTime")] + public TimeSpan AnimationTime = TimeSpan.FromSeconds(1.5f); + + /// + /// Time it should take in seconds for the entity to actually delete + /// + [DataField("deletionTime")] + public TimeSpan DeletionTime = TimeSpan.FromSeconds(1.8f); + + [DataField("nextDeletionTime", customTypeSerializer:typeof(TimeOffsetSerializer))] + public TimeSpan NextDeletionTime = TimeSpan.Zero; + + /// + /// Original scale of the object so it can be restored if the component is removed in the middle of the animation + /// + public Vector2 OriginalScale = Vector2.Zero; + + /// + /// Scale that the animation should bring entities to. + /// + public Vector2 AnimationScale = new Vector2(0.01f, 0.01f); +} diff --git a/Content.Shared/Chasm/ChasmSystem.cs b/Content.Shared/Chasm/ChasmSystem.cs new file mode 100644 index 0000000000..123fa5b998 --- /dev/null +++ b/Content.Shared/Chasm/ChasmSystem.cs @@ -0,0 +1,78 @@ +using Content.Shared.ActionBlocker; +using Content.Shared.Movement.Events; +using Content.Shared.StepTrigger.Systems; +using Robust.Shared.Network; +using Robust.Shared.Physics.Components; +using Robust.Shared.Timing; + +namespace Content.Shared.Chasm; + +/// +/// Handles making entities fall into chasms when stepped on. +/// +public sealed class ChasmSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly ActionBlockerSystem _blocker = default!; + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStepTriggered); + SubscribeLocalEvent(OnStepTriggerAttempt); + SubscribeLocalEvent(OnUnpaused); + SubscribeLocalEvent(OnUpdateCanMove); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + // don't predict queuedels on client + if (_net.IsClient) + return; + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var chasm)) + { + if (_timing.CurTime < chasm.NextDeletionTime) + continue; + + QueueDel(uid); + } + } + + private void OnStepTriggered(EntityUid uid, ChasmComponent component, ref StepTriggeredEvent args) + { + // already doomed + if (HasComp(args.Tripper)) + return; + + var falling = AddComp(args.Tripper); + + falling.NextDeletionTime = _timing.CurTime + falling.DeletionTime; + _blocker.UpdateCanMove(args.Tripper); + _audio.PlayPredicted(component.FallingSound, uid, args.Tripper); + } + + private void OnStepTriggerAttempt(EntityUid uid, ChasmComponent component, ref StepTriggerAttemptEvent args) + { + if (TryComp(args.Tripper, out var physics) && physics.BodyStatus == BodyStatus.InAir) + return; + + args.Continue = true; + } + + private void OnUnpaused(EntityUid uid, ChasmFallingComponent component, ref EntityUnpausedEvent args) + { + component.NextDeletionTime += args.PausedTime; + } + + private void OnUpdateCanMove(EntityUid uid, ChasmFallingComponent component, UpdateCanMoveEvent args) + { + args.Cancel(); + } +} diff --git a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs index 0fb87ff375..d0abac8cbd 100644 --- a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs +++ b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs @@ -78,14 +78,15 @@ public sealed class StepTriggerSystem : EntitySystem return false; } - private void UpdateColliding(EntityUid uid, StepTriggerComponent component, TransformComponent ownerTransform, EntityUid otherUid, EntityQuery query) + private void UpdateColliding(EntityUid uid, StepTriggerComponent component, TransformComponent ownerXform, EntityUid otherUid, EntityQuery query) { if (!query.TryGetComponent(otherUid, out var otherPhysics)) return; + var otherXform = Transform(otherUid); // TODO: This shouldn't be calculating based on world AABBs. - var ourAabb = _entityLookup.GetWorldAABB(uid, ownerTransform); - var otherAabb = _entityLookup.GetWorldAABB(otherUid); + var ourAabb = _entityLookup.GetAABBNoContainer(uid, ownerXform.LocalPosition, ownerXform.LocalRotation); + var otherAabb = _entityLookup.GetAABBNoContainer(otherUid, otherXform.LocalPosition, otherXform.LocalRotation); if (!ourAabb.Intersects(otherAabb)) { @@ -96,9 +97,13 @@ public sealed class StepTriggerSystem : EntitySystem return; } + // max 'area of enclosure' between the two aabbs + // this is hard to explain + var intersect = Box2.Area(otherAabb.Intersect(ourAabb)); + var ratio = Math.Max(intersect / Box2.Area(otherAabb), intersect / Box2.Area(ourAabb)); if (otherPhysics.LinearVelocity.Length() < component.RequiredTriggerSpeed || component.CurrentlySteppedOn.Contains(otherUid) - || otherAabb.IntersectPercentage(ourAabb) < component.IntersectRatio + || ratio < component.IntersectRatio || !CanTrigger(uid, otherUid, component)) { return; diff --git a/Resources/Audio/Effects/attributions.yml b/Resources/Audio/Effects/attributions.yml index 85e898997d..77a3e0cd0d 100644 --- a/Resources/Audio/Effects/attributions.yml +++ b/Resources/Audio/Effects/attributions.yml @@ -46,4 +46,9 @@ - files: ["fence_rattle1.ogg", "fence_rattle2.ogg", "fence_rattle3.ogg"] license: "CC0-1.0" copyright: "Taken from MWsfx via freesound.org and cropped + mixed from stereo to mono." - source: "https://freesound.org/people/MWsfx/sounds/575388/" \ No newline at end of file + source: "https://freesound.org/people/MWsfx/sounds/575388/" + +- files: ["falling.ogg"] + license: "CC0-1.0" + copyright: "Taken from MATRIXXX_ via freesound.org and mixed from stereo to mono." + source: "https://freesound.org/people/MATRIXXX_/sounds/415990/" \ No newline at end of file diff --git a/Resources/Audio/Effects/falling.ogg b/Resources/Audio/Effects/falling.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5894f414676b648d39540b0d75fba9d4cf4a8a8b GIT binary patch literal 10771 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Tiles/Planet/chasm.rsi/chasm2.png b/Resources/Textures/Tiles/Planet/chasm.rsi/chasm2.png new file mode 100644 index 0000000000000000000000000000000000000000..42935e739830e09e19db9c8646f126332025aa2c GIT binary patch literal 1305 zcmV+!1?KvRP)HQ9U7P>^;T8}=D77H41SsW|a(b*j(Mc>Igiwfn3x2&`$y!V6x(Z`V zi7|>0Lg9+R`(;^9A;Xu!16c^6c<&3Y8Dolb?ji6&S$O>sKy;T<7VmwLQa%VxbXOG5 z2DsMx?7v&TpcTfLqO~TXy9>ayV~hfVYOP5r_2BnCgeN+I0w5d_QO;Rx+g5VU0+}JD zwBNs6F2XriZns;v=MT>U^{VEag_N??833=h+l^w30`FTfTmeLP)8Dp@lu|EAj#6r0 zeO&8h1;br{=q}*8t|G=rQp%EZ7Ad7&SZ?}Q{a!eQ1rXgSFNEhS%}u{X4`mEjK+Whl zEr#hM8*qVpTf$I)07)r}l(N(*uI2E*rAT>kJF zAf+tUTDo4ZM?dOII6Mtb)AUr{rj&-SJaFhg!An>)Fp%m{1N3NWwBRrc;KIZFjWH#q zv=>0Vni{7AYIUSGqUY+3m$xHvSP*p1m1S8(&RKZx3wS;ha+cNat^n_S;oaSu)>>DMqQJgd<}I$)=eMGZ1%TBp%OcRctWCTwae0|L5?xjR`*+yHAi9&D7~`G- zfq9-uDMjc6kB$Y+Oppt&wI;3g?(;E5QcBT0&qQ?Z`VtXM(=>eLfi5oKy)QAw-TblQ z&bczrGv%BGT3sMQXF-=*;MEQ;il1LCu7V(l>hLVtpj!;!pDW@2^>0U)#mz48s-XEl z!vAO{=$tF-x{6u>uPE_oG%EnP9{>k1#uQF;>WPkev-6Jy@9N?j-_z$UZ*+Rkw71_J zfOu<*`+Z7@ZnqnylxUi!odJdr3g71&O@z9{0Bl>my}j+%INJjmGRBm7p7-6K(ZUmT zPync}bFN%2m#4r-bf>>LXQ8#GoU>ThRV>RQdJQ?WpvwyINse`0_kkwl_&Ozm2=y9u zYe5$m-~$V=1R~mdfVEYesW;G_2Ou6Or5<7ea25gtbTvO--@_{44lwtcIsWlfn1k=x zLm8<5YqG>&e;VwY*I4@j}$D)Wj>e;7Iz<+g*j@(EY?gGY`y?gYT z5^`> z0qTSv{e)8}pl+A~m^s>R9o1sugJ-92)lbX;E$c~%rInu1SHFnki0-) zwAP;X@wRtO+qS-K+i*@w>2Z)>M}Ocb*4o|Av0}z?WLj(AbsdBdLGY$&4&R?0{)H2e zQu@z?A>p^jt+klv`S9}>w}8Iy{Z%_l{6}3IKN>Af@!fFaQ9SWqI-NXL$TQs!%{o z90_tzTmi8eE2Xe33zSk%=i+PDb!D`jasT290DzB=kMNm77fGSo-cRDxRM=V@ zl+gFR@B7|!&OHFozBUf$-&C#rthV1Y4TfRB?REnI48s8DTs3+B;Rm6n#W;>Z3D(*# z>-KamMVb45IXnfdwHU{d0l+-ZjD)9SbPdro4U93&81qu*F2N}yK>fS8#!sKM)=yJo z7zQ*=10e(eoYLMp!tbL$5DPDafDj@yF4uJpJ^((B4Z^36e(vYwd0#R6_&+GKIl- zE*D4&H9N@}QUOIu`LZUs1X(O#8v?0DP|Gw(4(B|KHs{<^!L;;q0R>)%-!2S(hm_LO z5;(GwX_~@vxzu5@iX}4fI^ftZ$+^AvbX}MpbC^}niN+6@ECpI z?l8$o=2$&iTmfy{`gxvN(=?%d2IN~ho24M~6@MEf-WbD5G*XLOK-?u#O1&(VPfc+J z0QZtv{9X`Gh167`fLM46h16|IeeWt1K$Lh*F0O!Wk%StlZ<7dZ%i}rcKTv@JV#orV xbL?&M0N^nV$oy+-p(iE&{{XG^)5@|O`~d>k>Gl|R)}jCa002ovPDHLkV1kPCu~q;8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Tiles/Planet/chasm.rsi/chasm4.png b/Resources/Textures/Tiles/Planet/chasm.rsi/chasm4.png new file mode 100644 index 0000000000000000000000000000000000000000..e1c77dc40c8de94e9c09e6d7743d5918372f383d GIT binary patch literal 914 zcmV;D18w|?P)K$Aq4b&&o(}b%Fh^vAp+MWa5x;$wk^hStm6NBD>VIqix5)ED5Z?) z_5U8Nbu`9ADP`=sj#Yr-K0s?7o2G$M3T@jiPH>tgmhp=V;Jp`Qbbg&<{Ne&oB19r^ zM}gv`8K9Ihk|X5u0lzs0c?I$X&N=Rq5yC;{+2LX!!iS;lo0^hwq34K-k)xSO29S)^4Okk zeM`b3K-;!(&Q)P>&f5i$QbwBY)>=`^oo9oxIw@t;T1WB+R0Al@+Z_-Y3|y0)X`0}@ z7g}q!gy$ZtPLMo)(=Q`=iE{OO3PrSSX~pm)!zp$>po3*LI_JlNL%8i*<>9)GyV~!Bf;t=aLbdw zVtg&LV6_0ZjHI4_{#j~tElJU80j#xxikkGI5SNBJS{C$sErpTQPLM)bYHYgCCkJ>s zotEWNQy#Ec7&OL2dZpK#a{w+|Vwx$|T9JRZ6fAjwQVJCR=_kjyudrHxyrf0tuJoF7 zZs`f6y@49oq&fQ6;2(E&nx?x3bDaQr25UitjIPCafKdR-0cuHrh|SLjJdJ_I>~K zfr%|om=)iYPz8AyhIp@UKo#WlJM{V5>T>ZJ;Jp{dn3xw#LI^mY&p4mY04^OUYpqB> z-=fw~T!5VX)Oh-6EuAt`N+CaC{;yOaKx#;OSI2P_TI;39n0B7D)^UsGN^t>xJ`K zT0zCkLG8cg8?0(q>}<^3d{nC=@#b8v+d}_MJub7<^EiFHa4^DaWfzAN$M5{5B00CO zWv=U3vCM@kd5j_`D7%nCF%HtLV!2+PTX(5Bx6MA-YvKqgB3LPN^w1(#JXA zrl_6xddr_bU2>yiT)rLZ-|UdRic#kFU2pLftQ*#82YLPGIdJ$YyGYyOaDMv-%b9Ij z3aZ(UNK7pL7rLhX5o0TZ%M;y}psv}E7?-9ubR^u~mN)PDI$39qbxk|YTJ&u_`)95D z!|=TK4g2qXX-ixo*A%dmbxnME?59hNE>Q5r%AxFCP1|c%_-Cn4r() zmVNI-zjK~tw(##s?pdWcgS}ws-&VKgZiaJ{AJ5r*>y{pqMb`GlY57{dGk5X_p6CFE OKZB>MpUXO@geCx93%y?e literal 0 HcmV?d00001 diff --git a/Resources/Textures/Tiles/Planet/chasm.rsi/chasm6.png b/Resources/Textures/Tiles/Planet/chasm.rsi/chasm6.png new file mode 100644 index 0000000000000000000000000000000000000000..e1c77dc40c8de94e9c09e6d7743d5918372f383d GIT binary patch literal 914 zcmV;D18w|?P)K$Aq4b&&o(}b%Fh^vAp+MWa5x;$wk^hStm6NBD>VIqix5)ED5Z?) z_5U8Nbu`9ADP`=sj#Yr-K0s?7o2G$M3T@jiPH>tgmhp=V;Jp`Qbbg&<{Ne&oB19r^ zM}gv`8K9Ihk|X5u0lzs0c?I$X&N=Rq5yC;{+2LX!!iS;lo0^hwq34K-k)xSO29S)^4Okk zeM`b3K-;!(&Q)P>&f5i$QbwBY)>=`^oo9oxIw@t;T1WB+R0Al@+Z_-Y3|y0)X`0}@ z7g}q!gy$ZtPLMo)(=Q`=iE{OO3PrSSX~pm)!zp$>po3*LI_JlNL%8i*<>9)GyV~!Bf;t=aLbdw zVtg&LV6_0ZjHI4_{#j~tElJU80j#xxikkGI5SNBJS{C$sErpTQPLM)bYHYgCCkJ>s zotEWNQy#Ec7&OL2dZpK#a{w+|Vwx$|T9JRZ6fAjwQVJCR=_kjyudrHxyrf0tuJoF7 zZs`f6y@49oq&fQ6;2(E&nx?x3bDaQr25UitjIPCafKdR-0cuHrh|SLjJdJ_I>~K zfr%|om=)iYPz8AyhIp@UKo#WlJM{V5>T>ZJ;Jp{dn3xw#LI^mY&p4mY04^OUYpqB> z-=fw~T!5VX)Oh-6EuAt`N+CaC{;yOaKx#;OSI2P_TI;39n0B7D)^UsGN^t>Ygr+Ar*7p9%SSN@(wNd?w`wN fz5vKX1`XxR4h{^A{hv+-f`mO?{an^LB{Ts5qcarg literal 0 HcmV?d00001 diff --git a/Resources/Textures/Tiles/Planet/chasm.rsi/full.png b/Resources/Textures/Tiles/Planet/chasm.rsi/full.png new file mode 100644 index 0000000000000000000000000000000000000000..6d83d9e0b0738ca9b017ad94a489a193432fea9d GIT binary patch literal 443 zcmV;s0Yv_ZP)Px#1ZP1_K>z@;j|==^1poj54^T{0MK3Qe3JMAp6%`~TBsw}eDVTCp00009a7bBm z000id000id0mpBsWB>pGHAzH4R4C6iQGv0=AP5T&2M~0Cq6?s1K<~Q$OdtFH^Lo~% zki-B2B&(Hp4|k58L4-SJaKTw;&w&Hvadd2OsyLlo5gn+DhOLB(ZBh4NRMshb+b*_p z5~z`hYv~0u?|q|>p*`u{f}v`t`$yer-Z~abw-9AR@J;QNI+(%NSgBZ(HaNe|R6$b$ zuqWeqi^AQ+M4PPei$$K)Bv!LZDI8J}m3P@FvSE8b{(+!UOc9qKazsYE=?9dfOYZ3h za9we^o3X#&6+`-)So$K1R2}xjb>60$b(n|B3cshMj*BHoTg{Fm6k~X^?)Fs4J19Tp zO}kK7Ew6D+18s`&+r;SLI%?@qkgRQTzf)pmi(xdmOq$_Qs le$$rgOqt@*5r0^F#veVtD?f&3*$e;x002ovPDHLkV1mKhwkrSt literal 0 HcmV?d00001 diff --git a/Resources/Textures/Tiles/Planet/chasm.rsi/meta.json b/Resources/Textures/Tiles/Planet/chasm.rsi/meta.json new file mode 100644 index 0000000000..185ed3fad9 --- /dev/null +++ b/Resources/Textures/Tiles/Planet/chasm.rsi/meta.json @@ -0,0 +1,49 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/tree/f116442e34fe3e941a1df474bb57bb410dd177a3/icons/turf and modified", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "full" + }, + { + "name": "chasm0", + "directions": 4 + }, + { + "name": "chasm1", + "directions": 4 + }, + { + "name": "chasm2", + "directions": 4 + }, + { + "name": "chasm3", + "directions": 4 + }, + { + "name": "chasm4", + "directions": 4 + }, + { + "name": "chasm5", + "directions": 4 + }, + { + "name": "chasm6", + "directions": 4 + }, + { + "name": "chasm7", + "directions": 4 + }, + { + "name": "chasm" + } + ] +} \ No newline at end of file