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.Popups;
|
||||||
using Content.Shared.Speech.Muting;
|
using Content.Shared.Speech.Muting;
|
||||||
using Content.Shared.Storage;
|
using Content.Shared.Storage;
|
||||||
|
using Content.Shared.Stunnable;
|
||||||
using Content.Shared.Tag;
|
using Content.Shared.Tag;
|
||||||
using Content.Shared.Weapons.Ranged.Components;
|
using Content.Shared.Weapons.Ranged.Components;
|
||||||
using Content.Shared.Weapons.Ranged.Systems;
|
using Content.Shared.Weapons.Ranged.Systems;
|
||||||
@@ -62,6 +63,7 @@ public abstract class SharedMagicSystem : EntitySystem
|
|||||||
[Dependency] private readonly MobStateSystem _mobState = default!;
|
[Dependency] private readonly MobStateSystem _mobState = default!;
|
||||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||||
[Dependency] private readonly SharedMindSystem _mind = default!;
|
[Dependency] private readonly SharedMindSystem _mind = default!;
|
||||||
|
[Dependency] private readonly SharedStunSystem _stun = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -77,6 +79,7 @@ public abstract class SharedMagicSystem : EntitySystem
|
|||||||
SubscribeLocalEvent<KnockSpellEvent>(OnKnockSpell);
|
SubscribeLocalEvent<KnockSpellEvent>(OnKnockSpell);
|
||||||
SubscribeLocalEvent<ChargeSpellEvent>(OnChargeSpell);
|
SubscribeLocalEvent<ChargeSpellEvent>(OnChargeSpell);
|
||||||
SubscribeLocalEvent<RandomGlobalSpawnSpellEvent>(OnRandomGlobalSpawnSpell);
|
SubscribeLocalEvent<RandomGlobalSpawnSpellEvent>(OnRandomGlobalSpawnSpell);
|
||||||
|
SubscribeLocalEvent<MindSwapSpellEvent>(OnMindSwapSpell);
|
||||||
|
|
||||||
// Spell wishlist
|
// Spell wishlist
|
||||||
// A wishlish of spells that I'd like to implement or planning on implementing in a future PR
|
// 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);
|
_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
|
#endregion
|
||||||
// End Spells
|
// End Spells
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@@ -5,3 +5,4 @@ action-speech-spell-summon-magicarp = AIE KHUSE EU
|
|||||||
action-speech-spell-fireball = ONI'SOMA!
|
action-speech-spell-fireball = ONI'SOMA!
|
||||||
action-speech-spell-summon-guns = YOR'NEE VES-KORFA
|
action-speech-spell-summon-guns = YOR'NEE VES-KORFA
|
||||||
action-speech-spell-summon-magic = RYGOIN FEMA-VERECO
|
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-name = Ethereal Jaunt
|
||||||
spellbook-ethereal-jaunt-description = Slip into the ethereal plane to slip away from your enemies!
|
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
|
# Equipment
|
||||||
|
|
||||||
spellbook-wand-polymorph-door-name = Wand of Entrance
|
spellbook-wand-polymorph-door-name = Wand of Entrance
|
||||||
|
|||||||
@@ -91,6 +91,19 @@
|
|||||||
- !type:ListingLimitedStockCondition
|
- !type:ListingLimitedStockCondition
|
||||||
stock: 1
|
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
|
# Equipment
|
||||||
- type: listing
|
- type: listing
|
||||||
id: SpellbookWandDoor
|
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