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