Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wizard Mind Swap Spell #33416

Merged
merged 9 commits into from
Dec 16, 2024
15 changes: 15 additions & 0 deletions Content.Shared/Magic/Events/MindSwapSpellEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using Content.Shared.Actions;

namespace Content.Shared.Magic.Events;

public sealed partial class MindSwapSpellEvent : EntityTargetActionEvent, ISpeakSpell
{
[DataField]
public TimeSpan PerformerStunDuration = TimeSpan.FromSeconds(10);

[DataField]
public TimeSpan TargetStunDuration = TimeSpan.FromSeconds(10);

[DataField]
public string? Speech { get; private set; }
}
34 changes: 34 additions & 0 deletions Content.Shared/Magic/SharedMagicSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
using Content.Shared.Popups;
using Content.Shared.Speech.Muting;
using Content.Shared.Storage;
using Content.Shared.Stunnable;
using Content.Shared.Tag;
using Content.Shared.Weapons.Ranged.Components;
using Content.Shared.Weapons.Ranged.Systems;
Expand Down Expand Up @@ -62,6 +63,7 @@ public abstract class SharedMagicSystem : EntitySystem
[Dependency] private readonly MobStateSystem _mobState = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedMindSystem _mind = default!;
[Dependency] private readonly SharedStunSystem _stun = default!;

public override void Initialize()
{
Expand All @@ -77,6 +79,7 @@ public override void Initialize()
SubscribeLocalEvent<KnockSpellEvent>(OnKnockSpell);
SubscribeLocalEvent<ChargeSpellEvent>(OnChargeSpell);
SubscribeLocalEvent<RandomGlobalSpawnSpellEvent>(OnRandomGlobalSpawnSpell);
SubscribeLocalEvent<MindSwapSpellEvent>(OnMindSwapSpell);

// Spell wishlist
// A wishlish of spells that I'd like to implement or planning on implementing in a future PR
Expand Down Expand Up @@ -542,6 +545,37 @@ private void OnRandomGlobalSpawnSpell(RandomGlobalSpawnSpellEvent ev)
_audio.PlayGlobal(ev.Sound, ev.Performer);
}

#endregion
#region Mindswap Spells

private void OnMindSwapSpell(MindSwapSpellEvent ev)
{
if (ev.Handled || !PassesSpellPrerequisites(ev.Action, ev.Performer))
return;

ev.Handled = true;
Speak(ev);

// Need performer mind, but target mind is unnecessary, such as taking over a NPC
// Need to get target mind before putting performer mind into their body if they have one
// Thus, assign bool before first transfer, then check afterwards

if (!_mind.TryGetMind(ev.Performer, out var perMind, out var perMindComp))
return;

var tarHasMind = _mind.TryGetMind(ev.Target, out var tarMind, out var tarMindComp);

_mind.TransferTo(perMind, ev.Target);

if (tarHasMind)
{
_mind.TransferTo(tarMind, ev.Performer);
}

_stun.TryParalyze(ev.Target, ev.TargetStunDuration, true);
_stun.TryParalyze(ev.Performer, ev.PerformerStunDuration, true);
}

#endregion
// End Spells
#endregion
Expand Down
1 change: 1 addition & 0 deletions Resources/Locale/en-US/magic/spells-actions.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ action-speech-spell-summon-magicarp = AIE KHUSE EU
action-speech-spell-fireball = ONI'SOMA!
action-speech-spell-summon-guns = YOR'NEE VES-KORFA
action-speech-spell-summon-magic = RYGOIN FEMA-VERECO
action-speech-spell-mind-swap = GIN'YU CAPAN!
3 changes: 3 additions & 0 deletions Resources/Locale/en-US/store/spellbook-catalog.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ spellbook-charge-desc = Adds a charge back to your wand!
spellbook-ethereal-jaunt-name = Ethereal Jaunt
spellbook-ethereal-jaunt-description = Slip into the ethereal plane to slip away from your enemies!

spellbook-mind-swap-name = Mind Swap
spellbook-mind-swap-description = Exchange bodies with another person!

# Equipment

spellbook-wand-polymorph-door-name = Wand of Entrance
Expand Down
13 changes: 13 additions & 0 deletions Resources/Prototypes/Catalog/spellbook_catalog.yml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,19 @@
- !type:ListingLimitedStockCondition
stock: 1

- type: listing
id: SpellbookMindSwap
name: spellbook-mind-swap-name
description: spellbook-mind-swap-description
productAction: ActionMindSwap
cost:
WizCoin: 2
categories:
- SpellbookUtility
conditions:
- !type:ListingLimitedStockCondition
stock: 1

# Equipment
- type: listing
id: SpellbookWandDoor
Expand Down
20 changes: 20 additions & 0 deletions Resources/Prototypes/Magic/mindswap_spell.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
- type: entity
id: ActionMindSwap
name: Mind Swap
description: Exchange bodies with another person!
components:
- type: EntityTargetAction
useDelay: 300
itemIconStyle: BigAction
whitelist:
components:
- Body
canTargetSelf: false
interactOnMiss: false
sound: !type:SoundPathSpecifier
path: /Audio/Magic/staff_animation.ogg
icon:
sprite: Mobs/Species/Human/organs.rsi
state: brain
event: !type:MindSwapSpellEvent
speech: action-speech-spell-mind-swap
Loading