From 8d984b7670d45a77c0d542b9c2b17f10312f64b6 Mon Sep 17 00:00:00 2001 From: Red <96445749+TheShuEd@users.noreply.github.com> Date: Thu, 19 Jun 2025 00:14:58 +0300 Subject: [PATCH] Dash (#1445) * dash basic logic + predict spell casts * dash * Update kick.yml * Update CP14SharedMagicSystem.Checks.cs --- .../_CP14/Dash/CP14ClientDashSystem.cs | 17 ++++++ .../_CP14/Dash/CP14DashComponent.cs | 21 +++++++ Content.Shared/_CP14/Dash/CP14DashSystem.cs | 55 ++++++++++++++++++ .../CP14SharedMagicSystem.Checks.cs | 8 +-- .../_CP14/MagicSpell/CP14SharedMagicSystem.cs | 9 --- .../_CP14/MagicSpell/Spells/CP14SpellDash.cs | 20 +++++++ .../MagicSpell/Spells/CP14SpellProjectile.cs | 2 +- .../CP14SpellSpawnEntitiesOnTargetInRadius.cs | 2 +- .../Spells/CP14SpellSpawnEntityOnTarget.cs | 2 +- .../Spells/CP14SpellSpawnEntityOnUser.cs | 2 +- .../Spells/CP14SpellSpawnInHandEntity.cs | 2 +- .../Audio/_CP14/Effects/attributions.yml | 7 ++- Resources/Audio/_CP14/Effects/dash.ogg | Bin 0 -> 7721 bytes .../Entities/Actions/Spells/Physical/dash.yml | 22 +++++++ .../Prototypes/_CP14/Skill/Basic/atlethic.yml | 11 ++++ .../Actions/Spells/physical.rsi/dash.png | Bin 0 -> 350 bytes .../Actions/Spells/physical.rsi/meta.json | 3 + 17 files changed, 161 insertions(+), 22 deletions(-) create mode 100644 Content.Client/_CP14/Dash/CP14ClientDashSystem.cs create mode 100644 Content.Shared/_CP14/Dash/CP14DashComponent.cs create mode 100644 Content.Shared/_CP14/Dash/CP14DashSystem.cs create mode 100644 Content.Shared/_CP14/MagicSpell/Spells/CP14SpellDash.cs create mode 100644 Resources/Audio/_CP14/Effects/dash.ogg create mode 100644 Resources/Prototypes/_CP14/Entities/Actions/Spells/Physical/dash.yml create mode 100644 Resources/Textures/_CP14/Actions/Spells/physical.rsi/dash.png diff --git a/Content.Client/_CP14/Dash/CP14ClientDashSystem.cs b/Content.Client/_CP14/Dash/CP14ClientDashSystem.cs new file mode 100644 index 0000000000..46f7c0f36e --- /dev/null +++ b/Content.Client/_CP14/Dash/CP14ClientDashSystem.cs @@ -0,0 +1,17 @@ +using Content.Shared._CP14.Dash; + +namespace Content.Client._CP14.Dash; + +public sealed partial class CP14DClientDashSystem : EntitySystem +{ + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var dash)) + { + SpawnAtPosition(dash.DashEffect, Transform(uid).Coordinates); + } + } +} diff --git a/Content.Shared/_CP14/Dash/CP14DashComponent.cs b/Content.Shared/_CP14/Dash/CP14DashComponent.cs new file mode 100644 index 0000000000..f86b3352ac --- /dev/null +++ b/Content.Shared/_CP14/Dash/CP14DashComponent.cs @@ -0,0 +1,21 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Dash; + +/// +/// This component marks entities that are currently in the dash +/// +[RegisterComponent, NetworkedComponent, Access(typeof(CP14DashSystem))] +public sealed partial class CP14DashComponent : Component +{ + [DataField] + public EntProtoId DashEffect = "CP14DustEffect"; + + [DataField] + public SoundSpecifier DashSound = new SoundPathSpecifier("/Audio/_CP14/Effects/dash.ogg") + { + Params = AudioParams.Default.WithVariation(0.05f) + }; +} diff --git a/Content.Shared/_CP14/Dash/CP14DashSystem.cs b/Content.Shared/_CP14/Dash/CP14DashSystem.cs new file mode 100644 index 0000000000..beac1b20ec --- /dev/null +++ b/Content.Shared/_CP14/Dash/CP14DashSystem.cs @@ -0,0 +1,55 @@ +using Content.Shared.ActionBlocker; +using Content.Shared.Movement.Events; +using Content.Shared.Throwing; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Map; + +namespace Content.Shared._CP14.Dash; + +public sealed partial class CP14DashSystem : EntitySystem +{ + [Dependency] private readonly ActionBlockerSystem _blocker = default!; + [Dependency] private readonly ThrowingSystem _throwing = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMoveAttempt); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnLand); + } + + private void OnShutdown(Entity ent, ref ComponentShutdown args) + { + _blocker.UpdateCanMove(ent); + } + + private void OnInit(Entity ent, ref ComponentInit args) + { + _blocker.UpdateCanMove(ent); + } + + private void OnLand(Entity ent, ref LandEvent args) + { + RemCompDeferred(ent); + } + + private void OnMoveAttempt(Entity ent, ref UpdateCanMoveEvent args) + { + if (ent.Comp.LifeStage > ComponentLifeStage.Running) + return; + + //Cant move while dashing + args.Cancel(); + } + + public void PerformDash(EntityUid ent, EntityCoordinates targetPosition, float speed = 10f) + { + EnsureComp(ent, out var dash); + _audio.PlayPredicted(dash.DashSound, ent, ent); + _throwing.TryThrow(ent, targetPosition, speed, null, 0f, 10, true, false, false, false, false); + } +} diff --git a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Checks.cs b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Checks.cs index 98f786ae94..c2b23ae87f 100644 --- a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Checks.cs +++ b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Checks.cs @@ -64,7 +64,7 @@ public abstract partial class CP14SharedMagicSystem return; } - if (!_magicEnergy.HasEnergy(args.Performer, requiredMana, playerMana, true) && _net.IsServer) + if (!_magicEnergy.HasEnergy(args.Performer, requiredMana, playerMana, true)) _popup.PopupEntity(Loc.GetString($"cp14-magic-spell-not-enough-mana-cast-warning-{_random.Next(5)}"), args.Performer, args.Performer, @@ -199,9 +199,6 @@ public abstract partial class CP14SharedMagicSystem private void OnVerbalAspectAfterCast(Entity ent, ref CP14MagicEffectConsumeResourceEvent args) { - if (_net.IsClient) - return; - var ev = new CP14SpellSpeechEvent { Performer = args.Performer, @@ -225,9 +222,6 @@ public abstract partial class CP14SharedMagicSystem private void OnEmoteEndCast(Entity ent, ref CP14MagicEffectConsumeResourceEvent args) { - if (_net.IsClient) - return; - var ev = new CP14SpellSpeechEvent { Performer = args.Performer, diff --git a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs index 66a64d2b64..cdffe4cb6b 100644 --- a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs +++ b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs @@ -5,14 +5,12 @@ using Content.Shared._CP14.MagicEnergy.Components; using Content.Shared._CP14.MagicSpell.Components; using Content.Shared._CP14.MagicSpell.Events; using Content.Shared._CP14.MagicSpell.Spells; -using Content.Shared._CP14.MagicSpellStorage; using Content.Shared.Actions; using Content.Shared.Damage.Systems; using Content.Shared.DoAfter; using Content.Shared.FixedPoint; using Content.Shared.Movement.Systems; using Content.Shared.Popups; -using Robust.Shared.Network; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -25,7 +23,6 @@ namespace Content.Shared._CP14.MagicSpell; public abstract partial class CP14SharedMagicSystem : EntitySystem { [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; - [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly SharedCP14MagicEnergySystem _magicEnergy = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly IRobustRandom _random = default!; @@ -165,9 +162,6 @@ public abstract partial class CP14SharedMagicSystem : EntitySystem private void CastTelegraphy(Entity ent, CP14SpellEffectBaseArgs args) { - if (_net.IsClient) - return; - foreach (var effect in ent.Comp.TelegraphyEffects) { effect.Effect(EntityManager, args); @@ -179,9 +173,6 @@ public abstract partial class CP14SharedMagicSystem : EntitySystem var ev = new CP14MagicEffectConsumeResourceEvent(args.User); RaiseLocalEvent(ent, ref ev); - if (_net.IsClient) - return; - foreach (var effect in ent.Comp.Effects) { effect.Effect(EntityManager, args); diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellDash.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellDash.cs new file mode 100644 index 0000000000..f971472fed --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellDash.cs @@ -0,0 +1,20 @@ +using Content.Shared._CP14.Dash; + +namespace Content.Shared._CP14.MagicSpell.Spells; + +public sealed partial class CP14SpellDash : CP14SpellEffect +{ + [DataField] + public float DashSpeed = 10f; + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) + { + if (args.User is null) + return; + if (args.Position is null) + return; + + var dashSys = entManager.System(); + + dashSys.PerformDash(args.User.Value, args.Position.Value, DashSpeed); + } +} diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellProjectile.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellProjectile.cs index 1e77e3991c..2dd78f0fab 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellProjectile.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellProjectile.cs @@ -64,7 +64,7 @@ public sealed partial class CP14SpellProjectile : CP14SpellEffect (float) (random.NextDouble() * 2 - 1) * Spread, (float) (random.NextDouble() * 2 - 1) * Spread)); - var ent = entManager.SpawnAtPosition(Prototype, spawnCoords); + var ent = entManager.PredictedSpawnAtPosition(Prototype, spawnCoords); var direction = offsetedTargetPoint.ToMapPos(entManager, transform) - spawnCoords.ToMapPos(entManager, transform); diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntitiesOnTargetInRadius.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntitiesOnTargetInRadius.cs index 61a40b16d7..687127d134 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntitiesOnTargetInRadius.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntitiesOnTargetInRadius.cs @@ -28,7 +28,7 @@ public sealed partial class CP14SpellSpawnEntitiesOnTargetInRadius : CP14SpellEf var direction = (DirectionFlag) (1 << i); var coords = targetPoint.Value.Offset(direction.AsDir().ToVec()); - entManager.SpawnAtPosition(Spawn, coords); + entManager.PredictedSpawnAtPosition(Spawn, coords); } } } diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnTarget.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnTarget.cs index 9020e0e294..ae84a3454b 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnTarget.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnTarget.cs @@ -21,7 +21,7 @@ public sealed partial class CP14SpellSpawnEntityOnTarget : CP14SpellEffect foreach (var spawn in Spawns) { - entManager.SpawnAtPosition(spawn, targetPoint.Value); + entManager.PredictedSpawnAtPosition(spawn, targetPoint.Value); } } } diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnUser.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnUser.cs index 43b3cc34e5..dd260bc62c 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnUser.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnUser.cs @@ -15,7 +15,7 @@ public sealed partial class CP14SpellSpawnEntityOnUser : CP14SpellEffect foreach (var spawn in Spawns) { - entManager.SpawnAtPosition(spawn, transformComponent.Coordinates); + entManager.PredictedSpawnAtPosition(spawn, transformComponent.Coordinates); } } } diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnInHandEntity.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnInHandEntity.cs index 26f748a30b..343945aee3 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnInHandEntity.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnInHandEntity.cs @@ -23,7 +23,7 @@ public sealed partial class CP14SpellSpawnInHandEntity : CP14SpellEffect foreach (var spawn in Spawns) { - var item = entManager.SpawnAtPosition(spawn, transformComponent.Coordinates); + var item = entManager.PredictedSpawnAtPosition(spawn, transformComponent.Coordinates); if (!handSystem.TryPickupAnyHand(args.Target.Value, item) && DeleteIfCantPickup) entManager.QueueDeleteEntity(item); } diff --git a/Resources/Audio/_CP14/Effects/attributions.yml b/Resources/Audio/_CP14/Effects/attributions.yml index 3c17d8a357..cea41ea34f 100644 --- a/Resources/Audio/_CP14/Effects/attributions.yml +++ b/Resources/Audio/_CP14/Effects/attributions.yml @@ -101,4 +101,9 @@ - files: ["moon_strike1.ogg", "moon_strike2.ogg", "moon_strike3.ogg", "moon_strike4.ogg"] license: "CC-BY-4.0" copyright: 'Created by EminYILDIRIM on Freesound.org' - source: "https://freesound.org/people/EminYILDIRIM/sounds/668244/" \ No newline at end of file + source: "https://freesound.org/people/EminYILDIRIM/sounds/668244/" + +- files: ["dash.ogg"] + license: "CC-BY-4.0" + copyright: 'Created by qubodup on Freesound.org' + source: "https://freesound.org/people/qubodup/sounds/714258/" \ No newline at end of file diff --git a/Resources/Audio/_CP14/Effects/dash.ogg b/Resources/Audio/_CP14/Effects/dash.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b2d6c913c236e4cdb2976f7b45a4bd76558e9e0f GIT binary patch literal 7721 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∨v z<0b>q1Pg~jjl%NR3l_bjV|2>Lf$NNQ7j^G6cvYL#oaT5vI<%$`fZx~@+8vAfIOE6= zA3kmwTT{QdUoCo#0ie`&bWJ4s#Mp)O65mr|HfNgLGhKqrZMJjvSb!Mj3{(NI1%TZ+88D7SG_X7L7(VqpUZu@i967DQrhjlyqKUz3(Oy{D@=JWSqW+%}Q zn0Q;hcNpvH=RbMXqPrALotM=RH+9>l55ZZLCo#&OL*IynM`I*Y+V}qAV;_1cd|U1C zZgn1KywCz~R}71CCEK4I`w)(@FtY+?r&l@;dTfU7#w~qPD9XfoIXHYr-!#eCj(a>Y zgQ`vZ$|7^eQt+mvvQNfw8;7^5mwrFY7+P51g~cGuf8ryccjj|EiJROT+?*lYdur#0 zJ;_l2{MQi4si~BA;YImMU+!^ida!J3UXY#?<-do1sbqw^M=ANFf3EUc!@~xQYW|~% zv)+c?3B;@9=~kUzkXTWjk->;x0WoX=p*Z{b<6j`w3yeTspIFo3GA&l?V;6fuG8vAY z9-UAFEY2h+x*a;tvNI*-+iW-b*Om`r=gQWsUGa6n&|_GxpzfcSp4SA1ynnS{)+70p zP+}}!A?+39-!2;G^(lQ}yY$EAr4tFuPHeYow4Y^m*4x)8?&RknAWMo;H(MY(*_^Yd z2TC;~++Pb49L7FBb*}3-FO3%>wp`%-Hb4COxJ+XS7m~?4eeCFACW$O5eTz6A2mUCN zTJ6!xs9;8SWm%Khrzj;gz5SgUxCvk{E0*f>fpsx&`C6bsi|;p{_nVO#^SWv+9=_T=Vc2hOcwzi^thIA=YdJS>H%F&Dal7Nwd)_>&LMM3{ zY(6DYP%z=G^3J_L$>Nhs(b)O&Lm`fYZT^#7ZWYK6VkW3~SsTTQl@^051a7CmGXA{z z!lJ7$pQoNDk?V4*CYde>y6DmQVQb%9kqpRoSwZ`oORD9-`{_Tm<))^n2me}<|M8Pj zd)??EAJBZdTs}Gjg1*rF;OnitF#DleJy$!%l+3cS>&5C2A#zCRldlhtZ_25JhT1qh z``}ggqz_j@IrdbQc~bj|srDOa(9p*hy7$D4tV6FFn#eRuFL*D+mXhl(G30n;8^;}o z*==;|g}DHn9WbdPida<-=^<`4jhVlnu_LE7-hFsZhqE9=8btvzCrcAPYRa^62>c^>7^##MY>@PyD~ zXQsEfX9d06rx`INbwPH$Sjt(=q%PBl!yDdek-{z`oUpcjk&LmLi^Jz?9p@4Q!b;_X z4r>xcvm`KgQ}?9plZ3syQ?OO}Vb;9llvG#KdxG5bFUmx=F~dPS{`pro|McIwY%e@g zlCs3ZJ9WmA8_?{PmC2ZM`4|Bi5 z@+Xy+pM-M%V2=q6T_Y#fPgevOP95L+_`K3@7n`VYMBT~qmC&Gnc8>d!=cG-rR}Gy( z^IFvW1V!eoz#Y~zQ}2ch9uftMtAsin0 zz{>IGD&}@x@eFh=G4-B5Hp?RmHF7kwryuUtIoX6CpZ zik*BAcUax3mX#jAusPOx{r7s0VEWAs0HolXMm81@8#Uww$R7tT_b#<~!%~b`9>??kJVaFbWaEwalzGn!)FG z2I>%BVlq@VT8_wjNA8Bo17dNXi!NWAQWks^{kyv|x3#eFr*yxtj`pznojV%_!NISy zzl8h|n>lh(quKq*J+c-n!;sPX4;$~I!As%2x#tG)%1XV`ityZXbAzs#w%5sBt{2xE zs;ma~MqvXn=(gKL{V|_th$Zw1H}%?Jx^o;6P~T;(J!n0WVV799IgaNv z^$0Yqp2-)x=@o@^@Dv;05WI0x?sxe41mM`Ui~Azc@f@kinWiz9x!ofFtEyr79iK=H>a6O<0;(m%Li2^&o}B1HWQD>&M8^Q`e@; z#gpQskyX3hz5Dwq+qhMth4JAeMRBhqZ-zPbAEsAhf?Hpw`e=R_OItE^E8g+gD;>s1)6!#1kZQ{xhAJVe_ozS|v77db-gPZ)VS z8hHNa>DG|1941`;XLW)ueYYBNrQj5<}RCO9D@->I)Vp-s?9bh()m_0Y*6Qi*6Dpx1%0x zNR(ii{Db}9O)${N3;e-q&c zSG&x4@uzmtXkGO{mn#2Vk47~NrG&_wVz<#m8vdvtbaTixrXV52*5P7F(l}>Rj#?cCa}yyiomdB6-y5 zu6*^ggJg7ZkJ1*FU?gXt6N@_ zHDU1+PZRldL58`(C0yI-QwU)BD*Uf6?EbvB2cFYb#yeE-o3ky-csk%ItyRr59U z%Oupxu2jOZl0Gs$ufJcdc{(b*y`aHn5x1H6abbe%&kO!XwMJPzTjzOuH>T>hVY|VM z69t?CNfGw3X4^+PAGx^PRO5QCJXxBxU8H*@TfFnUI`Z~qo7&i!CO6T?cgXkZlg2|m zFfS+Bn54$Kn854t2MbS}@}gtzb{3K^laEpmQgbg^!g{8-^JTk1*+^c`o?Pyr(y!@b zjxSnlB5uS3wPC^eU&_qxKRQcjjkogCWSa|ZJYf*$^u?%;QP;k*)VLBb+vw|*^>Y(3 z{Gc6hF$Ysb@F)$|avC=^0{)P;T#)Q^a#!>zX=?@7>}u-qHpfnvz)+}0iQnrtnz!_c zDdb<+rr+_Qt5WfaT;YumZiSX{P1c&e)8>$%~nW zzm^T3>U?tuyu8iu7d|TXG?P@X+L)_}r<5>R-{1J&1pWG>zLcc=6ZnM>^^V*hGV*dP z`_udZ110@=pmS#HXla-%`~ARxYtq?y39l@2vor+r=x0bGlZlu2>YqH8DKtGc6C!nj zGu*g^e%$g1^qNS@BNr2iiM8317eU`7BZDWCv<8PfJnmp$XC1z&Us7>Cw_(6ztK|yo zxt^czolr5!(KQ(v?e3)}&qZ~Xq-DtPTQ9b&SZs-PiltwI6G)!a}u6)N&;Yc!9vwo;axz;J$gsH<`;AvnK1~hAb z1r=Y2Id)yUtgartRU9SIt@oQxMRB@t5PXMs~rpKYT-B7|l@H4;3 zbosY!vqkp)9^ZSmmdvASD2=Sk6v4!_0dpOPKPI76BW2Fo$dcW0DQK%Y(zBT)DF zFc8~%TOT{KDrJ*oVi$3AxncY~CP(Qh=ffS`Q`0*coV;Q5Vzs|EWEpR?thjvHj`Y(*?-h%)D literal 0 HcmV?d00001 diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Physical/dash.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Physical/dash.yml new file mode 100644 index 0000000000..29f8cd566e --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Physical/dash.yml @@ -0,0 +1,22 @@ +- type: entity + id: CP14ActionSpellDash + parent: CP14ActionSpellBase + name: Dash + description: You make a quick dash to the chosen position to quickly close the distance or dodge danger. + components: + - type: CP14MagicEffectStaminaCost + stamina: 40 + - type: CP14MagicEffect + effects: + - !type:CP14SpellDash + dashSpeed: 20 + - type: Action + icon: + sprite: _CP14/Actions/Spells/physical.rsi + state: dash + - type: TargetAction + checkCanAccess: false + range: 3.5 + - type: WorldTargetAction + event: !type:CP14WorldTargetActionEvent + cooldown: 5 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Skill/Basic/atlethic.yml b/Resources/Prototypes/_CP14/Skill/Basic/atlethic.yml index 9a534617ae..a1317a1259 100644 --- a/Resources/Prototypes/_CP14/Skill/Basic/atlethic.yml +++ b/Resources/Prototypes/_CP14/Skill/Basic/atlethic.yml @@ -20,6 +20,17 @@ - !type:AddAction action: CP14ActionSpellSprint +- type: cp14Skill + id: CP14ActionSpellDash + skillUiPosition: 0, 4 + tree: Atlethic + icon: + sprite: _CP14/Actions/Spells/physical.rsi + state: dash + effects: + - !type:AddAction + action: CP14ActionSpellDash + - type: cp14Skill id: CP14ActionSpellSprintGoblin skillUiPosition: 2, 2 diff --git a/Resources/Textures/_CP14/Actions/Spells/physical.rsi/dash.png b/Resources/Textures/_CP14/Actions/Spells/physical.rsi/dash.png new file mode 100644 index 0000000000000000000000000000000000000000..759abad7a2c480e9900a4a0144c4e9f81ab9978f GIT binary patch literal 350 zcmV-k0iphhP)Px$7)eAyR9J=WRml;9Fbu>QDls3s20Ebv80uk21@0s@zz14UUSgC*=1gAkz7R;- zl`NSoOGrpa*g#wOzAb$JjXc3R3f2+kGh0E@?xvx+Dj--#(yr!l;eA|9dK7ydTnXT| z%Zjg7AFQL2sD2sqwwwj=AgV)%Ro+=e*&)r&rO{18qmjpsA=ZAjHFETe-UE_|#clcS#mB@( zw*ZIntO&UU)jS&93Z8)+gOCW1<>(g3$zO67el-It)!M+F9YT5c<2U>tJY>+K^d_+S wE&TLfaHN