diff --git a/Content.Client/Magic/MagicSystem.cs b/Content.Client/Magic/MagicSystem.cs
index 03aa9eb56d4d..086a0f7b42e7 100644
--- a/Content.Client/Magic/MagicSystem.cs
+++ b/Content.Client/Magic/MagicSystem.cs
@@ -1,5 +1,8 @@
using Content.Shared.Magic;
+using Content.Shared.Magic.Events;
namespace Content.Client.Magic;
-public sealed class MagicSystem : SharedMagicSystem;
+public sealed class MagicSystem : SharedMagicSystem
+{
+}
diff --git a/Content.Server/Magic/MagicSystem.cs b/Content.Server/Magic/MagicSystem.cs
index 2cf5136b4277..a7e5e967862a 100644
--- a/Content.Server/Magic/MagicSystem.cs
+++ b/Content.Server/Magic/MagicSystem.cs
@@ -19,4 +19,17 @@ private void OnSpellSpoken(ref SpeakSpellEvent args)
{
_chat.TrySendInGameICMessage(args.Performer, Loc.GetString(args.Speech), InGameICChatType.Speak, false);
}
+
+ public override void OnVoidApplause(VoidApplauseSpellEvent ev)
+ {
+ base.OnVoidApplause(ev);
+
+ _chat.TryEmoteWithChat(ev.Performer, ev.Emote);
+
+ var perfXForm = Transform(ev.Performer);
+ var targetXForm = Transform(ev.Target);
+
+ Spawn(ev.Effect, perfXForm.Coordinates);
+ Spawn(ev.Effect, targetXForm.Coordinates);
+ }
}
diff --git a/Content.Shared/Magic/Events/VoidApplauseSpellEvent.cs b/Content.Shared/Magic/Events/VoidApplauseSpellEvent.cs
new file mode 100644
index 000000000000..c134790da88d
--- /dev/null
+++ b/Content.Shared/Magic/Events/VoidApplauseSpellEvent.cs
@@ -0,0 +1,24 @@
+using Content.Shared.Actions;
+using Content.Shared.Chat.Prototypes;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization;
+
+namespace Content.Shared.Magic.Events;
+
+public sealed partial class VoidApplauseSpellEvent : EntityTargetActionEvent, ISpeakSpell
+{
+ [DataField]
+ public string? Speech { get; private set; }
+
+ ///
+ /// Emote to use.
+ ///
+ [DataField]
+ public ProtoId Emote = "ClapSingle";
+
+ ///
+ /// Visual effect entity that is spawned at both the user's and the target's location.
+ ///
+ [DataField]
+ public EntProtoId Effect = "EffectVoidBlink";
+}
diff --git a/Content.Shared/Magic/SharedMagicSystem.cs b/Content.Shared/Magic/SharedMagicSystem.cs
index acedaf05f657..fe033f249879 100644
--- a/Content.Shared/Magic/SharedMagicSystem.cs
+++ b/Content.Shared/Magic/SharedMagicSystem.cs
@@ -80,6 +80,7 @@ public override void Initialize()
SubscribeLocalEvent(OnChargeSpell);
SubscribeLocalEvent(OnRandomGlobalSpawnSpell);
SubscribeLocalEvent(OnMindSwapSpell);
+ SubscribeLocalEvent(OnVoidApplause);
// Spell wishlist
// A wishlish of spells that I'd like to implement or planning on implementing in a future PR
@@ -402,8 +403,7 @@ private void OnTeleportSpell(TeleportSpellEvent args)
return;
var transform = Transform(args.Performer);
-
- if (transform.MapID != args.Target.GetMapId(EntityManager) || !_interaction.InRangeUnobstructed(args.Performer, args.Target, range: 1000F, collisionMask: CollisionGroup.Opaque, popup: true))
+ if (transform.MapID != _transform.GetMapId(args.Target) || !_interaction.InRangeUnobstructed(args.Performer, args.Target, range: 1000F, collisionMask: CollisionGroup.Opaque, popup: true))
return;
_transform.SetCoordinates(args.Performer, args.Target);
@@ -411,6 +411,17 @@ private void OnTeleportSpell(TeleportSpellEvent args)
Speak(args);
args.Handled = true;
}
+
+ public virtual void OnVoidApplause(VoidApplauseSpellEvent ev)
+ {
+ if (ev.Handled || !PassesSpellPrerequisites(ev.Action, ev.Performer))
+ return;
+
+ ev.Handled = true;
+ Speak(ev);
+
+ _transform.SwapPositions(ev.Performer, ev.Target);
+ }
// End Teleport Spells
#endregion
#region Spell Helpers
diff --git a/Resources/Audio/Effects/Emotes/attributions.yml b/Resources/Audio/Effects/Emotes/attributions.yml
index 0c62b483660e..6b580a930bb7 100644
--- a/Resources/Audio/Effects/Emotes/attributions.yml
+++ b/Resources/Audio/Effects/Emotes/attributions.yml
@@ -6,6 +6,11 @@
license: "CC-BY-SA-3.0"
copyright: "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432"
source: "https://github.com/tgstation/tgstation"
+- files:
+ - clap-single.ogg
+ license: "CC-BY-SA-3.0"
+ copyright: "Taken from Citadel Station at https://github.com/Citadel-Station-13/Citadel-Station-13/commit/e145bdafe83e2cf38d148c39f073da5e7b0cb456"
+ source: "https://github.com/Citadel-Station-13/Citadel-Station-13"
- files:
- snap1.ogg
- snap2.ogg
diff --git a/Resources/Audio/Effects/Emotes/clap-single.ogg b/Resources/Audio/Effects/Emotes/clap-single.ogg
new file mode 100644
index 000000000000..94d8b10107ee
Binary files /dev/null and b/Resources/Audio/Effects/Emotes/clap-single.ogg differ
diff --git a/Resources/Audio/Magic/Eldritch/voidblink.ogg b/Resources/Audio/Magic/Eldritch/voidblink.ogg
new file mode 100644
index 000000000000..84855918d1ef
Binary files /dev/null and b/Resources/Audio/Magic/Eldritch/voidblink.ogg differ
diff --git a/Resources/Audio/Magic/attributions.yml b/Resources/Audio/Magic/attributions.yml
index bfbe4d6ec24d..92a4ae3c4505 100644
--- a/Resources/Audio/Magic/attributions.yml
+++ b/Resources/Audio/Magic/attributions.yml
@@ -22,3 +22,9 @@
copyright: '"forcewall.ogg", "knock.ogg", "blink.ogg", "ethereal_enter.ogg", and "ethereal_exit.ogg" by Citadel Station 13'
license: CC-BY-SA-3.0
source: https://github.com/Citadel-Station-13/Citadel-Station-13/commit/35a1723e98a60f375df590ca572cc90f1bb80bd5
+
+- files:
+ - voidblink.ogg
+ copyright: '"voidblink.ogg" by Citadel Station 13'
+ license: CC-BY-SA-3.0
+ source: https://github.com/Citadel-Station-13/Citadel-Station-13/commit/e145bdafe83e2cf38d148c39f073da5e7b0cb456
diff --git a/Resources/Locale/en-US/chat/emotes.ftl b/Resources/Locale/en-US/chat/emotes.ftl
index 479e9daab4a2..74e669b50725 100644
--- a/Resources/Locale/en-US/chat/emotes.ftl
+++ b/Resources/Locale/en-US/chat/emotes.ftl
@@ -11,6 +11,7 @@ chat-emote-name-squeak = Squeak
chat-emote-name-thump = Thump Tail
chat-emote-name-click = Click
chat-emote-name-clap = Clap
+chat-emote-name-clap-single = Single Clap
chat-emote-name-snap = Snap
chat-emote-name-salute = Salute
chat-emote-name-gasp = Gasp
@@ -45,6 +46,7 @@ chat-emote-msg-squeak = squeaks.
chat-emote-msg-thump = thumps {POSS-ADJ($entity)} tail.
chat-emote-msg-click = clicks.
chat-emote-msg-clap = claps!
+chat-emote-msg-clap-single = claps their hands together.
chat-emote-msg-snap = snaps {POSS-ADJ($entity)} fingers.
chat-emote-msg-salute = salutes.
chat-emote-msg-gasp = gasps.
diff --git a/Resources/Locale/en-US/store/spellbook-catalog.ftl b/Resources/Locale/en-US/store/spellbook-catalog.ftl
index 1450cc86082f..98d19817c675 100644
--- a/Resources/Locale/en-US/store/spellbook-catalog.ftl
+++ b/Resources/Locale/en-US/store/spellbook-catalog.ftl
@@ -5,6 +5,9 @@ spellbook-fireball-desc = Get most crew exploding with rage when they see this f
spellbook-blink-name = Blink
spellbook-blink-desc = Don't blink or you'll miss yourself teleporting away.
+spellbook-voidapplause-name = Void Applause
+spellbook-voidapplause-desc = Swap places with the target, doesn't it make you want to do the boogie?
+
spellbook-force-wall-name = Force Wall
spellbook-force-wall-desc = Make three walls of pure force that you can pass through, but other's can't.
diff --git a/Resources/Prototypes/Catalog/spellbook_catalog.yml b/Resources/Prototypes/Catalog/spellbook_catalog.yml
index d5a9b0f1b9a3..3246117e7186 100644
--- a/Resources/Prototypes/Catalog/spellbook_catalog.yml
+++ b/Resources/Prototypes/Catalog/spellbook_catalog.yml
@@ -64,6 +64,20 @@
- !type:ListingLimitedStockCondition
stock: 1
+# Taking an Eldritch spell, good proof of concept and a way to celebrate everything magic.
+- type: listing
+ id: SpellbookVoidApplause
+ name: spellbook-voidapplause-name
+ description: spellbook-voidapplause-desc
+ productAction: ActionVoidApplause
+ cost:
+ WizCoin: 1
+ categories:
+ - SpellbookUtility
+ conditions:
+ - !type:ListingLimitedStockCondition
+ stock: 1
+
- type: listing
id: SpellbookCharge
name: spellbook-charge-name
diff --git a/Resources/Prototypes/Entities/Effects/eldritch.yml b/Resources/Prototypes/Entities/Effects/eldritch.yml
new file mode 100644
index 000000000000..196fe288e70f
--- /dev/null
+++ b/Resources/Prototypes/Entities/Effects/eldritch.yml
@@ -0,0 +1,25 @@
+- type: entity
+ id: EffectVoidBlink
+ name: void blink
+ categories: [ HideSpawnMenu ]
+ save: false
+ components:
+ # TODO: PointLight is temp until I can make a shader & overlay for negative light or until this can support it
+ - type: PointLight
+ radius: 3
+ energy: 1
+ softness: 10
+ color: "#301934"
+ - type: Transform
+ noRot: true
+ - type: Sprite
+ sprite: Objects/Magic/Eldritch/eldritch_actions.rsi
+ drawdepth: Effects
+ noRot: true
+ layers:
+ - state: "voidblink"
+ - type: TimedDespawn
+ lifetime: 1
+ - type: Tag
+ tags:
+ - HideContextMenu
diff --git a/Resources/Prototypes/Magic/teleport_spells.yml b/Resources/Prototypes/Magic/teleport_spells.yml
index 6f1ed9a6e43a..6e359cc611f2 100644
--- a/Resources/Prototypes/Magic/teleport_spells.yml
+++ b/Resources/Prototypes/Magic/teleport_spells.yml
@@ -16,3 +16,28 @@
sprite: Objects/Magic/magicactions.rsi
state: blink
event: !type:TeleportSpellEvent
+
+# TODO: Second level upgrade sometime that allows swapping with all objects
+- type: entity
+ id: ActionVoidApplause
+ name: Void Applause
+ description: Clap your hands and swap places with the target.
+ components:
+ - type: EntityTargetAction
+ useDelay: 15
+ range: 16
+ sound: !type:SoundPathSpecifier
+ path: /Audio/Magic/Eldritch/voidblink.ogg
+ itemIconStyle: BigAction
+ whitelist:
+ components:
+ - Body
+ canTargetSelf: false
+ interactOnMiss: false
+ checkCanAccess: false
+ repeat: false
+ icon:
+ sprite: Objects/Magic/Eldritch/eldritch_actions.rsi
+ state: voidblink
+ event: !type:VoidApplauseSpellEvent
+ effect: EffectVoidBlink
diff --git a/Resources/Prototypes/SoundCollections/emotes.yml b/Resources/Prototypes/SoundCollections/emotes.yml
index 04d2b3b2e8e2..c93a46572b10 100644
--- a/Resources/Prototypes/SoundCollections/emotes.yml
+++ b/Resources/Prototypes/SoundCollections/emotes.yml
@@ -30,6 +30,11 @@
- /Audio/Effects/Emotes/clap3.ogg
- /Audio/Effects/Emotes/clap4.ogg
+- type: soundCollection
+ id: ClapSingle
+ files:
+ - /Audio/Effects/Emotes/clap-single.ogg
+
- type: soundCollection
id: Snaps
files:
diff --git a/Resources/Prototypes/Voice/speech_emote_sounds.yml b/Resources/Prototypes/Voice/speech_emote_sounds.yml
index 9fab1aeed807..82b4b4057470 100644
--- a/Resources/Prototypes/Voice/speech_emote_sounds.yml
+++ b/Resources/Prototypes/Voice/speech_emote_sounds.yml
@@ -438,6 +438,8 @@
sounds:
Clap:
collection: Claps
+ ClapSingle:
+ collection: ClapSingle
Snap:
collection: Snaps
params:
@@ -450,6 +452,9 @@
sounds:
Clap:
path: /Audio/Voice/Diona/diona_clap.ogg
+ # TODO: Replace this with a similar wood themed single clap
+ ClapSingle:
+ collection: ClapSingle
Snap:
path: /Audio/Voice/Diona/diona_snap.ogg
params:
@@ -468,6 +473,8 @@
variation: 0.125
Clap:
collection: Claps
+ ClapSingle:
+ collection: ClapSingle
Snap:
collection: Snaps
params:
diff --git a/Resources/Prototypes/Voice/speech_emotes.yml b/Resources/Prototypes/Voice/speech_emotes.yml
index 9de4bb2b7019..a346f8614841 100644
--- a/Resources/Prototypes/Voice/speech_emotes.yml
+++ b/Resources/Prototypes/Voice/speech_emotes.yml
@@ -214,11 +214,26 @@
- BorgChassis
chatMessages: ["chat-emote-msg-clap"]
chatTriggers:
- - clap
- claps
- clapping
- clapped
+- type: emote
+ id: ClapSingle
+ name: chat-emote-name-clap-single
+ category: Hands
+ icon: Interface/Emotes/clap.png #TODO: Needs a sprite that distinguishes it better from clap
+ whitelist:
+ components:
+ - Hands
+ blacklist:
+ components:
+ - BorgChassis
+ chatMessages: [ "chat-emote-msg-clap-single" ]
+ chatTriggers:
+ - clap
+ - claps their hands together
+
- type: emote
id: Snap
name: chat-emote-name-snap
diff --git a/Resources/Textures/Objects/Magic/Eldritch/eldritch_actions.rsi/meta.json b/Resources/Textures/Objects/Magic/Eldritch/eldritch_actions.rsi/meta.json
new file mode 100644
index 000000000000..8dddb61e05a9
--- /dev/null
+++ b/Resources/Textures/Objects/Magic/Eldritch/eldritch_actions.rsi/meta.json
@@ -0,0 +1,27 @@
+{
+ "version": 1,
+ "license": "CC-BY-NC-SA-3.0",
+ "copyright": "Taken from and modified by kiwedespars on Citadel Station at commit https://github.com/Citadel-Station-13/Citadel-Station-13/commit/e145bdafe83e2cf38d148c39f073da5e7b0cb456",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "voidblink",
+ "delays": [
+ [
+ 0.1,
+ 0.3,
+ 0.1,
+ 0.3,
+ 0.1,
+ 0.3,
+ 0.1,
+ 0.3,
+ 0.3
+ ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/Objects/Magic/Eldritch/eldritch_actions.rsi/voidblink.png b/Resources/Textures/Objects/Magic/Eldritch/eldritch_actions.rsi/voidblink.png
new file mode 100644
index 000000000000..c44f8890acd8
Binary files /dev/null and b/Resources/Textures/Objects/Magic/Eldritch/eldritch_actions.rsi/voidblink.png differ