Magic 3 (#340)
* - add: Some tweaks and localization. * - add: Teleport spell. * - tweak: Tweak wizard hardsuit. * - add: Turn off shield on cast. * - add: New wizard clothes & update wizard shuttle, * - remove: Remove old clothes from shuttle. * - fix: No teleporting to centcomm.
@@ -0,0 +1,39 @@
|
||||
using System.Linq;
|
||||
using Content.Client._White.Cult.UI.TeleportRunesList;
|
||||
using Content.Client.Eui;
|
||||
using Content.Shared._White.Wizard.Teleport;
|
||||
using Content.Shared.Eui;
|
||||
using JetBrains.Annotations;
|
||||
|
||||
namespace Content.Client._White.Wizard.TeleportSpell;
|
||||
|
||||
[UsedImplicitly]
|
||||
public sealed class TeleportSpellEui : BaseEui
|
||||
{
|
||||
private readonly TeleportRunesListWindow _window = new();
|
||||
|
||||
public override void Opened()
|
||||
{
|
||||
_window.OpenCentered();
|
||||
_window.ItemSelected +=
|
||||
(index, _) => SendMessage(new TeleportSpellTargetLocationSelected {LocationUid = index});
|
||||
_window.OnClose += () => SendMessage(new CloseEuiMessage());
|
||||
|
||||
base.Opened();
|
||||
}
|
||||
|
||||
public override void Closed()
|
||||
{
|
||||
base.Closed();
|
||||
_window.Close();
|
||||
}
|
||||
|
||||
public override void HandleState(EuiStateBase state)
|
||||
{
|
||||
if (state is not TeleportSpellEuiState cast)
|
||||
return;
|
||||
|
||||
_window.Clear();
|
||||
_window.PopulateList(cast.Locations.Keys.ToList(), cast.Locations.Values.ToList());
|
||||
}
|
||||
}
|
||||
@@ -3,10 +3,12 @@ using Content.Server.DeviceLinking.Systems;
|
||||
using Content.Server.Power.Components;
|
||||
using Content.Server.Power.EntitySystems;
|
||||
using Content.Server.PowerCell;
|
||||
using Content.Shared._White.Events;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.PowerCell;
|
||||
using Content.Shared.PowerCell.Components;
|
||||
@@ -53,10 +55,19 @@ public sealed partial class EnergyDomeSystem : EntitySystem
|
||||
|
||||
SubscribeLocalEvent<EnergyDomeGeneratorComponent, ComponentRemove>(OnComponentRemove);
|
||||
|
||||
SubscribeLocalEvent<EnergyDomeGeneratorComponent, InventoryRelayedEvent<EnergyDomeClothesTurnOffEvent>>(
|
||||
OnClothesTurnOff);
|
||||
|
||||
//Dome events
|
||||
SubscribeLocalEvent<EnergyDomeComponent, DamageChangedEvent>(OnDomeDamaged);
|
||||
}
|
||||
|
||||
private void OnClothesTurnOff(Entity<EnergyDomeGeneratorComponent> ent,
|
||||
ref InventoryRelayedEvent<EnergyDomeClothesTurnOffEvent> args)
|
||||
{
|
||||
TurnOff(ent, false);
|
||||
}
|
||||
|
||||
private void OnInit(Entity<EnergyDomeGeneratorComponent> generator, ref MapInitEvent args)
|
||||
{
|
||||
if (generator.Comp.CanDeviceNetworkUse)
|
||||
@@ -179,12 +190,11 @@ public sealed partial class EnergyDomeSystem : EntitySystem
|
||||
|
||||
if (HasComp<PowerCellDrawComponent>(generatorUid))
|
||||
{
|
||||
_powerCell.TryGetBatteryFromSlot(generatorUid, out var cell);
|
||||
if (cell != null)
|
||||
if (_powerCell.TryGetBatteryFromSlot(generatorUid, out var cell, out var batteryComp))
|
||||
{
|
||||
_battery.UseCharge(generatorUid, energyLeak);
|
||||
_battery.UseCharge(cell.Value, energyLeak, batteryComp);
|
||||
|
||||
if (cell.CurrentCharge == 0)
|
||||
if (batteryComp.CurrentCharge == 0)
|
||||
TurnOff((generatorUid, generatorComp), true);
|
||||
}
|
||||
}
|
||||
@@ -298,7 +308,7 @@ public sealed partial class EnergyDomeSystem : EntitySystem
|
||||
return;
|
||||
|
||||
generator.Comp.Enabled = false;
|
||||
QueueDel(generator.Comp.SpawnedDome);
|
||||
Del(generator.Comp.SpawnedDome);
|
||||
|
||||
_powerCell.SetPowerCellDrawEnabled(generator, false);
|
||||
if (TryComp<BatterySelfRechargerComponent>(generator, out var recharger))
|
||||
@@ -325,4 +335,4 @@ public sealed partial class EnergyDomeSystem : EntitySystem
|
||||
? container.Owner
|
||||
: entity;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,17 +3,21 @@ using System.Numerics;
|
||||
using Content.Server._White.IncorporealSystem;
|
||||
using Content.Server._White.Wizard.Magic.Amaterasu;
|
||||
using Content.Server._White.Wizard.Magic.Other;
|
||||
using Content.Server._White.Wizard.Teleport;
|
||||
using Content.Server.Abilities.Mime;
|
||||
using Content.Server.Administration.Commands;
|
||||
using Content.Server.Atmos.Components;
|
||||
using Content.Server.Atmos.EntitySystems;
|
||||
using Content.Server.Chat.Systems;
|
||||
using Content.Server.Emp;
|
||||
using Content.Server.EUI;
|
||||
using Content.Server.Lightning;
|
||||
using Content.Server.Magic;
|
||||
using Content.Server.Singularity.EntitySystems;
|
||||
using Content.Server.Standing;
|
||||
using Content.Server.Weapons.Ranged.Systems;
|
||||
using Content.Shared._White.BetrayalDagger;
|
||||
using Content.Shared._White.Events;
|
||||
using Content.Shared._White.Wizard;
|
||||
using Content.Shared._White.Wizard.Magic;
|
||||
using Content.Shared.Actions;
|
||||
@@ -36,6 +40,7 @@ using Content.Shared.Throwing;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Physics.Components;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Random;
|
||||
|
||||
namespace Content.Server._White.Wizard.Magic;
|
||||
@@ -64,6 +69,8 @@ public sealed class WizardSpellsSystem : EntitySystem
|
||||
[Dependency] private readonly EmpSystem _empSystem = default!;
|
||||
[Dependency] private readonly SharedActionsSystem _actions = default!;
|
||||
[Dependency] private readonly StandingStateSystem _standing = default!;
|
||||
[Dependency] private readonly TelefragSystem _telefrag = default!;
|
||||
[Dependency] private readonly EuiManager _euiManager = default!;
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -71,6 +78,7 @@ public sealed class WizardSpellsSystem : EntitySystem
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<TeleportSpellEvent>(OnTeleportSpell);
|
||||
SubscribeLocalEvent<InstantRecallSpellEvent>(OnInstantRecallSpell);
|
||||
SubscribeLocalEvent<MimeTouchSpellEvent>(OnMimeTouchSpell);
|
||||
SubscribeLocalEvent<BananaTouchSpellEvent>(OnBananaTouchSpell);
|
||||
@@ -87,6 +95,26 @@ public sealed class WizardSpellsSystem : EntitySystem
|
||||
SubscribeLocalEvent<MagicComponent, BeforeCastSpellEvent>(OnBeforeCastSpell);
|
||||
}
|
||||
|
||||
#region Teleport
|
||||
|
||||
private void OnTeleportSpell(TeleportSpellEvent msg)
|
||||
{
|
||||
if (!CanCast(msg))
|
||||
return;
|
||||
|
||||
if (!TryComp(msg.Performer, out ActorComponent? actor))
|
||||
return;
|
||||
|
||||
var eui = new TeleportSpellEui(msg.Performer);
|
||||
_euiManager.OpenEui(eui, actor.PlayerSession);
|
||||
eui.StateDirty();
|
||||
|
||||
msg.Handled = true;
|
||||
Speak(msg);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Instant Recall
|
||||
|
||||
private void OnInstantRecallSpell(InstantRecallSpellEvent msg)
|
||||
@@ -289,6 +317,7 @@ public sealed class WizardSpellsSystem : EntitySystem
|
||||
if (!foundTeleportPos)
|
||||
return;
|
||||
|
||||
_telefrag.Telefrag(coords, msg.Performer);
|
||||
_transformSystem.SetCoordinates(msg.Performer, coords);
|
||||
_transformSystem.AttachToGridOrMap(msg.Performer);
|
||||
|
||||
@@ -404,6 +433,8 @@ public sealed class WizardSpellsSystem : EntitySystem
|
||||
|
||||
private void CardsSpellDefault(CardsSpellEvent msg)
|
||||
{
|
||||
TurnOffShield(msg.Performer);
|
||||
|
||||
var xform = Transform(msg.Performer);
|
||||
|
||||
for (var i = 0; i < 10; i++)
|
||||
@@ -428,6 +459,8 @@ public sealed class WizardSpellsSystem : EntitySystem
|
||||
|
||||
private void CardsSpellCharge(CardsSpellEvent msg)
|
||||
{
|
||||
TurnOffShield(msg.Performer);
|
||||
|
||||
var xform = Transform(msg.Performer);
|
||||
|
||||
var count = 10 + 10 * msg.ChargeLevel;
|
||||
@@ -466,6 +499,7 @@ public sealed class WizardSpellsSystem : EntitySystem
|
||||
Del(msg.TargetUid);
|
||||
var item = Spawn(msg.Prototype);
|
||||
_handsSystem.TryPickupAnyHand(msg.Performer, item);
|
||||
TurnOffShield(msg.Performer);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -504,6 +538,8 @@ public sealed class WizardSpellsSystem : EntitySystem
|
||||
|
||||
private void FireballSpellDefault(FireballSpellEvent msg)
|
||||
{
|
||||
TurnOffShield(msg.Performer);
|
||||
|
||||
var xform = Transform(msg.Performer);
|
||||
|
||||
foreach (var pos in _magicSystem.GetSpawnPositions(xform, msg.Pos))
|
||||
@@ -662,12 +698,14 @@ public sealed class WizardSpellsSystem : EntitySystem
|
||||
|
||||
private void ArcSpellCharge(ArcSpellEvent msg)
|
||||
{
|
||||
_lightning.ShootRandomLightnings(msg.Performer, 2f * msg.ChargeLevel, msg.ChargeLevel * 2, "WizardLightning", 1,
|
||||
_lightning.ShootRandomLightnings(msg.Performer, 1.5f * msg.ChargeLevel, msg.ChargeLevel * 2, "WizardLightning", 2,
|
||||
caster: msg.Performer);
|
||||
}
|
||||
|
||||
private void ArcSpellAlt(ArcSpellEvent msg)
|
||||
{
|
||||
TurnOffShield(msg.Performer);
|
||||
|
||||
var xform = Transform(msg.Performer);
|
||||
|
||||
foreach (var pos in _magicSystem.GetSpawnPositions(xform, msg.Pos))
|
||||
@@ -693,6 +731,11 @@ public sealed class WizardSpellsSystem : EntitySystem
|
||||
|
||||
#region Helpers
|
||||
|
||||
private void TurnOffShield(EntityUid uid)
|
||||
{
|
||||
RaiseLocalEvent(uid, new EnergyDomeClothesTurnOffEvent());
|
||||
}
|
||||
|
||||
private bool CanCast(BaseActionEvent msg)
|
||||
{
|
||||
return !msg.Handled && CheckRequirements(msg.Action, msg.Performer) &&
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Content.Server._White.Wizard.Teleport;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class SpawnTeleportLocationComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace Content.Server._White.Wizard.Teleport;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class TeleportLocationComponent : Component
|
||||
{
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public string Location = string.Empty;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using Content.Server.Pinpointer;
|
||||
using Content.Server.Warps;
|
||||
|
||||
namespace Content.Server._White.Wizard.Teleport;
|
||||
|
||||
public sealed class TeleportLocationSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<SpawnTeleportLocationComponent, MapInitEvent>(OnMapInit,
|
||||
after: new[] {typeof(NavMapSystem)});
|
||||
}
|
||||
|
||||
private void OnMapInit(Entity<SpawnTeleportLocationComponent> ent, ref MapInitEvent args)
|
||||
{
|
||||
if (!TryComp(ent, out WarpPointComponent? warpPoint) || warpPoint.Location == null)
|
||||
return;
|
||||
|
||||
var newEnt = Spawn(null, Transform(ent).Coordinates);
|
||||
var xForm = EnsureComp<TransformComponent>(newEnt);
|
||||
_transformSystem.AttachToGridOrMap(newEnt, xForm);
|
||||
var location = EnsureComp<TeleportLocationComponent>(newEnt);
|
||||
location.Location = warpPoint.Location;
|
||||
}
|
||||
}
|
||||
102
Content.Server/_White/Wizard/Teleport/TeleportSpellEui.cs
Normal file
@@ -0,0 +1,102 @@
|
||||
using System.Linq;
|
||||
using Content.Server.EUI;
|
||||
using Content.Server.Popups;
|
||||
using Content.Server.Station.Systems;
|
||||
using Content.Shared._White.Wizard.Teleport;
|
||||
using Content.Shared.Eui;
|
||||
using Robust.Shared.Timing;
|
||||
using TeleportSpellEuiState = Content.Shared._White.Wizard.Teleport.TeleportSpellEuiState;
|
||||
|
||||
namespace Content.Server._White.Wizard.Teleport;
|
||||
|
||||
public sealed class TeleportSpellEui : BaseEui
|
||||
{
|
||||
[Dependency] private readonly EntityManager _entityManager = default!;
|
||||
private readonly SharedTransformSystem _transformSystem;
|
||||
private readonly StationSystem _station;
|
||||
private readonly PopupSystem _popupSystem;
|
||||
|
||||
private readonly EntityUid _performer;
|
||||
|
||||
private bool _used;
|
||||
|
||||
public TeleportSpellEui(EntityUid performer)
|
||||
{
|
||||
IoCManager.InjectDependencies(this);
|
||||
|
||||
_transformSystem = _entityManager.System<SharedTransformSystem>();
|
||||
_station = _entityManager.System<StationSystem>();
|
||||
_popupSystem = _entityManager.System<PopupSystem>();
|
||||
|
||||
_performer = performer;
|
||||
|
||||
Timer.Spawn(TimeSpan.FromSeconds(10), Close);
|
||||
}
|
||||
|
||||
public override EuiStateBase GetNewState()
|
||||
{
|
||||
var locationQuery = _entityManager.EntityQueryEnumerator<TeleportLocationComponent, TransformComponent>();
|
||||
var state = new TeleportSpellEuiState();
|
||||
|
||||
while (locationQuery.MoveNext(out var locationUid, out var locationComponent, out var transformComponent))
|
||||
{
|
||||
var station = _station.GetOwningStation(locationUid, transformComponent);
|
||||
if (_entityManager.EntityQuery<WizardRuleComponent>(true)
|
||||
.Any(wizardRule => wizardRule.TargetStation == station))
|
||||
{
|
||||
state.Locations.Add((int) locationUid, locationComponent.Location);
|
||||
}
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
public override void HandleMessage(EuiMessageBase msg)
|
||||
{
|
||||
base.HandleMessage(msg);
|
||||
|
||||
if (_used)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (msg is not TeleportSpellTargetLocationSelected cast)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var transform = _entityManager.GetComponent<TransformComponent>(_performer);
|
||||
var oldCoords = transform.Coordinates;
|
||||
|
||||
TransformComponent? locationTransform = null;
|
||||
|
||||
var teleportLocationQuery = _entityManager
|
||||
.EntityQueryEnumerator<TeleportLocationComponent, TransformComponent>();
|
||||
while (teleportLocationQuery.MoveNext(out var locationUid, out _, out var transformComponent))
|
||||
{
|
||||
if (locationUid == new EntityUid(cast.LocationUid))
|
||||
{
|
||||
locationTransform = transformComponent;
|
||||
}
|
||||
}
|
||||
|
||||
if (locationTransform is null)
|
||||
{
|
||||
_popupSystem.PopupEntity("Can't teleport", _performer, _performer);
|
||||
DoStateUpdate();
|
||||
return;
|
||||
}
|
||||
|
||||
_used = true;
|
||||
|
||||
var coords = locationTransform.Coordinates;
|
||||
|
||||
_transformSystem.SetCoordinates(_performer, coords);
|
||||
_transformSystem.AttachToGridOrMap(_performer, transform);
|
||||
|
||||
_entityManager.SpawnEntity("AdminInstantEffectSmoke10", oldCoords);
|
||||
_entityManager.SpawnEntity("AdminInstantEffectSmoke10", coords);
|
||||
|
||||
Close();
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,7 @@ public sealed partial class WizardRuleComponent : Component
|
||||
{
|
||||
public readonly List<EntityUid> WizardMinds = new();
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public EntityUid? TargetStation;
|
||||
|
||||
[DataField("minPlayers")]
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using Content.Shared._White.Events;
|
||||
using Content.Shared._White.StaminaProtection;
|
||||
using Content.Shared.Changeling;
|
||||
using Content.Shared.Chemistry;
|
||||
@@ -32,6 +33,7 @@ public partial class InventorySystem
|
||||
SubscribeLocalEvent<InventoryComponent, StaminaDamageModifyEvent>(RelayInventoryEvent); // WD
|
||||
SubscribeLocalEvent<InventoryComponent, ChemRegenModifyEvent>(RelayInventoryEvent); // WD
|
||||
SubscribeLocalEvent<InventoryComponent, ChangelingRefundEvent>(RelayInventoryEvent); // WD
|
||||
SubscribeLocalEvent<InventoryComponent, EnergyDomeClothesTurnOffEvent>(RelayInventoryEvent); // WD
|
||||
SubscribeLocalEvent<InventoryComponent, GetDefaultRadioChannelEvent>(RelayInventoryEvent);
|
||||
|
||||
// by-ref events
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
using Content.Shared.Inventory;
|
||||
|
||||
namespace Content.Shared._White.Events;
|
||||
|
||||
public sealed class EnergyDomeClothesTurnOffEvent : EntityEventArgs, IInventoryRelayEvent
|
||||
{
|
||||
public SlotFlags TargetSlots => SlotFlags.OUTERCLOTHING;
|
||||
}
|
||||
@@ -38,7 +38,8 @@ public abstract class SharedScrollSystem : EntitySystem
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.LearnTime, new ScrollDoAfterEvent(), uid, target: uid)
|
||||
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.LearnTime, new ScrollDoAfterEvent(),
|
||||
uid, target: uid)
|
||||
{
|
||||
BreakOnMove = true,
|
||||
BreakOnDamage = true,
|
||||
@@ -50,7 +51,9 @@ public abstract class SharedScrollSystem : EntitySystem
|
||||
_audioSystem.PlayPvs(component.UseSound, args.User);
|
||||
}
|
||||
|
||||
_popupSystem.PopupClient($"You start learning about {component.LearnPopup}.", args.User, args.User, PopupType.Medium);
|
||||
_popupSystem.PopupClient(
|
||||
Loc.GetString("scroll-component-start", ("subject", Loc.GetString(component.LearnPopup))), args.User,
|
||||
args.User, PopupType.Medium);
|
||||
|
||||
_doAfterSystem.TryStartDoAfter(doAfterEventArgs);
|
||||
|
||||
@@ -69,7 +72,9 @@ public abstract class SharedScrollSystem : EntitySystem
|
||||
_audioSystem.PlayEntity(component.AfterUseSound, args.User, args.User);
|
||||
}
|
||||
|
||||
_popupSystem.PopupClient($"You learned much about {component.LearnPopup}. The scroll is slowly burning in your hands.", args.User, args.User, PopupType.Medium);
|
||||
_popupSystem.PopupClient(
|
||||
Loc.GetString("scroll-component-end", ("subject", Loc.GetString(component.LearnPopup))), args.User,
|
||||
args.User, PopupType.Medium);
|
||||
|
||||
BurnScroll(uid);
|
||||
|
||||
@@ -80,7 +85,7 @@ public abstract class SharedScrollSystem : EntitySystem
|
||||
|
||||
#region Helpers
|
||||
|
||||
protected virtual void BurnScroll(EntityUid uid) {}
|
||||
protected virtual void BurnScroll(EntityUid uid) { }
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
using Content.Shared.Eui;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared._White.Wizard.Teleport;
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class TeleportSpellEuiState : EuiStateBase
|
||||
{
|
||||
public Dictionary<int, string> Locations = new();
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class TeleportSpellTargetLocationSelected : EuiMessageBase
|
||||
{
|
||||
public int LocationUid;
|
||||
}
|
||||
@@ -172,4 +172,10 @@ public sealed partial class InstantRecallSpellEvent : InstantActionEvent, ISpeak
|
||||
public string? Speech { get; private set; }
|
||||
}
|
||||
|
||||
public sealed partial class TeleportSpellEvent : InstantActionEvent, ISpeakSpell
|
||||
{
|
||||
[DataField("speech")]
|
||||
public string? Speech { get; private set; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
48
Resources/Locale/ru-RU/_white/wizard/scrolls.ftl
Normal file
@@ -0,0 +1,48 @@
|
||||
scroll-component-start = Вы начинаете изучать { $subject }.
|
||||
scroll-component-end = Вы изучили { $subject }. Свиток медленно сгорает в ваших руках.
|
||||
|
||||
scroll-component-fireball = огненный шар
|
||||
scroll-component-forcewall = силовую стену
|
||||
scroll-component-knock = тук-тук
|
||||
scroll-component-lightning = молнию
|
||||
scroll-component-force = силу
|
||||
scroll-component-cards = карты
|
||||
scroll-component-blink = прыжок
|
||||
scroll-component-jaunt = потустороннее путешествие
|
||||
scroll-component-emp = ЭМИ
|
||||
scroll-component-cluwne = проклятье
|
||||
scroll-component-clown = бананы
|
||||
scroll-component-silence = тишину
|
||||
scroll-component-recall = призыв
|
||||
scroll-component-teleport = телепортацию
|
||||
|
||||
ent-BaseScroll = магический свиток
|
||||
.desc = Этот древний пергамент, ставший реликвией в арканных преданиях, хранит в себе бесчисленные мистические заклятия и забытые заклинания.
|
||||
ent-ScrollFireball = свиток огненного шара
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
ent-ScrollForcewall = свиток силовой стены
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
ent-ScrollKnock = свиток стука
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
ent-ScrollArc = свиток молнии
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
ent-ScrollForce = свиток силы
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
ent-ScrollCards = свиток карт
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
ent-ScrollBlink = свиток прыжка
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
ent-ScrollEtherealJaunt = свиток потустороннего путешествия
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
ent-ScrollEmp = свиток ЭМИ
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
ent-ScrollCluwneCurse = свиток проклятия клувна
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
ent-ScrollBananaTouch = свиток бананового касания
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
ent-ScrollMimeTouch = свиток касания мима
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
ent-ScrollInstantRecall = свиток мгновенного призыва
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
ent-ScrollTeleport = свиток телепортации
|
||||
.desc = { ent-BaseScroll.desc }
|
||||
@@ -11,9 +11,12 @@ roles-antag-wizard-objective = Устройте хаос на станции
|
||||
|
||||
wizard-round-end-agent-name = космический волшебник
|
||||
|
||||
wizard-welcome = Вы - космический волшебник. Федерация Космических Волшебников отправила вас на станцию {$station}, дабы посеять хаос. Не разочаруйте их.
|
||||
wizard-welcome = Вы - космический волшебник. Федерация Космических Волшебников отправила вас на станцию {$station}, дабы посеять хаос. Вы можете попасть на станцию с помощью гиперпрыжка или с помощью магии телепортации.
|
||||
|
||||
wizard-no-more-threat-announcement-shuttle-call = Судя по данным наших датчиков дальнего действия, магическая угроза была устранена. Эвакуационный шаттл скоро прибудет. Время прибытия: {$time} {$units}. Вы можете отозвать его, чтобы продлить смену.
|
||||
wizard-no-more-threat-announcement = Судя по данным наших датчиков дальнего действия, магическая угроза была устранена. Шаттл уже вызван.
|
||||
|
||||
magic-component-missing-req = Недостающие требования! Вам необходимо надеть мантию и шляпу!
|
||||
|
||||
ent-WizardSurviveObjective = Переживете смену, устроив как можно больше хаоса.
|
||||
.desc = Федерация Космических Волшебников отправила вас на станцию Nanotrasen, чтобы навести там смуту. Не разочаруйте их.
|
||||
@@ -671,10 +671,10 @@
|
||||
coefficients:
|
||||
Blunt: 0.6
|
||||
Slash: 0.6
|
||||
Piercing: 0.4
|
||||
Heat: 0.25
|
||||
Piercing: 0.6
|
||||
Heat: 0.6
|
||||
Radiation: 0.25
|
||||
Caustic: 0.75
|
||||
Caustic: 0.25
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingHeadHelmetHardsuitWizard
|
||||
- type: ContainerContainer
|
||||
@@ -693,11 +693,11 @@
|
||||
- PowerCell
|
||||
- PowerCellSmall
|
||||
- type: EnergyDomeGenerator
|
||||
damageEnergyDraw: 3
|
||||
damageEnergyDraw: 5
|
||||
domePrototype: EnergyDomeSmallPink
|
||||
- type: ClothingSpeedModifier
|
||||
walkModifier: 1
|
||||
sprintModifier: 1
|
||||
walkModifier: 0.9
|
||||
sprintModifier: 0.9
|
||||
- type: PowerCellDraw
|
||||
drawRate: 8
|
||||
useRate: 0
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
name: warp point
|
||||
components:
|
||||
- type: WarpPoint
|
||||
- type: SpawnTeleportLocation
|
||||
- type: Sprite
|
||||
state: pink
|
||||
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
defaultText: station-beacon-general
|
||||
color: "#D4D4D496"
|
||||
- type: WarpPoint
|
||||
- type: SpawnTeleportLocation
|
||||
- type: GiftIgnore
|
||||
- type: ActivatableUI
|
||||
key: enum.NavMapBeaconUiKey.Key
|
||||
singleUser: true
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
- type: VariableUseDelay
|
||||
useDelay: 6
|
||||
altUseDelay: 12
|
||||
chargeUseDelay: 40
|
||||
chargeUseDelay: 30
|
||||
|
||||
- type: entity
|
||||
id: ActionForceSpell
|
||||
@@ -62,7 +62,7 @@
|
||||
- type: VariableUseDelay
|
||||
useDelay: 6
|
||||
altUseDelay: 2
|
||||
chargeUseDelay: 20
|
||||
chargeUseDelay: 30
|
||||
|
||||
- type: entity
|
||||
id: ActionFireballSpell
|
||||
@@ -93,7 +93,7 @@
|
||||
- type: VariableUseDelay
|
||||
useDelay: 5
|
||||
altUseDelay: 10
|
||||
chargeUseDelay: 40
|
||||
chargeUseDelay: 30
|
||||
|
||||
- type: entity
|
||||
id: ActionCardSpell
|
||||
@@ -126,7 +126,7 @@
|
||||
- type: VariableUseDelay
|
||||
useDelay: 4
|
||||
altUseDelay: 1
|
||||
chargeUseDelay: 40
|
||||
chargeUseDelay: 30
|
||||
|
||||
- type: entity
|
||||
id: ActionForcewallSpell
|
||||
@@ -160,7 +160,7 @@
|
||||
- type: VariableUseDelay
|
||||
useDelay: 10
|
||||
altUseDelay: 20
|
||||
chargeUseDelay: 60
|
||||
chargeUseDelay: 50
|
||||
|
||||
- type: entity
|
||||
id: ActionBlinkSpell
|
||||
@@ -272,3 +272,20 @@
|
||||
sprite: Objects/Magic/magicactions.rsi
|
||||
state: summons
|
||||
event: !type:InstantRecallSpellEvent
|
||||
|
||||
- type: entity
|
||||
id: ActionTeleportSpell
|
||||
name: Teleport
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Magic
|
||||
requiresClothes: true
|
||||
- type: InstantAction
|
||||
checkCanInteract: false
|
||||
useDelay: 60
|
||||
itemIconStyle: BigAction
|
||||
icon:
|
||||
sprite: Objects/Magic/magicactions.rsi
|
||||
state: teleport
|
||||
event: !type:TeleportSpellEvent
|
||||
speech: "SCYAR FIDE!"
|
||||
|
||||
@@ -33,3 +33,33 @@
|
||||
id: ClothingOuterRealWizardViolet
|
||||
components:
|
||||
- type: WizardClothes
|
||||
|
||||
- type: entity
|
||||
parent: ClothingHeadHatWizard
|
||||
id: ClothingHeadHatRealWizardFancy
|
||||
components:
|
||||
- type: WizardClothes
|
||||
- type: Sprite
|
||||
sprite: White/Clothing/Head/wizhat.rsi
|
||||
- type: Clothing
|
||||
sprite: White/Clothing/Head/wizhat.rsi
|
||||
|
||||
- type: entity
|
||||
parent: ClothingHeadHatWizard
|
||||
id: ClothingHeadHatRealWizardFancyAlt
|
||||
components:
|
||||
- type: WizardClothes
|
||||
- type: Sprite
|
||||
sprite: White/Clothing/Head/wizhat-alt.rsi
|
||||
- type: Clothing
|
||||
sprite: White/Clothing/Head/wizhat-alt.rsi
|
||||
|
||||
- type: entity
|
||||
parent: ClothingOuterWizard
|
||||
id: ClothingOuterRealWizardFancy
|
||||
components:
|
||||
- type: WizardClothes
|
||||
- type: Sprite
|
||||
sprite: White/Clothing/OuterClothing/robe.rsi
|
||||
- type: Clothing
|
||||
sprite: White/Clothing/OuterClothing/robe.rsi
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
components:
|
||||
- type: Scroll
|
||||
actionId: ActionFireballSpell
|
||||
learnPopup: fireball
|
||||
learnPopup: scroll-component-fireball
|
||||
|
||||
- type: entity
|
||||
id: ScrollForcewall
|
||||
@@ -33,7 +33,7 @@
|
||||
components:
|
||||
- type: Scroll
|
||||
actionId: ActionForcewallSpell
|
||||
learnPopup: forcewall
|
||||
learnPopup: scroll-component-forcewall
|
||||
|
||||
- type: entity
|
||||
id: ScrollKnock
|
||||
@@ -42,7 +42,7 @@
|
||||
components:
|
||||
- type: Scroll
|
||||
actionId: ActionKnock
|
||||
learnPopup: knock-knock
|
||||
learnPopup: scroll-component-knock
|
||||
|
||||
- type: entity
|
||||
id: ScrollArc
|
||||
@@ -51,7 +51,7 @@
|
||||
components:
|
||||
- type: Scroll
|
||||
actionId: ActionElectricArcSpell
|
||||
learnPopup: lightning
|
||||
learnPopup: scroll-component-lightning
|
||||
|
||||
- type: entity
|
||||
id: ScrollForce
|
||||
@@ -60,7 +60,7 @@
|
||||
components:
|
||||
- type: Scroll
|
||||
actionId: ActionForceSpell
|
||||
learnPopup: force
|
||||
learnPopup: scroll-component-force
|
||||
|
||||
- type: entity
|
||||
id: ScrollCards
|
||||
@@ -69,7 +69,7 @@
|
||||
components:
|
||||
- type: Scroll
|
||||
actionId: ActionCardSpell
|
||||
learnPopup: cards
|
||||
learnPopup: scroll-component-cards
|
||||
|
||||
- type: entity
|
||||
id: ScrollBlink
|
||||
@@ -78,7 +78,7 @@
|
||||
components:
|
||||
- type: Scroll
|
||||
actionId: ActionBlinkSpell
|
||||
learnPopup: blink
|
||||
learnPopup: scroll-component-blink
|
||||
|
||||
- type: entity
|
||||
id: ScrollEtherealJaunt
|
||||
@@ -87,7 +87,7 @@
|
||||
components:
|
||||
- type: Scroll
|
||||
actionId: ActionEtherealJauntSpell
|
||||
learnPopup: jaunt
|
||||
learnPopup: scroll-component-jaunt
|
||||
|
||||
- type: entity
|
||||
id: ScrollEmp
|
||||
@@ -96,7 +96,7 @@
|
||||
components:
|
||||
- type: Scroll
|
||||
actionId: ActionEmpSpell
|
||||
learnPopup: emp
|
||||
learnPopup: scroll-component-emp
|
||||
|
||||
- type: entity
|
||||
id: ScrollCluwneCurse
|
||||
@@ -105,7 +105,7 @@
|
||||
components:
|
||||
- type: Scroll
|
||||
actionId: ActionCluwneCurseSpell
|
||||
learnPopup: curse
|
||||
learnPopup: scroll-component-cluwne
|
||||
|
||||
- type: entity
|
||||
id: ScrollBananaTouch
|
||||
@@ -114,7 +114,7 @@
|
||||
components:
|
||||
- type: Scroll
|
||||
actionId: ActionBananaTouchSpell
|
||||
learnPopup: banana
|
||||
learnPopup: scroll-component-clown
|
||||
|
||||
- type: entity
|
||||
id: ScrollMimeTouch
|
||||
@@ -123,7 +123,7 @@
|
||||
components:
|
||||
- type: Scroll
|
||||
actionId: ActionMimeTouchSpell
|
||||
learnPopup: silence
|
||||
learnPopup: scroll-component-silence
|
||||
|
||||
- type: entity
|
||||
id: ScrollInstantRecall
|
||||
@@ -132,4 +132,13 @@
|
||||
components:
|
||||
- type: Scroll
|
||||
actionId: ActionInstantRecallSpell
|
||||
learnPopup: recall
|
||||
learnPopup: scroll-component-recall
|
||||
|
||||
- type: entity
|
||||
id: ScrollTeleport
|
||||
parent: BaseScroll
|
||||
name: "Teleport scroll"
|
||||
components:
|
||||
- type: Scroll
|
||||
actionId: ActionTeleportSpell
|
||||
learnPopup: scroll-component-teleport
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
equipment:
|
||||
jumpsuit: ClothingUniformJumpsuitColorDarkBlue
|
||||
back: ClothingBackpackFilled
|
||||
head: ClothingHeadHatRealWizardBlue
|
||||
outerClothing: ClothingOuterRealWizardBlue
|
||||
head: ClothingHeadHatRealWizardFancy
|
||||
outerClothing: ClothingOuterRealWizardFancy
|
||||
shoes: ClothingShoesWizard
|
||||
innerClothingSkirt: ClothingUniformJumpskirtColorDarkBlue
|
||||
satchel: ClothingBackpackSatchelFilled
|
||||
|
||||
@@ -51,6 +51,9 @@
|
||||
},
|
||||
{
|
||||
"name": "summons"
|
||||
},
|
||||
{
|
||||
"name": "teleport"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
BIN
Resources/Textures/Objects/Magic/magicactions.rsi/teleport.png
Normal file
|
After Width: | Height: | Size: 236 B |
|
After Width: | Height: | Size: 775 B |
BIN
Resources/Textures/White/Clothing/Head/wizhat-alt.rsi/icon.png
Normal file
|
After Width: | Height: | Size: 533 B |
|
After Width: | Height: | Size: 809 B |
|
After Width: | Height: | Size: 846 B |
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "White Dream",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon"
|
||||
},
|
||||
{
|
||||
"name": "equipped-HELMET",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "inhand-left",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "inhand-right",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 881 B |
BIN
Resources/Textures/White/Clothing/Head/wizhat.rsi/icon 2.png
Normal file
|
After Width: | Height: | Size: 506 B |
BIN
Resources/Textures/White/Clothing/Head/wizhat.rsi/icon.png
Normal file
|
After Width: | Height: | Size: 643 B |
|
After Width: | Height: | Size: 795 B |
|
After Width: | Height: | Size: 792 B |
27
Resources/Textures/White/Clothing/Head/wizhat.rsi/meta.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "White Dream",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon"
|
||||
},
|
||||
{
|
||||
"name": "equipped-HELMET",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "inhand-left",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "inhand-right",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 880 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "White Dream",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon"
|
||||
},
|
||||
{
|
||||
"name": "equipped-OUTERCLOTHING",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "equipped-OUTERCLOTHING-body-slim",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "inhand-left",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "inhand-right",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||