Magic and gamerule tweaks (#363)
* - tweak: Wiz hardsuit tweaks. * - tweak: Gamemode tweaks. * - add: Mindswap spell. * - add: Transfer wizard component on mindswap. * - add: Wizard is blight immune.
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
using Content.Server.Damage.Components;
|
||||
using Content.Server.DeviceLinking.Events;
|
||||
using Content.Server.DeviceLinking.Systems;
|
||||
using Content.Server.Power.Components;
|
||||
@@ -12,6 +13,7 @@ using Content.Shared.Inventory;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.PowerCell;
|
||||
using Content.Shared.PowerCell.Components;
|
||||
using Content.Shared.Throwing;
|
||||
using Content.Shared.Timing;
|
||||
using Content.Shared.Toggleable;
|
||||
using Content.Shared.Verbs;
|
||||
@@ -35,6 +37,8 @@ public sealed partial class EnergyDomeSystem : EntitySystem
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<DamageOtherOnHitComponent, ThrownEvent>(OnThrow);
|
||||
|
||||
//Generator events
|
||||
SubscribeLocalEvent<EnergyDomeGeneratorComponent, MapInitEvent>(OnInit);
|
||||
|
||||
@@ -62,6 +66,14 @@ public sealed partial class EnergyDomeSystem : EntitySystem
|
||||
SubscribeLocalEvent<EnergyDomeComponent, DamageChangedEvent>(OnDomeDamaged);
|
||||
}
|
||||
|
||||
private void OnThrow(Entity<DamageOtherOnHitComponent> ent, ref ThrownEvent args)
|
||||
{
|
||||
if (args.User == null)
|
||||
return;
|
||||
|
||||
RaiseLocalEvent(args.User.Value, new EnergyDomeClothesTurnOffEvent());
|
||||
}
|
||||
|
||||
private void OnClothesTurnOff(Entity<EnergyDomeGeneratorComponent> ent,
|
||||
ref InventoryRelayedEvent<EnergyDomeClothesTurnOffEvent> args)
|
||||
{
|
||||
|
||||
@@ -30,7 +30,7 @@ public sealed partial class NukeopsRuleComponent : Component
|
||||
/// What will happen if all of the nuclear operatives will die. Used by LoneOpsSpawn event.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public RoundEndBehavior RoundEndBehavior = RoundEndBehavior.ShuttleCall;
|
||||
public RoundEndBehavior RoundEndBehavior = RoundEndBehavior.InstantEnd;
|
||||
|
||||
/// <summary>
|
||||
/// Text for shuttle call if RoundEndBehavior is ShuttleCall.
|
||||
|
||||
@@ -36,13 +36,13 @@ public sealed partial class ZombieRuleComponent : Component
|
||||
/// The minimum amount of time after the round starts that the initial infected will be chosen.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public TimeSpan MinStartDelay = TimeSpan.FromMinutes(10);
|
||||
public TimeSpan MinStartDelay = TimeSpan.FromMinutes(3);
|
||||
|
||||
/// <summary>
|
||||
/// The maximum amount of time after the round starts that the initial infected will be chosen.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public TimeSpan MaxStartDelay = TimeSpan.FromMinutes(15);
|
||||
public TimeSpan MaxStartDelay = TimeSpan.FromMinutes(6);
|
||||
|
||||
/// <summary>
|
||||
/// The sound that plays when someone becomes an initial infected.
|
||||
|
||||
@@ -45,6 +45,7 @@ using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Random;
|
||||
using Robust.Shared.Utility;
|
||||
using System.Linq;
|
||||
using Content.Server.StationEvents.Components;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Content.Shared.Mind;
|
||||
|
||||
@@ -683,9 +684,14 @@ public sealed class NukeopsRuleSystem : GameRuleSystem<NukeopsRuleComponent>
|
||||
: WinCondition.AllNukiesDead);
|
||||
|
||||
SetWinType(uid, WinType.CrewMajor, nukeops, false);
|
||||
_roundEndSystem.DoRoundEndBehavior(
|
||||
nukeops.RoundEndBehavior, nukeops.EvacShuttleTime, nukeops.RoundEndTextSender,
|
||||
nukeops.RoundEndTextShuttleCall, nukeops.RoundEndTextAnnouncement);
|
||||
|
||||
// WD EDIT, check for all at once gamemode
|
||||
if (!GameTicker.GetActiveGameRules().Where(HasComp<RampingStationEventSchedulerComponent>).Any())
|
||||
{
|
||||
_roundEndSystem.DoRoundEndBehavior(
|
||||
nukeops.RoundEndBehavior, nukeops.EvacShuttleTime, nukeops.RoundEndTextSender,
|
||||
nukeops.RoundEndTextShuttleCall, nukeops.RoundEndTextAnnouncement);
|
||||
}
|
||||
|
||||
// prevent it called multiple times
|
||||
nukeops.RoundEndBehavior = RoundEndBehavior.Nothing;
|
||||
|
||||
@@ -107,10 +107,8 @@ public sealed class RevolutionaryRuleSystem : GameRuleSystem<RevolutionaryRuleCo
|
||||
if (CheckCommandLose())
|
||||
{
|
||||
// WD EDIT START
|
||||
// Basically check for all in once gamemode
|
||||
if (_gameTicker.GetActiveGameRules().Where(HasComp<RampingStationEventSchedulerComponent>).Any())
|
||||
_roundEnd.DoRoundEndBehavior(RoundEndBehavior.ShuttleCall, component.ShuttleCallTime);
|
||||
else
|
||||
// Check for all at once gamemode
|
||||
if (!_gameTicker.GetActiveGameRules().Where(HasComp<RampingStationEventSchedulerComponent>).Any())
|
||||
_roundEnd.EndRound();
|
||||
|
||||
// WD EDIT END
|
||||
@@ -429,4 +427,4 @@ public sealed class RevolutionaryRuleSystem : GameRuleSystem<RevolutionaryRuleCo
|
||||
EnsureComp<RevolutionaryComponent>(transferTo);
|
||||
RemComp<RevolutionaryComponent>(transferFrom);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ using Content.Shared.Item;
|
||||
using Content.Shared.Bed.Sleep;
|
||||
using System.Linq;
|
||||
using System.Numerics;
|
||||
using Content.Server._White.Wizard;
|
||||
using Content.Server.Bible.Components;
|
||||
using Content.Server.Maps;
|
||||
using Content.Server.Revenant.Components;
|
||||
@@ -335,10 +336,12 @@ public sealed partial class RevenantSystem
|
||||
|
||||
// WD START
|
||||
var cultistQuery = GetEntityQuery<CultistComponent>();
|
||||
var wizardQuery = GetEntityQuery<WizardComponent>();
|
||||
var humanoidQuery = GetEntityQuery<HumanoidAppearanceComponent>();
|
||||
foreach (var e in _lookup.GetEntitiesInRange(uid, component.BlightRadius))
|
||||
{
|
||||
if (!humanoidQuery.HasComponent(e) || !_mobState.IsAlive(e) || cultistQuery.HasComponent(e))
|
||||
if (!humanoidQuery.HasComponent(e) || !_mobState.IsAlive(e) || cultistQuery.HasComponent(e) ||
|
||||
wizardQuery.HasComponent(e))
|
||||
continue;
|
||||
|
||||
var blight = EnsureComp<BlightComponent>(e);
|
||||
|
||||
@@ -53,7 +53,7 @@ namespace Content.Server.RoundEnd
|
||||
/// <summary>
|
||||
/// Countdown to use where there is no station alert countdown to be found.
|
||||
/// </summary>
|
||||
public TimeSpan DefaultCountdownDuration { get; set; } = TimeSpan.FromMinutes(10);
|
||||
public TimeSpan DefaultCountdownDuration { get; set; } = TimeSpan.FromMinutes(5);
|
||||
|
||||
private CancellationTokenSource? _countdownTokenSource;
|
||||
private CancellationTokenSource? _cooldownTokenSource;
|
||||
|
||||
@@ -311,7 +311,7 @@ public sealed class CultRuleSystem : GameRuleSystem<CultRuleComponent>
|
||||
|
||||
cult.WinCondition = CultWinCondition.Failure;
|
||||
|
||||
// Check for all in once gamemode
|
||||
// Check for all at once gamemode
|
||||
if (!GameTicker.GetActiveGameRules().Where(HasComp<RampingStationEventSchedulerComponent>).Any())
|
||||
_roundEndSystem.EndRound();
|
||||
}
|
||||
|
||||
@@ -13,14 +13,18 @@ using Content.Server.Emp;
|
||||
using Content.Server.EUI;
|
||||
using Content.Server.Lightning;
|
||||
using Content.Server.Magic;
|
||||
using Content.Server.Mind;
|
||||
using Content.Server.Singularity.EntitySystems;
|
||||
using Content.Server.Standing;
|
||||
using Content.Server.Weapons.Ranged.Systems;
|
||||
using Content.Shared._White.BetrayalDagger;
|
||||
using Content.Shared._White.Cult.Components;
|
||||
using Content.Shared._White.Events;
|
||||
using Content.Shared._White.Wizard;
|
||||
using Content.Shared._White.Wizard.Magic;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Borer;
|
||||
using Content.Shared.Changeling;
|
||||
using Content.Shared.Cluwne;
|
||||
using Content.Shared.Coordinates.Helpers;
|
||||
using Content.Shared.Hands.Components;
|
||||
@@ -35,6 +39,7 @@ using Content.Shared.Maps;
|
||||
using Content.Shared.Mobs.Components;
|
||||
using Content.Shared.Physics;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Revolutionary.Components;
|
||||
using Content.Shared.StatusEffect;
|
||||
using Content.Shared.Throwing;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
@@ -71,6 +76,8 @@ public sealed class WizardSpellsSystem : EntitySystem
|
||||
[Dependency] private readonly StandingStateSystem _standing = default!;
|
||||
[Dependency] private readonly TelefragSystem _telefrag = default!;
|
||||
[Dependency] private readonly EuiManager _euiManager = default!;
|
||||
[Dependency] private readonly MindSystem _mindSystem = default!;
|
||||
[Dependency] private readonly ActionContainerSystem _actionContainer = default!;
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -78,6 +85,7 @@ public sealed class WizardSpellsSystem : EntitySystem
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<MindswapSpellEvent>(OnMindswapSpell);
|
||||
SubscribeLocalEvent<TeleportSpellEvent>(OnTeleportSpell);
|
||||
SubscribeLocalEvent<InstantRecallSpellEvent>(OnInstantRecallSpell);
|
||||
SubscribeLocalEvent<MimeTouchSpellEvent>(OnMimeTouchSpell);
|
||||
@@ -95,6 +103,73 @@ public sealed class WizardSpellsSystem : EntitySystem
|
||||
SubscribeLocalEvent<MagicComponent, BeforeCastSpellEvent>(OnBeforeCastSpell);
|
||||
}
|
||||
|
||||
#region Mindswap
|
||||
|
||||
private void OnMindswapSpell(MindswapSpellEvent msg)
|
||||
{
|
||||
if (!CanCast(msg))
|
||||
return;
|
||||
|
||||
var target = msg.Target;
|
||||
var uid = msg.Performer;
|
||||
|
||||
if (HasComp<ChangelingComponent>(target) || HasComp<RevolutionaryComponent>(target) ||
|
||||
HasComp<CultistComponent>(target))
|
||||
{
|
||||
_popupSystem.PopupEntity("Не работает на культистов, генокрадов и революционеров.", uid, uid,
|
||||
PopupType.MediumCaution);
|
||||
return;
|
||||
}
|
||||
|
||||
if (TryComp(target, out InfestedBorerComponent? borer) && borer.ControllingBrain)
|
||||
{
|
||||
_popupSystem.PopupEntity("Им уже кто-то управляет.", uid, uid, PopupType.MediumCaution);
|
||||
return;
|
||||
}
|
||||
|
||||
var userHasMind = _mindSystem.TryGetMind(uid, out var mindId, out var mind);
|
||||
var targetHasMind = _mindSystem.TryGetMind(target, out var targetMindId, out var targetMind);
|
||||
|
||||
if (!userHasMind)
|
||||
return;
|
||||
|
||||
_mindSystem.TransferTo(mindId, target, mind: mind);
|
||||
|
||||
if (targetHasMind)
|
||||
{
|
||||
_mindSystem.TransferTo(targetMindId, uid, mind: targetMind);
|
||||
_popupSystem.PopupEntity(Loc.GetString("Ваш разум подменили!"), uid, uid, PopupType.LargeCaution);
|
||||
}
|
||||
|
||||
TransferAllMagicActions(uid, target);
|
||||
|
||||
_standing.TryLieDown(uid);
|
||||
_standing.TryLieDown(target);
|
||||
|
||||
msg.Handled = true;
|
||||
Speak(msg);
|
||||
|
||||
var hasWiz = HasComp<WizardComponent>(uid);
|
||||
var targetHasWiz = HasComp<WizardComponent>(target);
|
||||
|
||||
if (hasWiz == targetHasWiz)
|
||||
return;
|
||||
|
||||
if (hasWiz)
|
||||
{
|
||||
RemComp<WizardComponent>(uid);
|
||||
EnsureComp<WizardComponent>(target);
|
||||
}
|
||||
|
||||
if (targetHasWiz)
|
||||
{
|
||||
RemComp<WizardComponent>(target);
|
||||
EnsureComp<WizardComponent>(uid);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Teleport
|
||||
|
||||
private void OnTeleportSpell(TeleportSpellEvent msg)
|
||||
@@ -797,27 +872,48 @@ public sealed class WizardSpellsSystem : EntitySystem
|
||||
private void OnBeforeCastSpell(Entity<MagicComponent> ent, ref BeforeCastSpellEvent args)
|
||||
{
|
||||
var comp = ent.Comp;
|
||||
|
||||
if (!comp.RequiresClothes)
|
||||
return;
|
||||
|
||||
var hasReqs = false;
|
||||
|
||||
if (comp.RequiresClothes)
|
||||
var enumerator = _inventory.GetSlotEnumerator(args.Performer, SlotFlags.OUTERCLOTHING | SlotFlags.HEAD);
|
||||
while (enumerator.MoveNext(out var containerSlot))
|
||||
{
|
||||
var enumerator = _inventory.GetSlotEnumerator(args.Performer, SlotFlags.OUTERCLOTHING | SlotFlags.HEAD);
|
||||
while (enumerator.MoveNext(out var containerSlot))
|
||||
{
|
||||
if (containerSlot.ContainedEntity is { } item)
|
||||
hasReqs = HasComp<WizardClothesComponent>(item);
|
||||
else
|
||||
hasReqs = false;
|
||||
if (containerSlot.ContainedEntity is { } item)
|
||||
hasReqs = HasComp<WizardClothesComponent>(item);
|
||||
else
|
||||
hasReqs = false;
|
||||
|
||||
if (!hasReqs)
|
||||
break;
|
||||
}
|
||||
if (!hasReqs)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!hasReqs)
|
||||
if (hasReqs)
|
||||
return;
|
||||
|
||||
args.Cancelled = true;
|
||||
_popupSystem.PopupEntity(Loc.GetString("magic-component-missing-req"), args.Performer, args.Performer);
|
||||
}
|
||||
|
||||
private void TransferAllMagicActions(EntityUid uid1, EntityUid uid2)
|
||||
{
|
||||
if (!TryComp(uid1, out ActionsContainerComponent? container1) ||
|
||||
!TryComp(uid2, out ActionsContainerComponent? container2))
|
||||
return;
|
||||
|
||||
var actions1 = container1.Container.ContainedEntities.Where(HasComp<MagicComponent>).ToList();
|
||||
var actions2 = container2.Container.ContainedEntities.Where(HasComp<MagicComponent>).ToList();
|
||||
|
||||
foreach (var act in actions1)
|
||||
{
|
||||
args.Cancelled = true;
|
||||
_popupSystem.PopupEntity(Loc.GetString("magic-component-missing-req"), args.Performer, args.Performer);
|
||||
_actionContainer.TransferActionWithNewAttached(act, uid2, uid2, container: container2);
|
||||
}
|
||||
|
||||
foreach (var act in actions2)
|
||||
{
|
||||
_actionContainer.TransferActionWithNewAttached(act, uid1, uid1, container: container1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ public sealed partial class WizardRuleComponent : Component
|
||||
[DataField]
|
||||
public ProtoId<NpcFactionPrototype> Faction = "Wizard";
|
||||
|
||||
public RoundEndBehavior RoundEndBehavior = RoundEndBehavior.ShuttleCall;
|
||||
public RoundEndBehavior RoundEndBehavior = RoundEndBehavior.InstantEnd;
|
||||
|
||||
[DataField]
|
||||
public string RoundEndTextSender = "comms-console-announcement-title-centcom";
|
||||
|
||||
@@ -23,6 +23,7 @@ using Robust.Shared.Prototypes;
|
||||
using System.Linq;
|
||||
using Content.Server.Objectives;
|
||||
using Content.Server.Station.Components;
|
||||
using Content.Server.StationEvents.Components;
|
||||
using Content.Shared.Mind;
|
||||
using Content.Shared.NPC.Components;
|
||||
using Content.Shared.Objectives.Components;
|
||||
@@ -62,7 +63,6 @@ public sealed class WizardRuleSystem : GameRuleSystem<WizardRuleComponent>
|
||||
SubscribeLocalEvent<RoundStartAttemptEvent>(OnStartAttempt);
|
||||
SubscribeLocalEvent<RulePlayerSpawningEvent>(OnPlayersSpawning);
|
||||
SubscribeLocalEvent<GameRunLevelChangedEvent>(OnRunLevelChanged);
|
||||
SubscribeLocalEvent<WizardComponent, ComponentRemove>(OnComponentRemove);
|
||||
SubscribeLocalEvent<WizardComponent, MobStateChangedEvent>(OnMobStateChanged);
|
||||
SubscribeLocalEvent<WizardComponent, GhostRoleSpawnerUsedEvent>(OnPlayersGhostSpawning);
|
||||
SubscribeLocalEvent<WizardComponent, MindAddedMessage>(OnMindAdded);
|
||||
@@ -123,11 +123,6 @@ public sealed class WizardRuleSystem : GameRuleSystem<WizardRuleComponent>
|
||||
SpawnWizardGhostRole(uid, component);
|
||||
}
|
||||
|
||||
private void OnComponentRemove(EntityUid uid, WizardComponent component, ComponentRemove args)
|
||||
{
|
||||
CheckAnnouncement();
|
||||
}
|
||||
|
||||
private void OnMobStateChanged(EntityUid uid, WizardComponent component, MobStateChangedEvent ev)
|
||||
{
|
||||
if (ev.NewMobState == MobState.Dead)
|
||||
@@ -249,6 +244,10 @@ public sealed class WizardRuleSystem : GameRuleSystem<WizardRuleComponent>
|
||||
|
||||
private void CheckAnnouncement()
|
||||
{
|
||||
// Check for all at once gamemode
|
||||
if (GameTicker.GetActiveGameRules().Where(HasComp<RampingStationEventSchedulerComponent>).Any())
|
||||
return;
|
||||
|
||||
var query = QueryActiveRules();
|
||||
while (query.MoveNext(out _, out _, out var wizard, out _))
|
||||
{
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Numerics;
|
||||
using Content.Shared._White.Events;
|
||||
using Content.Shared._White.WeaponModules;
|
||||
using Content.Shared.ActionBlocker;
|
||||
using Content.Shared.Actions;
|
||||
@@ -353,6 +354,7 @@ public abstract partial class SharedGunSystem : EntitySystem
|
||||
return;
|
||||
}
|
||||
|
||||
RaiseLocalEvent(user, new EnergyDomeClothesTurnOffEvent()); // WD
|
||||
// Shoot confirmed - sounds also played here in case it's invalid (e.g. cartridge already spent).
|
||||
Shoot(gunUid, gun, ev.Ammo, fromCoordinates, toCoordinates.Value, out var userImpulse, user, throwItems: attemptEv.ThrowItems);
|
||||
var shotEv = new GunShotEvent(user, ev.Ammo);
|
||||
|
||||
@@ -178,4 +178,10 @@ public sealed partial class TeleportSpellEvent : InstantActionEvent, ISpeakSpell
|
||||
public string? Speech { get; private set; }
|
||||
}
|
||||
|
||||
public sealed partial class MindswapSpellEvent : EntityTargetActionEvent, ISpeakSpell
|
||||
{
|
||||
[DataField("speech")]
|
||||
public string? Speech { get; private set; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -16,6 +16,7 @@ scroll-component-silence = тишину
|
||||
scroll-component-recall = призыв
|
||||
scroll-component-teleport = телепортацию
|
||||
scroll-component-smite = кару
|
||||
scroll-component-mindswap = подмену сознания
|
||||
|
||||
ent-BaseScroll = магический свиток
|
||||
.desc = Этот древний пергамент, ставший реликвией в арканных преданиях, хранит в себе бесчисленные мистические заклятия и забытые заклинания.
|
||||
@@ -49,3 +50,5 @@ ent-ScrollTeleport = свиток телепортации
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
ent-ScrollSmite = свиток кары
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
ent-ScrollMindswap = свиток подмены сознания
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
|
||||
@@ -40,6 +40,9 @@ spellbook-recall-desc = { ent-ActionInstantRecallSpell.desc }
|
||||
spellbook-smite-name = { ent-ActionSmite }
|
||||
spellbook-smite-desc = { ent-ActionSmite.desc }
|
||||
|
||||
spellbook-mindswap-name = { ent-ActionMindswapSpell }
|
||||
spellbook-mindswap-desc = { ent-ActionMindswapSpell.desc }
|
||||
|
||||
spellbook-hardsuit-name = Скафандр волшебника
|
||||
spellbook-hardsuit-desc = Украшенный магическими драгоценными камнями скафандр, функционирующий так же, как и обычная мантия волшебника, но в то же время является пригодным для использования в космосе и бронированным. Небольшое замедление. Теперь вы можете произносить заклинания в космосе и местах с низкой температурой! Имеет функцию энергетического щита,который защищает от всех снарядов. Щит разряжается при получении урона и автоматически заряжается.
|
||||
|
||||
|
||||
@@ -42,3 +42,6 @@ ent-ActionKnock = Стук
|
||||
|
||||
ent-ActionSmite = Кара
|
||||
.desc = Заряжает вашу руку мерзкой энергией, которую можно использовать для взрыва жертв. Заклинание требует, чтобы вы коснулись своей цели, поэтому вы не сможете использовать его в наручниках или будучи оглушённым. Не работает без волшебной мантии и шляпы.
|
||||
|
||||
ent-ActionMindswapSpell = Подмена сознания
|
||||
.desc = Позволяет заклинателю переключаться между телами с целью. Вы должны быть рядом с целью, в которую хотите перейти, после чего вы оба будете нокаутированы. Не работает на культистов, генокрадов и революционеров.
|
||||
|
||||
@@ -685,17 +685,19 @@
|
||||
toggleable-clothing: !type:ContainerSlot
|
||||
- type: PowerCellSlot
|
||||
cellSlotId: cell_slot
|
||||
fitsInCharger: false
|
||||
- type: ItemSlots
|
||||
slots:
|
||||
cell_slot:
|
||||
name: power-cell-slot-component-slot-name-default
|
||||
startingItem: PowerCellMicroreactor
|
||||
disableEject: true
|
||||
whitelist:
|
||||
tags:
|
||||
- PowerCell
|
||||
- PowerCellSmall
|
||||
- type: EnergyDomeGenerator
|
||||
damageEnergyDraw: 5
|
||||
damageEnergyDraw: 20
|
||||
domePrototype: EnergyDomeSmallPink
|
||||
- type: ClothingSpeedModifier
|
||||
walkModifier: 0.9
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
description: This spell opens nearby doors.
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Magic
|
||||
requiresClothes: false
|
||||
- type: InstantAction
|
||||
useDelay: 8
|
||||
itemIconStyle: BigAction
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
name: Force
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Magic
|
||||
requiresClothes: false
|
||||
- type: WorldTargetAction
|
||||
itemIconStyle: BigAction
|
||||
useDelay: 60
|
||||
@@ -100,6 +102,8 @@
|
||||
name: Cards
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Magic
|
||||
requiresClothes: false
|
||||
- type: WorldTargetAction
|
||||
itemIconStyle: BigAction
|
||||
useDelay: 60
|
||||
@@ -167,6 +171,8 @@
|
||||
name: Blink
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Magic
|
||||
requiresClothes: false
|
||||
- type: InstantAction
|
||||
useDelay: 6
|
||||
itemIconStyle: BigAction
|
||||
@@ -216,6 +222,8 @@
|
||||
name: Cluwne Curse
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Magic
|
||||
requiresClothes: false
|
||||
- type: EntityTargetAction
|
||||
whitelist:
|
||||
components:
|
||||
@@ -235,6 +243,8 @@
|
||||
name: Banana Touch
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Magic
|
||||
requiresClothes: false
|
||||
- type: EntityTargetAction
|
||||
whitelist:
|
||||
components:
|
||||
@@ -254,6 +264,8 @@
|
||||
name: Mime Touch
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Magic
|
||||
requiresClothes: false
|
||||
- type: EntityTargetAction
|
||||
whitelist:
|
||||
components:
|
||||
@@ -273,6 +285,8 @@
|
||||
name: Instant Recall
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Magic
|
||||
requiresClothes: false
|
||||
- type: InstantRecall
|
||||
- type: InstantAction
|
||||
useDelay: 10
|
||||
@@ -288,6 +302,8 @@
|
||||
name: Teleport
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Magic
|
||||
requiresClothes: false
|
||||
- type: InstantAction
|
||||
checkCanInteract: false
|
||||
useDelay: 60
|
||||
@@ -297,3 +313,25 @@
|
||||
state: teleport
|
||||
event: !type:TeleportSpellEvent
|
||||
speech: "SCYAR FIDE!"
|
||||
|
||||
- type: entity
|
||||
id: ActionMindswapSpell
|
||||
name: Mindswap
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Magic
|
||||
requiresClothes: false
|
||||
- type: EntityTargetAction
|
||||
whitelist:
|
||||
components:
|
||||
- MindContainer
|
||||
- ActionContainer
|
||||
canTargetSelf: false
|
||||
checkCanInteract: false
|
||||
useDelay: 60
|
||||
itemIconStyle: BigAction
|
||||
icon:
|
||||
sprite: Objects/Magic/magicactions.rsi
|
||||
state: mindswap
|
||||
event: !type:MindswapSpellEvent
|
||||
speech: "GIN'YU CAPAN!"
|
||||
|
||||
@@ -151,3 +151,12 @@
|
||||
- type: Scroll
|
||||
actionId: ActionSmite
|
||||
learnPopup: scroll-component-smite
|
||||
|
||||
- type: entity
|
||||
id: ScrollMindswap
|
||||
parent: BaseScroll
|
||||
name: "Mindswap scroll"
|
||||
components:
|
||||
- type: Scroll
|
||||
actionId: ActionMindswapSpell
|
||||
learnPopup: scroll-component-mindswap
|
||||
|
||||
@@ -222,13 +222,29 @@
|
||||
- !type:ListingLimitedStockCondition
|
||||
stock: 1
|
||||
|
||||
- type: listing
|
||||
id: SpellBookMindswap
|
||||
name: spellbook-mindswap-name
|
||||
description: spellbook-mindswap-desc
|
||||
productEntity: ScrollMindswap
|
||||
icon:
|
||||
sprite: Objects/Magic/magicactions.rsi
|
||||
state: mindswap
|
||||
cost:
|
||||
SpellPoint: 2
|
||||
categories:
|
||||
- UtilitySpells
|
||||
conditions:
|
||||
- !type:ListingLimitedStockCondition
|
||||
stock: 1
|
||||
|
||||
- type: listing
|
||||
id: SpellBookHardsuit
|
||||
name: spellbook-hardsuit-name
|
||||
description: spellbook-hardsuit-desc
|
||||
productEntity: ClothingOuterHardsuitWizard
|
||||
cost:
|
||||
SpellPoint: 4
|
||||
SpellPoint: 5
|
||||
categories:
|
||||
- MagicItems
|
||||
conditions:
|
||||
|
||||
@@ -57,6 +57,9 @@
|
||||
},
|
||||
{
|
||||
"name": "icebeam_active"
|
||||
},
|
||||
{
|
||||
"name": "mindswap"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
BIN
Resources/Textures/Objects/Magic/magicactions.rsi/mindswap.png
Normal file
BIN
Resources/Textures/Objects/Magic/magicactions.rsi/mindswap.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 600 B |
Reference in New Issue
Block a user