Skip to content

Commit

Permalink
Wizard Mind Swap Spell (space-wizards#33416)
Browse files Browse the repository at this point in the history
* working mind swap spell

* Removing unncessary spacing

Co-authored-by: Thomas <[email protected]>

* Changing mind swap speech

Co-authored-by: keronshb <[email protected]>

* All requested changes in review

* Stores owned by mind instead of body

* Requested changes, traitor uplink fixed

* Revert "Requested changes, traitor uplink fixed"

This reverts commit 2ceac67.

* Revert "Stores owned by mind instead of body"

This reverts commit dfb72ab.

* Separate target and performer stun duration

---------

Co-authored-by: Thomas <[email protected]>
Co-authored-by: keronshb <[email protected]>
  • Loading branch information
3 people authored Dec 16, 2024
1 parent 612f8be commit cd23805
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 0 deletions.
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

0 comments on commit cd23805

Please sign in to comment.