From 7362aedfeb9a159a355bfd0966d2b8ee2cbfbeac Mon Sep 17 00:00:00 2001 From: Ed Date: Fri, 2 Aug 2024 20:27:08 +0300 Subject: [PATCH] finish shadow step --- .../_CP14/MagicSpell/CP14SharedMagicSystem.cs | 3 ++ .../Events/CP14DelayedActionEvents.cs | 9 ++++++ .../Events/CP14IDelayedMagicEffect.cs | 2 ++ .../Spells/CP14SpellCasterTeleport.cs | 14 +++++++++ ...ity.cs => CP14SpellSpawnEntityOnTarget.cs} | 2 +- .../Spells/CP14SpellSpawnEntityOnUser.cs | 21 +++++++++++++ .../Entities/Actions/Spells/cure_wounds.yml | 4 +-- .../Actions/Spells/flame_creation.yml | 2 +- .../Entities/Actions/Spells/ice_dagger.yml | 2 +- .../Entities/Actions/Spells/shadow_step.yml | 28 ++++++++---------- .../_CP14/Entities/Clothing/Rings/ring.yml | 20 ++++++++++++- .../Effects/Magic/cast_impact.rsi/meta.json | 15 ++++++++++ .../Effects/Magic/cast_impact.rsi/wave_up.png | Bin 0 -> 10320 bytes 13 files changed, 101 insertions(+), 21 deletions(-) rename Content.Shared/_CP14/MagicSpell/Spells/{CP14SpellSpawnEntity.cs => CP14SpellSpawnEntityOnTarget.cs} (91%) create mode 100644 Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnUser.cs create mode 100644 Resources/Textures/_CP14/Effects/Magic/cast_impact.rsi/wave_up.png diff --git a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs index 39bb05278b..389fb9b075 100644 --- a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs +++ b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs @@ -89,6 +89,7 @@ public partial class CP14SharedMagicSystem : EntitySystem { BreakOnMove = delayedEffect.BreakOnMove, BreakOnDamage = delayedEffect.BreakOnDamage, + Hidden = delayedEffect.Hidden, BlockDuplicate = true, }; @@ -126,6 +127,7 @@ public partial class CP14SharedMagicSystem : EntitySystem { BreakOnMove = delayedEffect.BreakOnMove, BreakOnDamage = delayedEffect.BreakOnDamage, + Hidden = delayedEffect.Hidden, BlockDuplicate = true, }; @@ -158,6 +160,7 @@ public partial class CP14SharedMagicSystem : EntitySystem { BreakOnMove = delayedEffect.BreakOnMove, BreakOnDamage = delayedEffect.BreakOnDamage, + Hidden = delayedEffect.Hidden, BlockDuplicate = true, }; diff --git a/Content.Shared/_CP14/MagicSpell/Events/CP14DelayedActionEvents.cs b/Content.Shared/_CP14/MagicSpell/Events/CP14DelayedActionEvents.cs index 7e12413bfa..4f16752afe 100644 --- a/Content.Shared/_CP14/MagicSpell/Events/CP14DelayedActionEvents.cs +++ b/Content.Shared/_CP14/MagicSpell/Events/CP14DelayedActionEvents.cs @@ -16,6 +16,9 @@ public sealed partial class CP14DelayedWorldTargetActionEvent : WorldTargetActio [DataField] public bool BreakOnDamage { get; private set; } = true; + + [DataField] + public bool Hidden { get; private set; } = false; } [Serializable, NetSerializable] @@ -38,6 +41,9 @@ public sealed partial class CP14DelayedEntityTargetActionEvent : EntityTargetAct [DataField] public bool BreakOnDamage { get; private set; } = true; + + [DataField] + public bool Hidden { get; private set; } = false; } [Serializable, NetSerializable] @@ -56,6 +62,9 @@ public sealed partial class CP14DelayedInstantActionEvent : InstantActionEvent, [DataField] public bool BreakOnDamage { get; private set; } = true; + + [DataField] + public bool Hidden { get; private set; } = false; } [Serializable, NetSerializable] diff --git a/Content.Shared/_CP14/MagicSpell/Events/CP14IDelayedMagicEffect.cs b/Content.Shared/_CP14/MagicSpell/Events/CP14IDelayedMagicEffect.cs index 0e52bc538a..1cf716df7b 100644 --- a/Content.Shared/_CP14/MagicSpell/Events/CP14IDelayedMagicEffect.cs +++ b/Content.Shared/_CP14/MagicSpell/Events/CP14IDelayedMagicEffect.cs @@ -10,4 +10,6 @@ public interface ICP14DelayedMagicEffect // The speak n spell interface public bool BreakOnMove { get; } public bool BreakOnDamage { get; } + + public bool Hidden{ get; } } diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellCasterTeleport.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellCasterTeleport.cs index 070460a21f..c3359f2784 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellCasterTeleport.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellCasterTeleport.cs @@ -1,3 +1,5 @@ +using Content.Shared.Examine; +using Content.Shared.Popups; using Robust.Shared.Map; using Robust.Shared.Prototypes; @@ -5,6 +7,9 @@ namespace Content.Shared._CP14.MagicSpell.Spells; public sealed partial class CP14SpellCasterTeleport : CP14SpellEffect { + [DataField] + public bool NeedVision = true; + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) { EntityCoordinates? targetPoint = null; @@ -17,6 +22,15 @@ public sealed partial class CP14SpellCasterTeleport : CP14SpellEffect return; var transform = entManager.System(); + var examine = entManager.System(); + var popup = entManager.System(); + + if (NeedVision && !examine.InRangeUnOccluded(args.User.Value, targetPoint.Value)) + { + // can only dash if the destination is visible on screen + popup.PopupEntity(Loc.GetString("dash-ability-cant-see"), args.User.Value, args.User.Value); + return; + } transform.SetCoordinates(args.User.Value, targetPoint.Value); } diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntity.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnTarget.cs similarity index 91% rename from Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntity.cs rename to Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnTarget.cs index 127545e7b9..6545f85b7e 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntity.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnTarget.cs @@ -3,7 +3,7 @@ using Robust.Shared.Prototypes; namespace Content.Shared._CP14.MagicSpell.Spells; -public sealed partial class CP14SpellSpawnEntity : CP14SpellEffect +public sealed partial class CP14SpellSpawnEntityOnTarget : CP14SpellEffect { [DataField] public List Spawns = new(); diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnUser.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnUser.cs new file mode 100644 index 0000000000..43b3cc34e5 --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnUser.cs @@ -0,0 +1,21 @@ +using Robust.Shared.Map; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.MagicSpell.Spells; + +public sealed partial class CP14SpellSpawnEntityOnUser : CP14SpellEffect +{ + [DataField] + public List Spawns = new(); + + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) + { + if (args.User is null || !entManager.TryGetComponent(args.User.Value, out var transformComponent)) + return; + + foreach (var spawn in Spawns) + { + entManager.SpawnAtPosition(spawn, transformComponent.Coordinates); + } + } +} diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/cure_wounds.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/cure_wounds.yml index c06aa14b02..f48ebeb081 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/cure_wounds.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/cure_wounds.yml @@ -6,11 +6,11 @@ - type: CP14MagicEffect manaCost: 15 telegraphyEffects: - - !type:CP14SpellSpawnEntity + - !type:CP14SpellSpawnEntityOnTarget spawns: - CP14ImpactEffectCureWounds effects: - - !type:CP14SpellSpawnEntity + - !type:CP14SpellSpawnEntityOnTarget spawns: - CP14ImpactEffectCureWounds - !type:CP14SpellApplyEntityEffect diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/flame_creation.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/flame_creation.yml index fb412c18e9..b73ec9b4e6 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/flame_creation.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/flame_creation.yml @@ -6,7 +6,7 @@ - type: CP14MagicEffect manaCost: 5 effects: - - !type:CP14SpellSpawnEntity + - !type:CP14SpellSpawnEntityOnTarget spawns: - CP14ImpactEffectFlameCreation - !type:CP14SpellSpawnInHandEntity diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/ice_dagger.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/ice_dagger.yml index 2fb5dfa55a..418b7fab6a 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/ice_dagger.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/ice_dagger.yml @@ -6,7 +6,7 @@ - type: CP14MagicEffect manaCost: 15 effects: - - !type:CP14SpellSpawnEntity + - !type:CP14SpellSpawnEntityOnTarget spawns: - CP14ImpactEffectIceDagger - !type:CP14SpellSpawnInHandEntity diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/shadow_step.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/shadow_step.yml index f46741e0dc..2d88e9cc7b 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/shadow_step.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/shadow_step.yml @@ -1,26 +1,24 @@ - type: entity id: CP14ActionSpellShadowStep name: Shadow step - description: A step through the gash of reality that allows you to cover a lot of distance quickly + description: A step through the gash of reality that allows you to cover a small of distance quickly components: - type: CP14MagicEffect - manaCost: 40 + manaCost: 20 telegraphyEffects: - - !type:CP14SpellSpawnEntity + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14ImpactEffectShadowStep + - !type:CP14SpellSpawnEntityOnUser spawns: - CP14ImpactEffectShadowStep effects: - - !type:CP14SpellSpawnEntity - spawns: - - CP14ImpactEffectShadowStep - !type:CP14SpellCasterTeleport - - type: CP14MagicEffectVerbalAspect - startSpeech: "Tenebrae, accipe me..." - endSpeech: "in alium locum" + - type: CP14MagicEffectSomaticAspect - type: WorldTargetAction - useDelay: 15 - range: 10 - checkCanAccess: false + useDelay: 10 + range: 7 + checkCanAccess: true itemIconStyle: BigAction sound: !type:SoundPathSpecifier path: /Audio/Magic/rumble.ogg @@ -29,6 +27,7 @@ state: shadow_step event: !type:CP14DelayedWorldTargetActionEvent delay: 1 + hidden: true - type: entity id: CP14ImpactEffectShadowStep @@ -37,6 +36,5 @@ components: - type: Sprite layers: - - state: particles_up - color: "#79b330" - shader: unshaded \ No newline at end of file + - state: wave_up + color: "#5e427e" \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Clothing/Rings/ring.yml b/Resources/Prototypes/_CP14/Entities/Clothing/Rings/ring.yml index 28ffdc5562..72c30a3015 100644 --- a/Resources/Prototypes/_CP14/Entities/Clothing/Rings/ring.yml +++ b/Resources/Prototypes/_CP14/Entities/Clothing/Rings/ring.yml @@ -63,4 +63,22 @@ - type: CP14SpellStorageAccessWearing - type: CP14SpellStorage spells: - - CP14ActionSpellCureWounds \ No newline at end of file + - CP14ActionSpellCureWounds + +- type: entity + id: CP14ClothingRingShadowStep + parent: CP14ClothingRingBase + name: conductive ring + description: A standard mana-conductive ring that allows the user to step throught shadows. + suffix: Shadow step + components: + - type: Sprite + layers: + - state: brass_ring + - state: emerald_stone_small + - type: CP14SpellStorageRequireAttune + - type: CP14MagicAttuningItem + - type: CP14SpellStorageAccessWearing + - type: CP14SpellStorage + spells: + - CP14ActionSpellShadowStep \ No newline at end of file diff --git a/Resources/Textures/_CP14/Effects/Magic/cast_impact.rsi/meta.json b/Resources/Textures/_CP14/Effects/Magic/cast_impact.rsi/meta.json index d9e4483942..cd1908d9de 100644 --- a/Resources/Textures/_CP14/Effects/Magic/cast_impact.rsi/meta.json +++ b/Resources/Textures/_CP14/Effects/Magic/cast_impact.rsi/meta.json @@ -21,6 +21,21 @@ 0.2 ] ] + }, + { + "name": "wave_up", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] } ] } \ No newline at end of file diff --git a/Resources/Textures/_CP14/Effects/Magic/cast_impact.rsi/wave_up.png b/Resources/Textures/_CP14/Effects/Magic/cast_impact.rsi/wave_up.png new file mode 100644 index 0000000000000000000000000000000000000000..51c1a7969b19ad07e85cb72678c278e34aaa5bb7 GIT binary patch literal 10320 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 literal 0 HcmV?d00001