Wizard Mind Swap Spell (#33416)
* working mind swap spell * Removing unncessary spacing Co-authored-by: Thomas <87614336+Aeshus@users.noreply.github.com> * Changing mind swap speech Co-authored-by: keronshb <54602815+keronshb@users.noreply.github.com> * 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 2ceac6733d6a28890f60d2ccef3dafa160a702fd. * Revert "Stores owned by mind instead of body" This reverts commit dfb72ab70ed66db50312617f2dce02d0a4e4dfce. * Separate target and performer stun duration --------- Co-authored-by: Thomas <87614336+Aeshus@users.noreply.github.com> Co-authored-by: keronshb <54602815+keronshb@users.noreply.github.com>
This commit is contained in:
15
Content.Shared/Magic/Events/MindSwapSpellEvent.cs
Normal file
15
Content.Shared/Magic/Events/MindSwapSpellEvent.cs
Normal file
@@ -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; }
|
||||
}
|
||||
@@ -22,6 +22,7 @@ using Content.Shared.Physics;
|
||||
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;
|
||||
@@ -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()
|
||||
{
|
||||
@@ -77,6 +79,7 @@ public abstract class SharedMagicSystem : EntitySystem
|
||||
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
|
||||
@@ -542,6 +545,37 @@ public abstract class SharedMagicSystem : EntitySystem
|
||||
_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
|
||||
|
||||
@@ -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!
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
20
Resources/Prototypes/Magic/mindswap_spell.yml
Normal file
20
Resources/Prototypes/Magic/mindswap_spell.yml
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user