diff --git a/Content.Client/ContextMenu/UI/ContextMenuUIController.cs b/Content.Client/ContextMenu/UI/ContextMenuUIController.cs
index 5b156644a7..9d5005e9e8 100644
--- a/Content.Client/ContextMenu/UI/ContextMenuUIController.cs
+++ b/Content.Client/ContextMenu/UI/ContextMenuUIController.cs
@@ -2,6 +2,7 @@ using System.Numerics;
using System.Threading;
using Content.Client.CombatMode;
using Content.Client.Gameplay;
+using Content.Client.UserInterface.Systems.Actions;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controllers;
using Timer = Robust.Shared.Timing.Timer;
@@ -16,7 +17,7 @@ namespace Content.Client.ContextMenu.UI
///
/// This largely involves setting up timers to open and close sub-menus when hovering over other menu elements.
///
- public sealed class ContextMenuUIController : UIController, IOnStateEntered, IOnStateExited, IOnSystemChanged
+ public sealed class ContextMenuUIController : UIController, IOnStateEntered, IOnStateExited, IOnSystemChanged, IOnSystemChanged
{
public static readonly TimeSpan HoverDelay = TimeSpan.FromSeconds(0.2);
@@ -216,6 +217,12 @@ namespace Content.Client.ContextMenu.UI
Close();
}
+ private void OnChargingUpdated(bool charging)
+ {
+ if (charging)
+ Close();
+ }
+
public void OnSystemLoaded(CombatModeSystem system)
{
system.LocalPlayerCombatModeUpdated += OnCombatModeUpdated;
@@ -225,5 +232,15 @@ namespace Content.Client.ContextMenu.UI
{
system.LocalPlayerCombatModeUpdated -= OnCombatModeUpdated;
}
+
+ public void OnSystemLoaded(ChargeActionSystem system)
+ {
+ system.ChargingUpdated += OnChargingUpdated;
+ }
+
+ public void OnSystemUnloaded(ChargeActionSystem system)
+ {
+ system.ChargingUpdated -= OnChargingUpdated;
+ }
}
}
diff --git a/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs b/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs
index 09663ba82c..e6df68d933 100644
--- a/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs
+++ b/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs
@@ -22,6 +22,7 @@ using Robust.Client.UserInterface.Controls;
using Robust.Shared.Graphics.RSI;
using Robust.Shared.Input;
using Robust.Shared.Input.Binding;
+using Robust.Shared.Map;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
using static Content.Client.Actions.ActionsSystem;
@@ -29,8 +30,7 @@ using static Content.Client.UserInterface.Systems.Actions.Windows.ActionsWindow;
using static Robust.Client.UserInterface.Control;
using static Robust.Client.UserInterface.Controls.BaseButton;
using static Robust.Client.UserInterface.Controls.LineEdit;
-using static Robust.Client.UserInterface.Controls.MultiselectOptionButton<
- Content.Client.UserInterface.Systems.Actions.Windows.ActionsWindow.Filters>;
+using static Robust.Client.UserInterface.Controls.MultiselectOptionButton;
using static Robust.Client.UserInterface.Controls.TextureRect;
using static Robust.Shared.Input.Binding.PointerInputCmdHandler;
@@ -128,25 +128,45 @@ public sealed class ActionUIController : UIController, IOnStateChanged ToggleWindow()))
- .BindBefore(EngineKeyFunctions.Use, new PointerInputCmdHandler(TargetingOnUse, outsidePrediction: true),
- typeof(ConstructionSystem), typeof(DragDropSystem))
- .BindBefore(EngineKeyFunctions.UIRightClick, new PointerInputCmdHandler(TargetingCancel, outsidePrediction: true))
+ .Bind(ContentKeyFunctions.OpenActionsMenu, InputCmdHandler.FromDelegate(_ => ToggleWindow()))
+ .BindBefore(EngineKeyFunctions.Use, new PointerInputCmdHandler(TargetingOnUse, outsidePrediction: true), typeof(ConstructionSystem), typeof(DragDropSystem))
+ .BindBefore(ContentKeyFunctions.AltActivateItemInWorld, new PointerInputCmdHandler(AltUse, outsidePrediction: true))
.Register();
}
- private bool TargetingCancel(in PointerInputCmdArgs args)
+ private bool AltUse(in PointerInputCmdArgs args)
{
- if (!_timing.IsFirstTimePredicted)
+ if (!_timing.IsFirstTimePredicted || _actionsSystem == null || SelectingTargetFor is not { } actionId)
return false;
- // only do something for actual target-based actions
- if (SelectingTargetFor == null)
+ if (_playerManager.LocalEntity is not { } user)
return false;
- StopTargeting();
- return true;
+ if (!EntityManager.TryGetComponent(user, out ActionsComponent? comp))
+ return false;
+
+ if (!_actionsSystem.TryGetActionData(actionId, out var baseAction) ||
+ baseAction is not BaseTargetActionComponent action || !action.IsAltEnabled)
+ {
+ return false;
+ }
+
+ // Is the action currently valid?
+ if (!action.Enabled
+ || action is { Charges: 0, RenewCharges: false }
+ || action.Cooldown.HasValue && action.Cooldown.Value.End > _timing.CurTime)
+ {
+ // The user is targeting with this action, but it is not valid. Maybe mark this click as
+ // handled and prevent further interactions.
+ return !action.InteractOnMiss;
+ }
+
+ return action switch
+ {
+ WorldTargetActionComponent mapTarget => TryTargetWorld(args.Coordinates, actionId, mapTarget, user, comp,
+ ActionUseType.AltUse, target: args.EntityUid) || !mapTarget.InteractOnMiss,
+ _ => false
+ };
}
///
@@ -179,28 +199,23 @@ public sealed class ActionUIController : UIController, IOnStateChanged TryTargetWorld(args.Coordinates, actionId, mapTarget, user, comp) ||
+ !mapTarget.InteractOnMiss,
+ EntityTargetActionComponent entTarget => TryTargetEntity(args.EntityUid, actionId, entTarget, user, comp) ||
+ !entTarget.InteractOnMiss,
+ _ => false
+ };
}
- private bool TryTargetWorld(in PointerInputCmdArgs args, EntityUid actionId, WorldTargetActionComponent action, EntityUid user, ActionsComponent actionComp)
+ public bool TryTargetWorld(EntityCoordinates coordinates, EntityUid actionId, WorldTargetActionComponent action,
+ EntityUid user, ActionsComponent actionComp, ActionUseType type = ActionUseType.Default, int chargeLevel = 0, EntityUid? target = default)
{
if (_actionsSystem == null)
return false;
- var coords = args.Coordinates;
-
- if (!_actionsSystem.ValidateWorldTarget(user, coords, action))
+ if (!_actionsSystem.ValidateWorldTarget(user, coordinates, action))
{
// Invalid target.
if (action.DeselectOnMiss)
@@ -213,14 +228,24 @@ public sealed class ActionUIController : UIController, IOnStateChanged actions)
{
if (_window is not { Disposed: false, IsOpen: true })
@@ -432,7 +456,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged? ChargingUpdated;
+
+ private bool _charging;
+ private bool _prevCharging;
+
+ private float _chargeTime;
+ private int _chargeLevel;
+ private int _prevChargeLevel;
+
+ private bool _isChargingPlaying;
+ private bool _isChargedPlaying;
+
+ private const float LevelChargeTime = 1.5f;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ _controller = _uiManager.GetUIController();
+ }
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+
+ if (_playerManager.LocalEntity is not { } user)
+ return;
+
+ if (!_timing.IsFirstTimePredicted || _controller == null || _controller.SelectingTargetFor is not { } actionId)
+ return;
+
+ if (!_actionsSystem.TryGetActionData(actionId, out var baseAction) ||
+ baseAction is not BaseTargetActionComponent action || !action.IsChargeEnabled)
+ return;
+
+ if (!action.Enabled
+ || action is { Charges: 0, RenewCharges: false }
+ || action.Cooldown.HasValue && action.Cooldown.Value.End > _timing.CurTime)
+ {
+ return;
+ }
+
+ var altDown = _inputSystem.CmdStates.GetState(EngineKeyFunctions.UseSecondary);
+ switch (altDown)
+ {
+ case BoundKeyState.Down:
+ _prevCharging = _charging;
+ _charging = true;
+ _chargeTime += frameTime;
+ _chargeLevel = (int) (_chargeTime / LevelChargeTime) + 1;
+ _chargeLevel = Math.Clamp(_chargeLevel, 1, action.MaxChargeLevel);
+ break;
+ case BoundKeyState.Up when _charging:
+ _prevCharging = _charging;
+ _charging = false;
+ _chargeTime = 0f;
+ _isChargingPlaying = false;
+ _isChargedPlaying = false;
+
+ HandleAction(actionId, action, user, _chargeLevel);
+ _chargeLevel = 0;
+
+ RaiseNetworkEvent(new RequestAudioSpellStop());
+ RaiseNetworkEvent(new RemoveWizardChargeEvent());
+ break;
+ case BoundKeyState.Up:
+ _prevCharging = _charging;
+ _chargeLevel = 0;
+ _charging = false;
+ _chargeTime = 0f;
+ _isChargingPlaying = false;
+ _isChargedPlaying = false;
+
+ RaiseNetworkEvent(new RequestAudioSpellStop());
+ RaiseNetworkEvent(new RemoveWizardChargeEvent());
+ break;
+ }
+
+ if (_chargeLevel != _prevChargeLevel)
+ {
+ if (_chargeLevel > 0 && _charging)
+ {
+ RaiseNetworkEvent(new AddWizardChargeEvent(action.ChargeProto));
+ }
+ _prevChargeLevel = _chargeLevel;
+ }
+
+ if (_prevCharging != _charging)
+ {
+ ChargingUpdated?.Invoke(_charging);
+ }
+
+ if (_charging && !_isChargingPlaying)
+ {
+ _isChargingPlaying = true;
+ RaiseNetworkEvent(new RequestSpellChargingAudio(action.ChargingSound, action.LoopCharging));
+ }
+
+ if (_chargeLevel >= action.MaxChargeLevel && !_isChargedPlaying && _charging)
+ {
+ _isChargedPlaying = true;
+ RaiseNetworkEvent(new RequestSpellChargedAudio(action.MaxChargedSound, action.LoopMaxCharged));
+ }
+ }
+
+ private void HandleAction(EntityUid actionId, BaseTargetActionComponent action, EntityUid user, int chargeLevel)
+ {
+ var mousePos = _eyeManager.PixelToMap(_inputManager.MouseScreenPosition);
+ if (mousePos.MapId == MapId.Nullspace)
+ return;
+
+ var coordinates = EntityCoordinates.FromMap(_mapManager.TryFindGridAt(mousePos, out var gridUid, out _)
+ ? gridUid
+ : _mapManager.GetMapEntityId(mousePos.MapId), mousePos, _transformSystem, EntityManager);
+
+ if (!EntityManager.TryGetComponent(user, out ActionsComponent? comp))
+ return;
+
+ switch (action)
+ {
+ case WorldTargetActionComponent mapTarget:
+ _controller?.TryTargetWorld(coordinates, actionId, mapTarget, user, comp, ActionUseType.Charge, chargeLevel);
+ break;
+ }
+
+ RaiseNetworkEvent(new RequestAudioSpellStop());
+ RaiseNetworkEvent(new RemoveWizardChargeEvent());
+ }
+
+ public override void Shutdown()
+ {
+ base.Shutdown();
+
+ _controller = null;
+
+ _charging = false;
+ _prevCharging = false;
+ _chargeTime = 0f;
+ _chargeLevel = 0;
+ _prevChargeLevel = 0;
+ _isChargingPlaying = false;
+ _isChargedPlaying = false;
+ }
+}
diff --git a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs
index c1064f62f7..0298b5de46 100644
--- a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs
+++ b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs
@@ -17,8 +17,6 @@ using Robust.Client.State;
using Robust.Shared.Input;
using Robust.Shared.Map;
using Robust.Shared.Player;
-using Robust.Shared.Prototypes;
-using Robust.Shared.Timing;
namespace Content.Client.Weapons.Melee;
diff --git a/Content.Client/_White/Wizard/Scrolls/ScrollSystem.cs b/Content.Client/_White/Wizard/Scrolls/ScrollSystem.cs
new file mode 100644
index 0000000000..79aa123a89
--- /dev/null
+++ b/Content.Client/_White/Wizard/Scrolls/ScrollSystem.cs
@@ -0,0 +1,7 @@
+using Content.Shared._White.Wizard.ScrollSystem;
+
+namespace Content.Client._White.Wizard.Scrolls;
+
+public sealed class ScrollSystem : SharedScrollSystem
+{
+}
diff --git a/Content.Server/Bed/Sleep/SleepingSystem.cs b/Content.Server/Bed/Sleep/SleepingSystem.cs
index ca7274bc52..f9f52205b0 100644
--- a/Content.Server/Bed/Sleep/SleepingSystem.cs
+++ b/Content.Server/Bed/Sleep/SleepingSystem.cs
@@ -69,7 +69,6 @@ namespace Content.Server.Bed.Sleep
emitSound.Sound = sleepSound.Snore;
emitSound.PlayChance = sleepSound.Chance;
emitSound.RollInterval = sleepSound.Interval;
- emitSound.PopUp = sleepSound.PopUp;
}
return;
diff --git a/Content.Server/Damage/Systems/DamagePopupSystem.cs b/Content.Server/Damage/Systems/DamagePopupSystem.cs
index 12fd894ac6..7ef0dfdda9 100644
--- a/Content.Server/Damage/Systems/DamagePopupSystem.cs
+++ b/Content.Server/Damage/Systems/DamagePopupSystem.cs
@@ -30,7 +30,12 @@ public sealed class DamagePopupSystem : EntitySystem
DamagePopupType.Hit => "!",
_ => "Invalid type",
};
- _popupSystem.PopupEntity(msg, uid);
+
+ if (args.Origin.HasValue)
+ _popupSystem.PopupEntity(msg, uid, args.Origin.Value);
+ else
+ _popupSystem.PopupEntity(msg, uid);
+
}
}
}
diff --git a/Content.Server/EnergyDome/EnergyDomeComponent.cs b/Content.Server/EnergyDome/EnergyDomeComponent.cs
new file mode 100644
index 0000000000..b1efc631ec
--- /dev/null
+++ b/Content.Server/EnergyDome/EnergyDomeComponent.cs
@@ -0,0 +1,15 @@
+namespace Content.Server.EnergyDome;
+
+///
+/// marker component that allows linking the dome generator with the dome itself
+///
+
+[RegisterComponent, Access(typeof(EnergyDomeSystem))]
+public sealed partial class EnergyDomeComponent : Component
+{
+ ///
+ /// A linked generator that uses energy
+ ///
+ [DataField]
+ public EntityUid? Generator;
+}
diff --git a/Content.Server/EnergyDome/EnergyDomeGeneratorComponent.cs b/Content.Server/EnergyDome/EnergyDomeGeneratorComponent.cs
new file mode 100644
index 0000000000..24189f518f
--- /dev/null
+++ b/Content.Server/EnergyDome/EnergyDomeGeneratorComponent.cs
@@ -0,0 +1,85 @@
+using Content.Shared.DeviceLinking;
+using Robust.Shared.Audio;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server.EnergyDome;
+
+///
+/// component, allows an entity to generate a battery-powered energy dome of a specific type.
+///
+[RegisterComponent, Access(typeof(EnergyDomeSystem))] //Access add
+public sealed partial class EnergyDomeGeneratorComponent : Component
+{
+ [DataField]
+ public bool Enabled = false;
+
+ ///
+ /// How much energy will be spent from the battery per unit of damage taken by the shield.
+ ///
+ [DataField]
+ public float DamageEnergyDraw = 10f;
+
+ ///
+ /// Whether or not the dome can be toggled via standard interactions
+ /// (alt verbs, using in hand, etc)
+ ///
+ [DataField]
+ public bool CanInteractUse = true;
+
+ ///
+ /// Can the NetworkDevice system activate and deactivate the barrier?
+ ///
+ [DataField]
+ public bool CanDeviceNetworkUse = false;
+
+ //Dome
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
+ public EntProtoId DomePrototype = "EnergyDomeSmallRed";
+
+ [DataField]
+ public EntityUid? SpawnedDome;
+
+ ///
+ /// the entity on which the shield will be hung. This is either the container containing
+ /// the item or the item itself. Determined when the shield is activated,
+ /// it is stored in the component for changing the protected entity.
+ ///
+ [DataField]
+ public EntityUid? DomeParentEntity;
+
+ //Action
+ [DataField]
+ public EntProtoId ToggleAction = "ActionToggleDome";
+
+ [DataField]
+ public EntityUid? ToggleActionEntity;
+
+ //Sounds
+ [DataField]
+ public SoundSpecifier AccessDeniedSound = new SoundPathSpecifier("/Audio/Machines/custom_deny.ogg");
+
+ [DataField]
+ public SoundSpecifier TurnOnSound = new SoundPathSpecifier("/Audio/Machines/anomaly_sync_connect.ogg");
+
+ [DataField]
+ public SoundSpecifier EnergyOutSound = new SoundPathSpecifier("/Audio/Machines/energyshield_down.ogg");
+
+ [DataField]
+ public SoundSpecifier TurnOffSound = new SoundPathSpecifier("/Audio/Machines/button.ogg");
+
+ [DataField]
+ public SoundSpecifier ParrySound = new SoundPathSpecifier("/Audio/Machines/energyshield_parry.ogg")
+ {
+ Params = AudioParams.Default.WithVariation(0.05f)
+ };
+
+ //Ports
+ [DataField]
+ public ProtoId TogglePort = "Toggle";
+
+ [DataField]
+ public ProtoId OnPort = "On";
+
+ [DataField]
+ public ProtoId OffPort = "Off";
+}
diff --git a/Content.Server/EnergyDome/EnergyDomeSystem.cs b/Content.Server/EnergyDome/EnergyDomeSystem.cs
new file mode 100644
index 0000000000..1439c38c2a
--- /dev/null
+++ b/Content.Server/EnergyDome/EnergyDomeSystem.cs
@@ -0,0 +1,329 @@
+using Content.Server.DeviceLinking.Events;
+using Content.Server.DeviceLinking.Systems;
+using Content.Server.Power.Components;
+using Content.Server.Power.EntitySystems;
+using Content.Server.PowerCell;
+using Content.Shared.Actions;
+using Content.Shared.Damage;
+using Content.Shared.Examine;
+using Content.Shared.Interaction;
+using Content.Shared.Popups;
+using Content.Shared.PowerCell;
+using Content.Shared.PowerCell.Components;
+using Content.Shared.Timing;
+using Content.Shared.Toggleable;
+using Content.Shared.Verbs;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Containers;
+
+namespace Content.Server.EnergyDome;
+
+public sealed partial class EnergyDomeSystem : EntitySystem
+{
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly BatterySystem _battery = default!;
+ [Dependency] private readonly SharedContainerSystem _container = default!;
+ [Dependency] private readonly UseDelaySystem _useDelay = default!;
+ [Dependency] private readonly SharedTransformSystem _transform = default!;
+ [Dependency] private readonly SharedPopupSystem _popup = default!;
+ [Dependency] private readonly PowerCellSystem _powerCell = default!;
+ [Dependency] private readonly DeviceLinkSystem _signalSystem = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ //Generator events
+ SubscribeLocalEvent(OnInit);
+
+ SubscribeLocalEvent(OnActivatedInWorld);
+ SubscribeLocalEvent(OnAfterInteract);
+ SubscribeLocalEvent(OnSignalReceived);
+ SubscribeLocalEvent(OnGetActions);
+ SubscribeLocalEvent(OnToggleAction);
+
+ SubscribeLocalEvent(OnPowerCellChanged);
+ SubscribeLocalEvent(OnPowerCellSlotEmpty);
+ SubscribeLocalEvent(OnChargeChanged);
+
+ SubscribeLocalEvent(OnParentChanged);
+
+ SubscribeLocalEvent>(AddToggleDomeVerb);
+ SubscribeLocalEvent(OnExamine);
+
+
+ SubscribeLocalEvent(OnComponentRemove);
+
+ //Dome events
+ SubscribeLocalEvent(OnDomeDamaged);
+ }
+
+
+ private void OnInit(Entity generator, ref MapInitEvent args)
+ {
+ if (generator.Comp.CanDeviceNetworkUse)
+ _signalSystem.EnsureSinkPorts(generator, generator.Comp.TogglePort, generator.Comp.OnPort, generator.Comp.OffPort);
+ }
+
+ //different ways of use
+
+ private void OnSignalReceived(Entity generator, ref SignalReceivedEvent args)
+ {
+ if (!generator.Comp.CanDeviceNetworkUse)
+ return;
+
+ if (args.Port == generator.Comp.OnPort)
+ {
+ AttemptToggle(generator, true);
+ }
+ if (args.Port == generator.Comp.OffPort)
+ {
+ AttemptToggle(generator, false);
+ }
+ if (args.Port == generator.Comp.TogglePort)
+ {
+ AttemptToggle(generator, !generator.Comp.Enabled);
+ }
+ }
+
+ private void OnAfterInteract(Entity generator, ref AfterInteractEvent args)
+ {
+ if (generator.Comp.CanInteractUse)
+ AttemptToggle(generator, !generator.Comp.Enabled);
+ }
+
+ private void OnActivatedInWorld(Entity generator, ref ActivateInWorldEvent args)
+ {
+ if (generator.Comp.CanInteractUse)
+ AttemptToggle(generator, !generator.Comp.Enabled);
+ }
+
+ private void OnExamine(Entity generator, ref ExaminedEvent args)
+ {
+ args.PushMarkup(Loc.GetString(
+ (generator.Comp.Enabled)
+ ? "energy-dome-on-examine-is-on-message"
+ : "energy-dome-on-examine-is-off-message"
+ ));
+ }
+
+ private void AddToggleDomeVerb(Entity generator, ref GetVerbsEvent args)
+ {
+ if (!args.CanAccess || !args.CanInteract || !generator.Comp.CanInteractUse)
+ return;
+
+ var @event = args;
+ ActivationVerb verb = new()
+ {
+ Text = Loc.GetString("energy-dome-verb-toggle"),
+ Act = () => AttemptToggle(generator, !generator.Comp.Enabled)
+ };
+
+ args.Verbs.Add(verb);
+ }
+ private void OnGetActions(Entity generator, ref GetItemActionsEvent args)
+ {
+ if (generator.Comp.CanInteractUse)
+ args.AddAction(ref generator.Comp.ToggleActionEntity, generator.Comp.ToggleAction);
+ }
+
+ private void OnToggleAction(Entity generator, ref ToggleActionEvent args)
+ {
+ if (args.Handled)
+ return;
+
+ AttemptToggle(generator, !generator.Comp.Enabled);
+
+ args.Handled = true;
+ }
+
+ // System interactions
+
+ private void OnPowerCellSlotEmpty(Entity generator, ref PowerCellSlotEmptyEvent args)
+ {
+ TurnOff(generator, true);
+ }
+
+ private void OnPowerCellChanged(Entity generator, ref PowerCellChangedEvent args)
+ {
+ if (args.Ejected || !_powerCell.HasDrawCharge(generator))
+ TurnOff(generator, true);
+ }
+
+ private void OnChargeChanged(Entity generator, ref ChargeChangedEvent args)
+ {
+ if (args.Charge == 0)
+ TurnOff(generator, true);
+ }
+ private void OnDomeDamaged(Entity dome, ref DamageChangedEvent args)
+ {
+ if (dome.Comp.Generator == null)
+ return;
+
+ var generatorUid = dome.Comp.Generator.Value;
+
+ if (!TryComp(generatorUid, out var generatorComp))
+ return;
+
+ if (args.DamageDelta == null)
+ return;
+
+ float totalDamage = args.DamageDelta.GetTotal().Float();
+ var energyLeak = totalDamage * generatorComp.DamageEnergyDraw;
+
+ _audio.PlayPvs(generatorComp.ParrySound, dome);
+
+ if (HasComp(generatorUid))
+ {
+ _powerCell.TryGetBatteryFromSlot(generatorUid, out var cell);
+ if (cell != null)
+ {
+ _battery.UseCharge(cell.Owner, energyLeak);
+
+ if (cell.Charge == 0)
+ TurnOff((generatorUid, generatorComp), true);
+ }
+ }
+
+ //it seems to me it would not work well to hang both a powercell and an internal battery with wire charging on the object....
+ if (TryComp(generatorUid, out var battery)) {
+ _battery.UseCharge(generatorUid, energyLeak);
+
+ if (battery.Charge == 0)
+ TurnOff((generatorUid, generatorComp), true);
+ }
+ }
+
+ private void OnParentChanged(Entity generator, ref EntParentChangedMessage args)
+ {
+ //To do: taking the active barrier in hand for some reason does not manage to change the parent in this case,
+ //and the barrier is not turned off.
+ //
+ //Laying down works well (-_-)
+ if (GetProtectedEntity(generator) != generator.Comp.DomeParentEntity)
+ TurnOff(generator, false);
+ }
+
+ private void OnComponentRemove(Entity generator, ref ComponentRemove args)
+ {
+ TurnOff(generator, false);
+ }
+
+ // Functional
+
+ public bool AttemptToggle(Entity generator, bool status)
+ {
+ if (TryComp(generator, out var useDelay) && _useDelay.IsDelayed(new Entity(generator, useDelay)))
+ {
+ _audio.PlayPvs(generator.Comp.TurnOffSound, generator);
+ _popup.PopupEntity(
+ Loc.GetString("energy-dome-recharging"),
+ generator);
+ return false;
+ }
+
+ if (TryComp(generator, out var powerCellSlot))
+ {
+ if (!_powerCell.TryGetBatteryFromSlot(generator, out var cell) && !TryComp(generator, out cell))
+ {
+ _audio.PlayPvs(generator.Comp.TurnOffSound, generator);
+ _popup.PopupEntity(
+ Loc.GetString("energy-dome-no-cell"),
+ generator);
+ return false;
+ }
+
+ if (!_powerCell.HasDrawCharge(generator))
+ {
+ _audio.PlayPvs(generator.Comp.TurnOffSound, generator);
+ _popup.PopupEntity(
+ Loc.GetString("energy-dome-no-power"),
+ generator);
+ return false;
+ }
+ }
+
+ if (TryComp(generator, out var battery))
+ {
+ if (battery.Charge == 0)
+ {
+ _audio.PlayPvs(generator.Comp.TurnOffSound, generator);
+ _popup.PopupEntity(
+ Loc.GetString("energy-dome-no-power"),
+ generator);
+ return false;
+ }
+ }
+
+ Toggle(generator, status);
+ return true;
+ }
+
+ private void Toggle(Entity generator, bool status)
+ {
+ if (status)
+ TurnOn(generator);
+ else
+ TurnOff(generator, false);
+ }
+
+ private void TurnOn(Entity generator)
+ {
+ if (generator.Comp.Enabled)
+ return;
+
+ var protectedEntity = GetProtectedEntity(generator);
+
+ var newDome = Spawn(generator.Comp.DomePrototype, Transform(protectedEntity).Coordinates);
+ generator.Comp.DomeParentEntity = protectedEntity;
+ _transform.SetParent(newDome, protectedEntity);
+
+ if (TryComp(newDome, out var domeComp))
+ {
+ domeComp.Generator = generator;
+ }
+
+ _powerCell.SetPowerCellDrawEnabled(generator, true);
+ if (TryComp(generator, out var recharger)) {
+ recharger.AutoRecharge = true;
+ }
+
+ generator.Comp.SpawnedDome = newDome;
+ _audio.PlayPvs(generator.Comp.TurnOnSound, generator);
+ generator.Comp.Enabled = true;
+ }
+
+ private void TurnOff(Entity generator, bool startReloading)
+ {
+ if (!generator.Comp.Enabled)
+ return;
+
+ generator.Comp.Enabled = false;
+ QueueDel(generator.Comp.SpawnedDome);
+
+ _powerCell.SetPowerCellDrawEnabled(generator, false);
+ if (TryComp(generator, out var recharger))
+ {
+ recharger.AutoRecharge = false;
+ }
+
+ _audio.PlayPvs(generator.Comp.TurnOffSound, generator);
+ if (startReloading)
+ {
+ _audio.PlayPvs(generator.Comp.EnergyOutSound, generator);
+ if (TryComp(generator, out var useDelay))
+ {
+ _useDelay.TryResetDelay(new Entity(generator, useDelay));
+ }
+ }
+ }
+
+ // Util
+
+ private EntityUid GetProtectedEntity(EntityUid entity)
+ {
+ return (_container.TryGetOuterContainer(entity, Transform(entity), out var container))
+ ? container.Owner
+ : entity;
+ }
+}
diff --git a/Content.Server/Execution/ExecutionSystem.cs b/Content.Server/Execution/ExecutionSystem.cs
index 4354608ca3..976c21149b 100644
--- a/Content.Server/Execution/ExecutionSystem.cs
+++ b/Content.Server/Execution/ExecutionSystem.cs
@@ -49,29 +49,29 @@ public sealed class ExecutionSystem : EntitySystem
public override void Initialize()
{
base.Initialize();
-
+
SubscribeLocalEvent>(OnGetInteractionVerbsMelee);
SubscribeLocalEvent>(OnGetInteractionVerbsGun);
-
+
SubscribeLocalEvent(OnDoafterMelee);
SubscribeLocalEvent(OnDoafterGun);
}
private void OnGetInteractionVerbsMelee(
- EntityUid uid,
+ EntityUid uid,
SharpComponent component,
GetVerbsEvent args)
{
if (args.Hands == null || args.Using == null || !args.CanAccess || !args.CanInteract)
return;
-
+
var attacker = args.User;
var weapon = args.Using!.Value;
var victim = args.Target;
if (!CanExecuteWithMelee(weapon, victim, attacker))
return;
-
+
UtilityVerb verb = new()
{
Act = () =>
@@ -87,7 +87,7 @@ public sealed class ExecutionSystem : EntitySystem
}
private void OnGetInteractionVerbsGun(
- EntityUid uid,
+ EntityUid uid,
GunComponent component,
GetVerbsEvent args)
{
@@ -100,7 +100,7 @@ public sealed class ExecutionSystem : EntitySystem
if (!CanExecuteWithGun(weapon, victim, attacker))
return;
-
+
UtilityVerb verb = new()
{
Act = () =>
@@ -120,15 +120,15 @@ public sealed class ExecutionSystem : EntitySystem
// No point executing someone if they can't take damage
if (!TryComp(victim, out var damage))
return false;
-
+
// You can't execute something that cannot die
if (!TryComp(victim, out var mobState))
return false;
-
+
// You're not allowed to execute dead people (no fun allowed)
if (_mobStateSystem.IsDead(victim, mobState))
return false;
-
+
// You must be able to attack people to execute
if (!_actionBlockerSystem.CanAttack(attacker, victim))
return false;
@@ -144,25 +144,25 @@ public sealed class ExecutionSystem : EntitySystem
private bool CanExecuteWithMelee(EntityUid weapon, EntityUid victim, EntityUid user)
{
if (!CanExecuteWithAny(weapon, victim, user)) return false;
-
+
// We must be able to actually hurt people with the weapon
if (!TryComp(weapon, out var melee) && melee!.Damage.GetTotal() > 0.0f)
return false;
return true;
}
-
+
private bool CanExecuteWithGun(EntityUid weapon, EntityUid victim, EntityUid user)
{
if (!CanExecuteWithAny(weapon, victim, user)) return false;
-
+
// We must be able to actually fire the gun
if (!TryComp(weapon, out var gun) && _gunSystem.CanShoot(gun!))
return false;
return true;
}
-
+
private void TryStartMeleeExecutionDoafter(EntityUid weapon, EntityUid victim, EntityUid attacker)
{
if (!CanExecuteWithMelee(weapon, victim, attacker))
@@ -180,7 +180,7 @@ public sealed class ExecutionSystem : EntitySystem
ShowExecutionPopup("execution-popup-melee-initial-internal", Filter.Entities(attacker), PopupType.Medium, attacker, victim, weapon);
ShowExecutionPopup("execution-popup-melee-initial-external", Filter.PvsExcept(attacker), PopupType.MediumCaution, attacker, victim, weapon);
}
-
+
var doAfter =
new DoAfterArgs(EntityManager, attacker, executionTime, new ExecutionDoAfterEvent(), weapon, target: victim, used: weapon)
{
@@ -192,12 +192,12 @@ public sealed class ExecutionSystem : EntitySystem
_doAfterSystem.TryStartDoAfter(doAfter);
}
-
+
private void TryStartGunExecutionDoafter(EntityUid weapon, EntityUid victim, EntityUid attacker)
{
if (!CanExecuteWithGun(weapon, victim, attacker))
return;
-
+
if (attacker == victim)
{
ShowExecutionPopup("suicide-popup-gun-initial-internal", Filter.Entities(attacker), PopupType.Medium, attacker, victim, weapon);
@@ -225,10 +225,10 @@ public sealed class ExecutionSystem : EntitySystem
{
if (args.Handled || args.Cancelled || args.Used == null || args.Target == null)
return false;
-
+
if (!CanExecuteWithAny(args.Used.Value, args.Target.Value, uid))
return false;
-
+
// All checks passed
return true;
}
@@ -237,7 +237,7 @@ public sealed class ExecutionSystem : EntitySystem
{
if (args.Handled || args.Cancelled || args.Used == null || args.Target == null)
return;
-
+
var attacker = args.User;
var victim = args.Target!.Value;
var weapon = args.Used!.Value;
@@ -246,7 +246,7 @@ public sealed class ExecutionSystem : EntitySystem
if (!TryComp(weapon, out var melee) && melee!.Damage.GetTotal() > 0.0f)
return;
-
+
_damageableSystem.TryChangeDamage(victim, melee.Damage * DamageModifier, true);
_audioSystem.PlayEntity(melee.HitSound, Filter.Pvs(weapon), weapon, true, AudioParams.Default);
@@ -261,26 +261,26 @@ public sealed class ExecutionSystem : EntitySystem
ShowExecutionPopup("execution-popup-melee-complete-external", Filter.PvsExcept(attacker), PopupType.MediumCaution, attacker, victim, weapon);
}
}
-
+
// TODO: This repeats a lot of the code of the serverside GunSystem, make it not do that
private void OnDoafterGun(EntityUid uid, GunComponent component, DoAfterEvent args)
{
if (args.Handled || args.Cancelled || args.Used == null || args.Target == null)
return;
-
+
var attacker = args.User;
var weapon = args.Used!.Value;
var victim = args.Target!.Value;
if (!CanExecuteWithGun(weapon, victim, attacker)) return;
-
+
// Check if any systems want to block our shot
var prevention = new ShotAttemptedEvent
{
User = attacker,
Used = weapon
};
-
+
RaiseLocalEvent(weapon, ref prevention);
if (prevention.Cancelled)
return;
@@ -288,7 +288,7 @@ public sealed class ExecutionSystem : EntitySystem
RaiseLocalEvent(attacker, ref prevention);
if (prevention.Cancelled)
return;
-
+
// Not sure what this is for but gunsystem uses it so ehhh
var attemptEv = new AttemptShootEvent(attacker, null);
RaiseLocalEvent(weapon, ref attemptEv);
@@ -297,11 +297,11 @@ public sealed class ExecutionSystem : EntitySystem
{
if (attemptEv.Message != null)
{
- _popupSystem.PopupClient(attemptEv.Message, weapon, attacker);
+ _popupSystem.PopupEntity(attemptEv.Message, weapon, attacker);
return;
}
}
-
+
// Take some ammunition for the shot (one bullet)
var fromCoordinates = Transform(attacker).Coordinates;
var ev = new TakeAmmoEvent(1, new List<(EntityUid? Entity, IShootable Shootable)>(), fromCoordinates, attacker);
@@ -314,7 +314,7 @@ public sealed class ExecutionSystem : EntitySystem
ShowExecutionPopup("execution-popup-gun-empty", Filter.Pvs(weapon), PopupType.Medium, attacker, victim, weapon);
return;
}
-
+
// Information about the ammo like damage
DamageSpecifier damage = new DamageSpecifier();
@@ -335,9 +335,9 @@ public sealed class ExecutionSystem : EntitySystem
cartridge.Spent = true;
_appearanceSystem.SetData(ammoUid!.Value, AmmoVisuals.Spent, true);
Dirty(ammoUid.Value, cartridge);
-
+
break;
-
+
case AmmoComponent newAmmo:
TryComp(ammoUid, out var projectileB);
if (projectileB != null)
@@ -346,11 +346,11 @@ public sealed class ExecutionSystem : EntitySystem
}
Del(ammoUid);
break;
-
+
case HitscanPrototype hitscan:
damage = hitscan.Damage!;
break;
-
+
default:
throw new ArgumentOutOfRangeException();
}
@@ -369,11 +369,11 @@ public sealed class ExecutionSystem : EntitySystem
return;
}
}
-
+
// Gun successfully fired, deal damage
_damageableSystem.TryChangeDamage(victim, damage * DamageModifier, true);
_audioSystem.PlayEntity(component.SoundGunshot, Filter.Pvs(weapon), weapon, false, AudioParams.Default);
-
+
// Popups
if (attacker != victim)
{
@@ -394,4 +394,4 @@ public sealed class ExecutionSystem : EntitySystem
locString, ("attacker", attacker), ("victim", victim), ("weapon", weapon)),
attacker, filter, true, type);
}
-}
\ No newline at end of file
+}
diff --git a/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs
index 8d72b00c0c..bc188fee2d 100644
--- a/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs
+++ b/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs
@@ -90,7 +90,7 @@ public sealed partial class NukeopsRuleComponent : Component
/// This amount of TC will be given to each nukie
///
[DataField]
- public int WarTCAmountPerNukie = 20;
+ public int WarTCAmountPerNukie = 30;
///
/// Time allowed for declaration of war
diff --git a/Content.Server/Interaction/InteractionPopupSystem.cs b/Content.Server/Interaction/InteractionPopupSystem.cs
index eaeaf14bae..1115f2c0d8 100644
--- a/Content.Server/Interaction/InteractionPopupSystem.cs
+++ b/Content.Server/Interaction/InteractionPopupSystem.cs
@@ -120,7 +120,7 @@ public sealed class InteractionPopupSystem : EntitySystem
_popupSystem.PopupEntity(msg, uid, user);
_popupSystem.PopupEntity(msgOthers, uid, Filter.PvsExcept(user, entityManager: EntityManager), true);
}
- else
+ else if (msg != "") // WD edit
_popupSystem.PopupEntity(msg, uid, user); //play only for the initiating entity.
if (sfx is not null) //not all cases will have sound.
diff --git a/Content.Server/Lightning/LightningSystem.cs b/Content.Server/Lightning/LightningSystem.cs
index 4f975a60fd..6f5a86b0bb 100644
--- a/Content.Server/Lightning/LightningSystem.cs
+++ b/Content.Server/Lightning/LightningSystem.cs
@@ -57,7 +57,6 @@ public sealed class LightningSystem : SharedLightningSystem
}
}
-
///
/// Looks for objects with a LightningTarget component in the radius, prioritizes them, and hits the highest priority targets with lightning.
///
@@ -78,9 +77,9 @@ public sealed class LightningSystem : SharedLightningSystem
_random.Shuffle(targets);
targets.Sort((x, y) => y.Priority.CompareTo(x.Priority));
- int shootedCount = 0;
- int count = -1;
- while(shootedCount < boltCount)
+ var shootCount = 0;
+ var count = -1;
+ while(shootCount < boltCount)
{
count++;
@@ -95,7 +94,7 @@ public sealed class LightningSystem : SharedLightningSystem
{
ShootRandomLightnings(targets[count].Owner, range, 1, lightningPrototype, arcDepth - targets[count].LightningResistance, triggerLightningEvents);
}
- shootedCount++;
+ shootCount++;
}
}
}
diff --git a/Content.Server/Magic/Components/SpellbookComponent.cs b/Content.Server/Magic/Components/SpellbookComponent.cs
deleted file mode 100644
index ebc3c88043..0000000000
--- a/Content.Server/Magic/Components/SpellbookComponent.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using Robust.Shared.Prototypes;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary;
-
-namespace Content.Server.Magic.Components;
-
-///
-/// Spellbooks for having an entity learn spells as long as they've read the book and it's in their hand.
-///
-[RegisterComponent]
-public sealed partial class SpellbookComponent : Component
-{
- ///
- /// List of spells that this book has. This is a combination of the WorldSpells, EntitySpells, and InstantSpells.
- ///
- [ViewVariables]
- public readonly List Spells = new();
-
- ///
- /// The three fields below is just used for initialization.
- ///
- [DataField("spells", customTypeSerializer: typeof(PrototypeIdDictionarySerializer))]
- [ViewVariables(VVAccess.ReadWrite)]
- public Dictionary SpellActions = new();
-
- [DataField("learnTime")]
- [ViewVariables(VVAccess.ReadWrite)]
- public float LearnTime = .75f;
-
- ///
- /// If true, the spell action stays even after the book is removed
- ///
- [DataField("learnPermanently")]
- [ViewVariables(VVAccess.ReadWrite)]
- public bool LearnPermanently;
-}
diff --git a/Content.Server/Magic/MagicSystem.cs b/Content.Server/Magic/MagicSystem.cs
index bb11c1f014..53963879fe 100644
--- a/Content.Server/Magic/MagicSystem.cs
+++ b/Content.Server/Magic/MagicSystem.cs
@@ -1,17 +1,15 @@
+using System.Linq;
using System.Numerics;
using Content.Server.Body.Components;
using Content.Server.Body.Systems;
using Content.Server.Chat.Systems;
using Content.Server.Doors.Systems;
-using Content.Server.Magic.Components;
using Content.Server.Weapons.Ranged.Systems;
using Content.Shared.Actions;
using Content.Shared.Body.Components;
using Content.Shared.Coordinates.Helpers;
-using Content.Shared.DoAfter;
using Content.Shared.Doors.Components;
using Content.Shared.Doors.Systems;
-using Content.Shared.Interaction.Events;
using Content.Shared.Magic;
using Content.Shared.Magic.Events;
using Content.Shared.Maps;
@@ -21,6 +19,7 @@ using Robust.Server.GameObjects;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Map;
+using Robust.Shared.Map.Components;
using Robust.Shared.Physics.Components;
using Robust.Shared.Random;
using Robust.Shared.Serialization.Manager;
@@ -33,31 +32,25 @@ namespace Content.Server.Magic;
///
public sealed class MagicSystem : EntitySystem
{
- [Dependency] private readonly ISerializationManager _seriMan = default!;
+ [Dependency] private readonly ISerializationManager _serializationManager = default!;
[Dependency] private readonly IComponentFactory _compFact = default!;
[Dependency] private readonly IMapManager _mapManager = default!;
+ [Dependency] private readonly SharedMapSystem _mapSystem = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly DoorBoltSystem _boltsSystem = default!;
[Dependency] private readonly BodySystem _bodySystem = default!;
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly SharedDoorSystem _doorSystem = default!;
- [Dependency] private readonly SharedActionsSystem _actionsSystem = default!;
- [Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
[Dependency] private readonly GunSystem _gunSystem = default!;
[Dependency] private readonly PhysicsSystem _physics = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly ChatSystem _chat = default!;
- [Dependency] private readonly ActionContainerSystem _actionContainer = default!;
public override void Initialize()
{
base.Initialize();
- SubscribeLocalEvent(OnInit);
- SubscribeLocalEvent(OnUse);
- SubscribeLocalEvent(OnDoAfter);
-
SubscribeLocalEvent(OnInstantSpawn);
SubscribeLocalEvent(OnTeleportSpell);
SubscribeLocalEvent(OnKnockSpell);
@@ -67,73 +60,8 @@ public sealed class MagicSystem : EntitySystem
SubscribeLocalEvent(OnChangeComponentsSpell);
}
- private void OnDoAfter(EntityUid uid, SpellbookComponent component, DoAfterEvent args)
- {
- if (args.Handled || args.Cancelled)
- return;
-
- args.Handled = true;
- if (!component.LearnPermanently)
- {
- _actionsSystem.GrantActions(args.Args.User, component.Spells, uid);
- return;
- }
-
- foreach (var (id, charges) in component.SpellActions)
- {
- // TOOD store spells entity ids on some sort of innate magic user component or something like that.
- EntityUid? actionId = null;
- if (_actionsSystem.AddAction(args.Args.User, ref actionId, id))
- _actionsSystem.SetCharges(actionId, charges < 0 ? null : charges);
- }
-
- component.SpellActions.Clear();
- }
-
- private void OnInit(EntityUid uid, SpellbookComponent component, MapInitEvent args)
- {
- if (component.LearnPermanently)
- return;
-
- foreach (var (id, charges) in component.SpellActions)
- {
- var spell = _actionContainer.AddAction(uid, id);
- if (spell == null)
- continue;
-
- _actionsSystem.SetCharges(spell, charges < 0 ? null : charges);
- component.Spells.Add(spell.Value);
- }
- }
-
- private void OnUse(EntityUid uid, SpellbookComponent component, UseInHandEvent args)
- {
- if (args.Handled)
- return;
-
- AttemptLearn(uid, component, args);
-
- args.Handled = true;
- }
-
- private void AttemptLearn(EntityUid uid, SpellbookComponent component, UseInHandEvent args)
- {
- var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.LearnTime, new SpellbookDoAfterEvent(), uid, target: uid)
- {
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
- BreakOnDamage = true,
- NeedHand = true //What, are you going to read with your eyes only??
- };
-
- _doAfter.TryStartDoAfter(doAfterEventArgs);
- }
-
#region Spells
- ///
- /// Handles the instant action (i.e. on the caster) attempting to spawn an entity.
- ///
private void OnInstantSpawn(InstantSpawnSpellEvent args)
{
if (args.Handled)
@@ -145,11 +73,11 @@ public sealed class MagicSystem : EntitySystem
{
var ent = Spawn(args.Prototype, position.SnapToGrid(EntityManager, _mapManager));
- if (args.PreventCollideWithCaster)
- {
- var comp = EnsureComp(ent);
- comp.Uid = args.Performer;
- }
+ if (!args.PreventCollideWithCaster)
+ continue;
+
+ var comp = EnsureComp(ent);
+ comp.Uid = args.Performer;
}
Speak(args);
@@ -166,22 +94,17 @@ public sealed class MagicSystem : EntitySystem
var xform = Transform(ev.Performer);
- // var userVelocity = _physics.GetMapLinearVelocity(ev.Performer); WD EDIT
-
foreach (var pos in GetSpawnPositions(xform, ev.Pos))
{
- // If applicable, this ensures the projectile is parented to grid on spawn, instead of the map.
- var mapPos = pos.ToMap(EntityManager);
- var spawnCoords = _mapManager.TryFindGridAt(mapPos, out var gridUid, out var grid) // WD EDIT
+ var mapPos = _transformSystem.ToMapCoordinates(pos);
+ var spawnCoords = _mapManager.TryFindGridAt(mapPos, out var gridUid, out var grid)
? pos.WithEntityId(gridUid, EntityManager)
- : new(_mapManager.GetMapEntityId(mapPos.MapId), mapPos.Position);
+ : new EntityCoordinates(_mapManager.GetMapEntityId(mapPos.MapId), mapPos.Position);
- // WD EDIT
var userVelocity = Vector2.Zero;
if (grid != null && TryComp(gridUid, out PhysicsComponent? physics))
userVelocity = physics.LinearVelocity;
- // WD EDIT
var ent = Spawn(ev.Prototype, spawnCoords);
var direction = ev.Target.ToMapPos(EntityManager, _transformSystem) -
@@ -194,7 +117,9 @@ public sealed class MagicSystem : EntitySystem
{
if (ev.Handled)
return;
+
ev.Handled = true;
+
Speak(ev);
foreach (var toRemove in ev.ToRemove)
@@ -209,75 +134,12 @@ public sealed class MagicSystem : EntitySystem
continue;
var component = (Component) _compFact.GetComponent(name);
- component.Owner = ev.Target;
var temp = (object) component;
- _seriMan.CopyTo(data.Component, ref temp);
+ _serializationManager.CopyTo(data.Component, ref temp);
EntityManager.AddComponent(ev.Target, (Component) temp!);
}
}
- private List GetSpawnPositions(TransformComponent casterXform, MagicSpawnData data)
- {
- switch (data)
- {
- case TargetCasterPos:
- return new List(1) {casterXform.Coordinates};
- case TargetInFront:
- {
- // This is shit but you get the idea.
- var directionPos = casterXform.Coordinates.Offset(casterXform.LocalRotation.ToWorldVec().Normalized());
-
- if (!_mapManager.TryGetGrid(casterXform.GridUid, out var mapGrid))
- return new List();
-
- if (!directionPos.TryGetTileRef(out var tileReference, EntityManager, _mapManager))
- return new List();
-
- var tileIndex = tileReference.Value.GridIndices;
- var coords = mapGrid.GridTileToLocal(tileIndex);
- EntityCoordinates coordsPlus;
- EntityCoordinates coordsMinus;
-
- var dir = casterXform.LocalRotation.GetCardinalDir();
- switch (dir)
- {
- case Direction.North:
- case Direction.South:
- {
- coordsPlus = mapGrid.GridTileToLocal(tileIndex + (1, 0));
- coordsMinus = mapGrid.GridTileToLocal(tileIndex + (-1, 0));
- return new List(3)
- {
- coords,
- coordsPlus,
- coordsMinus,
- };
- }
- case Direction.East:
- case Direction.West:
- {
- coordsPlus = mapGrid.GridTileToLocal(tileIndex + (0, 1));
- coordsMinus = mapGrid.GridTileToLocal(tileIndex + (0, -1));
- return new List(3)
- {
- coords,
- coordsPlus,
- coordsMinus,
- };
- }
- }
-
- return new List();
- }
- default:
- throw new ArgumentOutOfRangeException();
- }
- }
-
- ///
- /// Teleports the user to the clicked location
- ///
- ///
private void OnTeleportSpell(TeleportSpellEvent args)
{
if (args.Handled)
@@ -285,19 +147,16 @@ public sealed class MagicSystem : EntitySystem
var transform = Transform(args.Performer);
- if (transform.MapID != args.Target.GetMapId(EntityManager)) return;
+ if (transform.MapID != args.Target.GetMapId(EntityManager))
+ return;
_transformSystem.SetCoordinates(args.Performer, args.Target);
- transform.AttachToGridOrMap();
+ _transformSystem.AttachToGridOrMap(args.Performer);
_audio.PlayPvs(args.BlinkSound, args.Performer, AudioParams.Default.WithVolume(args.BlinkVolume));
Speak(args);
args.Handled = true;
}
- ///
- /// Opens all doors within range
- ///
- ///
private void OnKnockSpell(KnockSpellEvent args)
{
if (args.Handled)
@@ -306,13 +165,11 @@ public sealed class MagicSystem : EntitySystem
args.Handled = true;
Speak(args);
- //Get the position of the player
var transform = Transform(args.Performer);
var coords = transform.Coordinates;
_audio.PlayPvs(args.KnockSound, args.Performer, AudioParams.Default.WithVolume(args.KnockVolume));
- //Look for doors and don't open them if they're already open.
foreach (var entity in _lookup.GetEntitiesInRange(coords, args.Range))
{
if (TryComp(entity, out var bolts))
@@ -329,9 +186,10 @@ public sealed class MagicSystem : EntitySystem
return;
ev.Handled = true;
+
Speak(ev);
- var direction = Transform(ev.Target).MapPosition.Position - Transform(ev.Performer).MapPosition.Position;
+ var direction = _transformSystem.GetMapCoordinates(ev.Target).Position - _transformSystem.GetMapCoordinates(ev.Performer).Position;
var impulseVector = direction * 10000;
_physics.ApplyLinearImpulse(ev.Target, impulseVector);
@@ -339,28 +197,17 @@ public sealed class MagicSystem : EntitySystem
if (!TryComp(ev.Target, out var body))
return;
- var ents = _bodySystem.GibBody(ev.Target, true, body);
+ var entities = _bodySystem.GibBody(ev.Target, true, body);
if (!ev.DeleteNonBrainParts)
return;
- foreach (var part in ents)
+ foreach (var part in entities.Where(part => HasComp(part) && !HasComp(part)))
{
- // just leaves a brain and clothes
- if (HasComp(part) && !HasComp(part))
- {
- QueueDel(part);
- }
+ QueueDel(part);
}
}
- ///
- /// Spawns entity prototypes from a list within range of click.
- ///
- ///
- /// It will offset mobs after the first mob based on the OffsetVector2 property supplied.
- ///
- /// The Spawn Spell Event args.
private void OnWorldSpawn(WorldSpawnSpellEvent args)
{
if (args.Handled)
@@ -373,24 +220,85 @@ public sealed class MagicSystem : EntitySystem
args.Handled = true;
}
- ///
- /// Loops through a supplied list of entity prototypes and spawns them
- ///
- ///
- /// If an offset of 0, 0 is supplied then the entities will all spawn on the same tile.
- /// Any other offset will spawn entities starting from the source Map Coordinates and will increment the supplied
- /// offset
- ///
- /// The list of Entities to spawn in
- /// Map Coordinates where the entities will spawn
- /// Check to see if the entities should self delete
- /// A Vector2 offset that the entities will spawn in
- private void SpawnSpellHelper(List entityEntries, EntityCoordinates entityCoords, float? lifetime, Vector2 offsetVector2)
+ #endregion
+
+ #region Helpers
+
+ public List GetSpawnPositions(TransformComponent casterXform, MagicSpawnData data)
{
- var getProtos = EntitySpawnCollection.GetSpawns(entityEntries, _random);
+ return data switch
+ {
+ TargetCasterPos => GetCasterPosition(casterXform),
+ TargetInFront => GetPositionsInFront(casterXform),
+ _ => throw new ArgumentOutOfRangeException()
+ };
+ }
+
+ public List GetCasterPosition(TransformComponent casterXform)
+ {
+ return new List(1) { casterXform.Coordinates };
+ }
+
+ public List GetPositionsInFront(TransformComponent casterXform)
+ {
+ var directionPos = casterXform.Coordinates.Offset(casterXform.LocalRotation.ToWorldVec().Normalized());
+
+ if (!TryComp(casterXform.GridUid, out var mapGrid) ||
+ !directionPos.TryGetTileRef(out var tileReference, EntityManager, _mapManager))
+ {
+ return new List();
+ }
+
+ var tileIndex = tileReference.Value.GridIndices;
+ var coords = _mapSystem.GridTileToLocal(casterXform.GridUid.Value, mapGrid, tileIndex);
+
+ var directions = GetCardinalDirections(casterXform.LocalRotation.GetCardinalDir());
+ var spawnPositions = new List(3);
+
+ foreach (var direction in directions)
+ {
+ var offset = GetOffsetForDirection(direction);
+ var coordinates = _mapSystem.GridTileToLocal(casterXform.GridUid.Value, mapGrid, tileIndex + offset);
+ spawnPositions.Add(coordinates);
+ }
+
+ spawnPositions.Add(coords);
+ return spawnPositions;
+ }
+
+ public IEnumerable GetCardinalDirections(Direction dir)
+ {
+ switch (dir)
+ {
+ case Direction.North:
+ case Direction.South:
+ return new[] { Direction.North, Direction.South };
+ case Direction.East:
+ case Direction.West:
+ return new[] { Direction.East, Direction.West };
+ default:
+ return Array.Empty();
+ }
+ }
+
+ public (int, int) GetOffsetForDirection(Direction direction)
+ {
+ return direction switch
+ {
+ Direction.North => (1, 0),
+ Direction.South => (-1, 0),
+ Direction.East => (0, 1),
+ Direction.West => (0, -1),
+ _ => (0, 0)
+ };
+ }
+
+ public void SpawnSpellHelper(List entityEntries, EntityCoordinates entityCoords, float? lifetime, Vector2 offsetVector2)
+ {
+ var getPrototypes = EntitySpawnCollection.GetSpawns(entityEntries, _random);
var offsetCoords = entityCoords;
- foreach (var proto in getProtos)
+ foreach (var proto in getPrototypes)
{
// TODO: Share this code with instant because they're both doing similar things for positioning.
var entity = Spawn(proto, offsetCoords);
@@ -404,8 +312,6 @@ public sealed class MagicSystem : EntitySystem
}
}
- #endregion
-
private void Speak(BaseActionEvent args)
{
if (args is not ISpeakSpell speak || string.IsNullOrWhiteSpace(speak.Speech))
@@ -414,4 +320,6 @@ public sealed class MagicSystem : EntitySystem
_chat.TrySendInGameICMessage(args.Performer, Loc.GetString(speak.Speech),
InGameICChatType.Speak, false);
}
+
+ #endregion
}
diff --git a/Content.Server/Power/EntitySystems/BatterySystem.cs b/Content.Server/Power/EntitySystems/BatterySystem.cs
index c844988b06..7971c8195d 100644
--- a/Content.Server/Power/EntitySystems/BatterySystem.cs
+++ b/Content.Server/Power/EntitySystems/BatterySystem.cs
@@ -84,8 +84,17 @@ namespace Content.Server.Power.EntitySystems
while (query.MoveNext(out var uid, out var comp, out var batt))
{
if (!comp.AutoRecharge) continue;
- if (batt.IsFullyCharged) continue;
- SetCharge(uid, batt.CurrentCharge + comp.AutoRechargeRate * frameTime, batt);
+
+ if (comp.AutoRechargeRate > 0)
+ {
+ if (batt.IsFullyCharged) continue;
+ SetCharge(uid, batt.CurrentCharge + comp.AutoRechargeRate * frameTime, batt);
+ }
+ if (comp.AutoRechargeRate < 0) //self discharging
+ {
+ if (batt.Charge == 0) continue;
+ UseCharge(uid, -comp.AutoRechargeRate * frameTime, batt);
+ }
}
}
diff --git a/Content.Server/Speech/Components/VocalComponent.cs b/Content.Server/Speech/Components/VocalComponent.cs
index ab01f01a9d..513e0e8b95 100644
--- a/Content.Server/Speech/Components/VocalComponent.cs
+++ b/Content.Server/Speech/Components/VocalComponent.cs
@@ -3,7 +3,6 @@ using Content.Server._White.AspectsSystem.Aspects;
using Content.Shared.Chat.Prototypes;
using Content.Shared.Humanoid;
using Robust.Shared.Audio;
-using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary;
@@ -32,12 +31,6 @@ public sealed partial class VocalComponent : Component
[DataField("wilhelmProbability")]
public float WilhelmProbability = 0.0002f;
- [DataField("screamAction", customTypeSerializer: typeof(PrototypeIdSerializer))]
- public string ScreamAction = "ActionScream";
-
- [DataField("screamActionEntity")]
- public EntityUid? ScreamActionEntity;
-
///
/// Currently loaded emote sounds prototype, based on entity sex.
/// Null if no valid prototype for entity sex was found.
diff --git a/Content.Server/Speech/EntitySystems/VocalSystem.cs b/Content.Server/Speech/EntitySystems/VocalSystem.cs
index aedcbbd099..47a3e9936b 100644
--- a/Content.Server/Speech/EntitySystems/VocalSystem.cs
+++ b/Content.Server/Speech/EntitySystems/VocalSystem.cs
@@ -1,10 +1,8 @@
-using Content.Server.Actions;
using Content.Server.Chat.Systems;
using Content.Server.Speech.Components;
using Content.Shared.Chat.Prototypes;
using Content.Shared.Humanoid;
using Content.Shared.Speech;
-using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
@@ -17,33 +15,13 @@ public sealed class VocalSystem : EntitySystem
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly ChatSystem _chat = default!;
- [Dependency] private readonly ActionsSystem _actions = default!;
public override void Initialize()
{
base.Initialize();
- SubscribeLocalEvent(OnMapInit);
- SubscribeLocalEvent(OnShutdown);
SubscribeLocalEvent(OnSexChanged);
SubscribeLocalEvent(OnEmote);
- SubscribeLocalEvent(OnScreamAction);
- }
-
- private void OnMapInit(EntityUid uid, VocalComponent component, MapInitEvent args)
- {
- // try to add scream action when vocal comp added
- _actions.AddAction(uid, ref component.ScreamActionEntity, component.ScreamAction);
- LoadSounds(uid, component);
- }
-
- private void OnShutdown(EntityUid uid, VocalComponent component, ComponentShutdown args)
- {
- // remove scream action when component removed
- if (component.ScreamActionEntity != null)
- {
- _actions.RemoveAction(uid, component.ScreamActionEntity);
- }
}
private void OnSexChanged(EntityUid uid, VocalComponent component, SexChangedEvent args)
@@ -67,15 +45,6 @@ public sealed class VocalSystem : EntitySystem
args.Handled = _chat.TryPlayEmoteSound(uid, component.EmoteSounds, args.Emote);
}
- private void OnScreamAction(EntityUid uid, VocalComponent component, ScreamActionEvent args)
- {
- if (args.Handled)
- return;
-
- _chat.TryEmoteWithChat(uid, component.ScreamId);
- args.Handled = true;
- }
-
private bool TryPlayScreamSound(EntityUid uid, VocalComponent component)
{
if (_random.Prob(component.WilhelmProbability))
diff --git a/Content.Server/Speech/Muting/MutingSystem.cs b/Content.Server/Speech/Muting/MutingSystem.cs
index b743d9eda8..83a0e54c02 100644
--- a/Content.Server/Speech/Muting/MutingSystem.cs
+++ b/Content.Server/Speech/Muting/MutingSystem.cs
@@ -12,12 +12,12 @@ namespace Content.Server.Speech.Muting
public sealed class MutingSystem : EntitySystem
{
[Dependency] private readonly PopupSystem _popupSystem = default!;
+
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent(OnSpeakAttempt);
SubscribeLocalEvent(OnEmote, before: new[] { typeof(VocalSystem) });
- SubscribeLocalEvent(OnScreamAction, before: new[] { typeof(VocalSystem) });
}
private void OnEmote(EntityUid uid, MutedComponent component, ref EmoteEvent args)
@@ -30,20 +30,6 @@ namespace Content.Server.Speech.Muting
args.Handled = true;
}
- private void OnScreamAction(EntityUid uid, MutedComponent component, ScreamActionEvent args)
- {
- if (args.Handled)
- return;
-
- if (HasComp(uid))
- _popupSystem.PopupEntity(Loc.GetString("mime-cant-speak"), uid, uid);
-
- else
- _popupSystem.PopupEntity(Loc.GetString("speech-muted"), uid, uid);
- args.Handled = true;
- }
-
-
private void OnSpeakAttempt(EntityUid uid, MutedComponent component, SpeakAttemptEvent args)
{
// TODO something better than this.
@@ -58,4 +44,4 @@ namespace Content.Server.Speech.Muting
args.Cancel();
}
}
-}
+}
\ No newline at end of file
diff --git a/Content.Server/VendingMachines/VendingMachineSystem.cs b/Content.Server/VendingMachines/VendingMachineSystem.cs
index 5f8904e94b..f73ba26b68 100644
--- a/Content.Server/VendingMachines/VendingMachineSystem.cs
+++ b/Content.Server/VendingMachines/VendingMachineSystem.cs
@@ -323,7 +323,7 @@ namespace Content.Server.VendingMachines
if (_accessReader.IsAllowed(sender, uid, accessReader) || HasComp(uid))
return true;
- Popup.PopupClient(Loc.GetString("vending-machine-component-try-eject-access-denied"), uid, sender);
+ Popup.PopupEntity(Loc.GetString("vending-machine-component-try-eject-access-denied"), uid, sender);
Deny(uid, vendComponent);
return false;
}
@@ -352,7 +352,7 @@ namespace Content.Server.VendingMachines
if (entry == null)
{
if (sender.HasValue)
- Popup.PopupClient(Loc.GetString("vending-machine-component-try-eject-invalid-item"), uid, sender.Value);
+ Popup.PopupEntity(Loc.GetString("vending-machine-component-try-eject-invalid-item"), uid, sender.Value);
Deny(uid, vendComponent);
@@ -362,7 +362,7 @@ namespace Content.Server.VendingMachines
if (entry.Amount <= 0)
{
if (sender.HasValue)
- Popup.PopupClient(Loc.GetString("vending-machine-component-try-eject-out-of-stock"), uid, sender.Value);
+ Popup.PopupEntity(Loc.GetString("vending-machine-component-try-eject-out-of-stock"), uid, sender.Value);
Deny(uid, vendComponent);
return;
diff --git a/Content.Server/Xenoarchaeology/Equipment/Systems/NodeScannerSystem.cs b/Content.Server/Xenoarchaeology/Equipment/Systems/NodeScannerSystem.cs
index 3cafefe389..e3e6d60540 100644
--- a/Content.Server/Xenoarchaeology/Equipment/Systems/NodeScannerSystem.cs
+++ b/Content.Server/Xenoarchaeology/Equipment/Systems/NodeScannerSystem.cs
@@ -1,7 +1,7 @@
-using Content.Server.Popups;
using Content.Server.Xenoarchaeology.Equipment.Components;
using Content.Server.Xenoarchaeology.XenoArtifacts;
using Content.Shared.Interaction;
+using Content.Shared.Popups;
using Content.Shared.Timing;
namespace Content.Server.Xenoarchaeology.Equipment.Systems;
@@ -9,7 +9,7 @@ namespace Content.Server.Xenoarchaeology.Equipment.Systems;
public sealed class NodeScannerSystem : EntitySystem
{
[Dependency] private readonly UseDelaySystem _useDelay = default!;
- [Dependency] private readonly PopupSystem _popupSystem = default!;
+ [Dependency] private readonly SharedPopupSystem _popupSystem = default!;
///
public override void Initialize()
@@ -36,7 +36,7 @@ public sealed class NodeScannerSystem : EntitySystem
return;
// WD edit
- _popupSystem.PopupClient(Loc.GetString("node-scan-popup",
+ _popupSystem.PopupEntity(Loc.GetString("node-scan-popup",
("id", $"{artifact.CurrentNodeId}")), target, args.User);
}
}
diff --git a/Content.Server/_White/ChangeTemperatureOnCollide/ClothingTemperatureAdjustComponent.cs b/Content.Server/_White/ChangeTemperatureOnCollide/ClothingTemperatureAdjustComponent.cs
index a5739c2034..73943783e7 100644
--- a/Content.Server/_White/ChangeTemperatureOnCollide/ClothingTemperatureAdjustComponent.cs
+++ b/Content.Server/_White/ChangeTemperatureOnCollide/ClothingTemperatureAdjustComponent.cs
@@ -4,7 +4,7 @@ namespace Content.Server._White.ChangeTemperatureOnCollide;
public sealed partial class ClothingTemperatureAdjustComponent : Component
{
[DataField, ViewVariables(VVAccess.ReadWrite)]
- public float Rate = 1f;
+ public float Rate = 2f;
[DataField, ViewVariables(VVAccess.ReadWrite)]
public float TargetTemperature = 310.15f;
diff --git a/Content.Server/_White/Cult/Runes/Systems/CultSystem.Verb.cs b/Content.Server/_White/Cult/Runes/Systems/CultSystem.Verb.cs
index d4b8cb238f..059fa77710 100644
--- a/Content.Server/_White/Cult/Runes/Systems/CultSystem.Verb.cs
+++ b/Content.Server/_White/Cult/Runes/Systems/CultSystem.Verb.cs
@@ -57,7 +57,7 @@ public sealed partial class CultSystem
if (comp.SelectedEmpowers.Count >= 1)
{
- _popupSystem.PopupEntity(Loc.GetString("verb-spell-create-too-much"), ent);
+ _popupSystem.PopupEntity(Loc.GetString("verb-spell-create-too-much"), ent, ent);
return;
}
@@ -106,7 +106,7 @@ public sealed partial class CultSystem
{
if (ent.Comp.SelectedEmpowers.Count == 0)
{
- _popupSystem.PopupEntity(Loc.GetString("verb-spell-remove-no-spells"), ent);
+ _popupSystem.PopupEntity(Loc.GetString("verb-spell-remove-no-spells"), ent, ent);
return;
}
diff --git a/Content.Server/_White/Cult/TimedProduction/CultistFactorySystem.cs b/Content.Server/_White/Cult/TimedProduction/CultistFactorySystem.cs
index 52729f4d94..d3dff143eb 100644
--- a/Content.Server/_White/Cult/TimedProduction/CultistFactorySystem.cs
+++ b/Content.Server/_White/Cult/TimedProduction/CultistFactorySystem.cs
@@ -147,12 +147,12 @@ public sealed class CultistFactorySystem : EntitySystem
if (args.IsAnchored)
{
_transform.Unanchor(target, xform);
- _popup.PopupClient(Loc.GetString("anchorable-unanchored"), uid, args.User);
+ _popup.PopupEntity(Loc.GetString("anchorable-unanchored"), uid, args.User);
}
else
{
_transform.AnchorEntity(target, xform);
- _popup.PopupClient(Loc.GetString("anchorable-anchored"), uid, args.User);
+ _popup.PopupEntity(Loc.GetString("anchorable-anchored"), uid, args.User);
}
_audio.PlayPvs("/Audio/Items/ratchet.ogg", uid);
diff --git a/Content.Server/_White/Implants/Mindslave/MindslaveSystem.cs b/Content.Server/_White/Implants/Mindslave/MindslaveSystem.cs
index d2e1f7e733..80838ba8ae 100644
--- a/Content.Server/_White/Implants/Mindslave/MindslaveSystem.cs
+++ b/Content.Server/_White/Implants/Mindslave/MindslaveSystem.cs
@@ -69,6 +69,11 @@ public sealed class MindslaveSystem : SharedMindslaveSystem
private void OnMindslaveRemoved(Entity ent, ref SubdermalImplantRemoved args)
{
+ if (!Tag.HasTag(ent.Owner, MindslaveTag))
+ {
+ return;
+ }
+
if (!TryComp(args.Target, out MindSlaveComponent? mindslave))
{
return;
diff --git a/Content.Server/_White/IncorporealSystem/IncorporealSystem.cs b/Content.Server/_White/IncorporealSystem/IncorporealSystem.cs
index 969f8af6ea..3231e4420b 100644
--- a/Content.Server/_White/IncorporealSystem/IncorporealSystem.cs
+++ b/Content.Server/_White/IncorporealSystem/IncorporealSystem.cs
@@ -2,6 +2,8 @@
using Content.Shared.Eye;
using Content.Shared.Movement.Systems;
using Content.Shared.Physics;
+using Content.Shared.Stealth;
+using Content.Shared.Stealth.Components;
using Robust.Server.GameObjects;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Systems;
@@ -10,11 +12,10 @@ namespace Content.Server._White.IncorporealSystem;
public sealed class IncorporealSystem : EntitySystem
{
- [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly MovementSpeedModifierSystem _movement = default!;
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
[Dependency] private readonly VisibilitySystem _visibilitySystem = default!;
-
+ [Dependency] private readonly SharedStealthSystem _stealth = default!;
public override void Initialize()
{
@@ -41,6 +42,9 @@ public sealed class IncorporealSystem : EntitySystem
_visibilitySystem.RefreshVisibility(uid);
}
+ Spawn("EffectEmpPulse", Transform(uid).Coordinates);
+ EnsureComp(uid);
+ _stealth.SetVisibility(uid, -1);
_movement.RefreshMovementSpeedModifiers(uid);
}
@@ -50,8 +54,8 @@ public sealed class IncorporealSystem : EntitySystem
{
var fixture = fixtures.Fixtures.First();
- _physics.SetCollisionMask(uid, fixture.Key, fixture.Value, (int) (CollisionGroup.FlyingMobMask | CollisionGroup.GhostImpassable), fixtures);
- _physics.SetCollisionLayer(uid, fixture.Key, fixture.Value, (int) CollisionGroup.FlyingMobLayer, fixtures);
+ _physics.SetCollisionMask(uid, fixture.Key, fixture.Value, (int) (CollisionGroup.MobMask | CollisionGroup.GhostImpassable), fixtures);
+ _physics.SetCollisionLayer(uid, fixture.Key, fixture.Value, (int) CollisionGroup.MobLayer, fixtures);
}
if (TryComp(uid, out var visibility))
@@ -62,6 +66,10 @@ public sealed class IncorporealSystem : EntitySystem
}
component.MovementSpeedBuff = 1;
+
+ Spawn("EffectEmpPulse", Transform(uid).Coordinates);
+ _stealth.SetVisibility(uid, 1);
+ RemComp(uid);
_movement.RefreshMovementSpeedModifiers(uid);
}
diff --git a/Content.Server/_White/Other/RandomDamageSystem/RandomDamageSystem.cs b/Content.Server/_White/Other/RandomDamageSystem/RandomDamageSystem.cs
index fc00fc8fa0..0a127622d7 100644
--- a/Content.Server/_White/Other/RandomDamageSystem/RandomDamageSystem.cs
+++ b/Content.Server/_White/Other/RandomDamageSystem/RandomDamageSystem.cs
@@ -21,6 +21,8 @@ public sealed class RandomDamageSystem : EntitySystem
private void HandleHit(Entity ent, ref MeleeHitEvent args)
{
var damage = _random.NextFloat() * ent.Comp.Max;
+ if (args.Direction != null) // Heavy attack
+ damage *= 0.7f;
args.BonusDamage = new DamageSpecifier(_prototypeManager.Index("Slash"), damage);
}
}
diff --git a/Content.Server/_White/Wizard/Charging/ChargingSystem.cs b/Content.Server/_White/Wizard/Charging/ChargingSystem.cs
new file mode 100644
index 0000000000..f5e8f840fe
--- /dev/null
+++ b/Content.Server/_White/Wizard/Charging/ChargingSystem.cs
@@ -0,0 +1,183 @@
+using Content.Shared._White.Wizard;
+using Content.Shared._White.Wizard.Charging;
+using Content.Shared.Follower;
+using Robust.Shared.Audio;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Player;
+
+namespace Content.Server._White.Wizard.Charging;
+
+public sealed class ChargingSystem : SharedChargingSystem
+{
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly FollowerSystem _followerSystem = default!;
+
+ private readonly Dictionary> _charges = new();
+
+ private readonly Dictionary _chargingLoops = new();
+ private readonly Dictionary _chargedLoop = new();
+
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeNetworkEvent(OnCharging);
+ SubscribeNetworkEvent(OnCharged);
+ SubscribeNetworkEvent(OnStop);
+ SubscribeLocalEvent(OnDetach);
+
+ SubscribeNetworkEvent(Add);
+ SubscribeNetworkEvent(Remove);
+ }
+
+ #region Audio
+
+ private void OnCharging(RequestSpellChargingAudio msg, EntitySessionEventArgs args)
+ {
+ var user = args.SenderSession?.AttachedEntity;
+ if (user == null)
+ return;
+
+ var shouldLoop = msg.Loop;
+ var sound = msg.Sound;
+
+ if (!shouldLoop)
+ {
+ _audio.PlayPvs(sound, user.Value);
+ return;
+ }
+
+ if (_chargingLoops.TryGetValue(user.Value, out var currentStream))
+ {
+ _audio.Stop(currentStream);
+ _chargingLoops.Remove(user.Value);
+ }
+
+ var newStream = _audio.PlayPvs(sound, user.Value, AudioParams.Default.WithLoop(true));
+
+ if (newStream.HasValue)
+ {
+ _chargingLoops[user.Value] = newStream.Value.Entity;
+ }
+ }
+
+ private void OnCharged(RequestSpellChargedAudio msg, EntitySessionEventArgs args)
+ {
+ var user = args.SenderSession?.AttachedEntity;
+ if (user == null)
+ return;
+
+ if (_chargingLoops.TryGetValue(user.Value, out var currentStream))
+ {
+ _audio.Stop(currentStream);
+ _chargingLoops.Remove(user.Value);
+ }
+
+ var shouldLoop = msg.Loop;
+ var sound = msg.Sound;
+
+ if (!shouldLoop)
+ {
+ _audio.PlayPvs(sound, user.Value);
+ return;
+ }
+
+ if (_chargedLoop.TryGetValue(user.Value, out var chargedLoop))
+ {
+ _audio.Stop(chargedLoop);
+ _chargedLoop.Remove(user.Value);
+ }
+
+ var newStream = _audio.PlayPvs(sound, user.Value, AudioParams.Default.WithLoop(true));
+
+ if (newStream.HasValue)
+ {
+ _chargedLoop[user.Value] = newStream.Value.Entity;
+ }
+ }
+
+ private void OnStop(RequestAudioSpellStop msg, EntitySessionEventArgs args)
+ {
+ var user = args.SenderSession?.AttachedEntity;
+ if (user == null)
+ return;
+
+ if (_chargingLoops.TryGetValue(user.Value, out var currentStream))
+ {
+ _audio.Stop(currentStream);
+ _chargingLoops.Remove(user.Value);
+ }
+
+ if (_chargedLoop.TryGetValue(user.Value, out var chargedLoop))
+ {
+ _audio.Stop(chargedLoop);
+ _chargedLoop.Remove(user.Value);
+ }
+ }
+
+ private void OnDetach(PlayerDetachedEvent msg, EntitySessionEventArgs args)
+ {
+ var user = msg.Entity;
+
+ if (_chargingLoops.TryGetValue(user, out var currentStream))
+ {
+ _audio.Stop(currentStream);
+ _chargingLoops.Remove(user);
+ }
+
+ if (_chargedLoop.TryGetValue(user, out var chargedLoop))
+ {
+ _audio.Stop(chargedLoop);
+ _chargedLoop.Remove(user);
+ }
+ }
+
+ #endregion
+
+ #region Charges
+
+ private void Add(AddWizardChargeEvent msg, EntitySessionEventArgs args)
+ {
+ if (args.SenderSession.AttachedEntity != null)
+ AddCharge(args.SenderSession.AttachedEntity.Value, msg.ChargeProto);
+ }
+
+ private void Remove(RemoveWizardChargeEvent msg, EntitySessionEventArgs args)
+ {
+ if (args.SenderSession.AttachedEntity != null)
+ RemoveAllCharges(args.SenderSession.AttachedEntity.Value);
+ }
+
+ #endregion
+
+ #region Helpers
+
+ public void AddCharge(EntityUid uid, string msgChargeProto)
+ {
+ var itemEnt = Spawn(msgChargeProto, Transform(uid).Coordinates);
+ _followerSystem.StartFollowingEntity(itemEnt, uid);
+
+ if (!_charges.ContainsKey(uid))
+ {
+ _charges[uid] = new List();
+ }
+
+ _charges[uid].Add(itemEnt);
+ }
+
+ public void RemoveAllCharges(EntityUid uid)
+ {
+ if (!_charges.ContainsKey(uid))
+ return;
+
+ foreach (var followerEnt in _charges[uid])
+ {
+ Del(followerEnt);
+ }
+
+ _charges.Remove(uid);
+ }
+
+ #endregion
+}
diff --git a/Content.Server/_White/Wizard/Magic/Amaterasu/AmaterasuComponent.cs b/Content.Server/_White/Wizard/Magic/Amaterasu/AmaterasuComponent.cs
new file mode 100644
index 0000000000..6cf0d7a5c6
--- /dev/null
+++ b/Content.Server/_White/Wizard/Magic/Amaterasu/AmaterasuComponent.cs
@@ -0,0 +1,6 @@
+namespace Content.Server._White.Wizard.Magic.Amaterasu;
+
+[RegisterComponent]
+public sealed partial class AmaterasuComponent : Component
+{
+}
diff --git a/Content.Server/_White/Wizard/Magic/Amaterasu/AmaterasuSystem.cs b/Content.Server/_White/Wizard/Magic/Amaterasu/AmaterasuSystem.cs
new file mode 100644
index 0000000000..6c16a7f52f
--- /dev/null
+++ b/Content.Server/_White/Wizard/Magic/Amaterasu/AmaterasuSystem.cs
@@ -0,0 +1,34 @@
+using Content.Server.Atmos.Components;
+using Content.Server.Body.Systems;
+using Content.Shared.Mobs;
+
+namespace Content.Server._White.Wizard.Magic.Amaterasu;
+
+public sealed class AmaterasuSystem : EntitySystem
+{
+ [Dependency] private readonly BodySystem _bodySystem = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnMobState);
+ }
+
+ private void OnMobState(EntityUid uid, AmaterasuComponent component, MobStateChangedEvent args)
+ {
+ if (args.NewMobState is MobState.Critical or MobState.Dead)
+ {
+ if(!TryComp(uid, out var flammable))
+ return;
+
+ if (flammable.OnFire)
+ {
+ _bodySystem.GibBody(uid);
+ return;
+ }
+
+ RemComp(uid);
+ }
+ }
+}
diff --git a/Content.Server/_White/Wizard/Magic/Other/InstantRecallComponent.cs b/Content.Server/_White/Wizard/Magic/Other/InstantRecallComponent.cs
new file mode 100644
index 0000000000..e20a7ac19e
--- /dev/null
+++ b/Content.Server/_White/Wizard/Magic/Other/InstantRecallComponent.cs
@@ -0,0 +1,7 @@
+namespace Content.Server._White.Wizard.Magic.Other;
+
+[RegisterComponent]
+public sealed partial class InstantRecallComponent : Component
+{
+ public EntityUid? Item;
+}
diff --git a/Content.Server/_White/Wizard/Magic/TeslaProjectile/TeslaProjectileComponent.cs b/Content.Server/_White/Wizard/Magic/TeslaProjectile/TeslaProjectileComponent.cs
new file mode 100644
index 0000000000..9ffce14fd6
--- /dev/null
+++ b/Content.Server/_White/Wizard/Magic/TeslaProjectile/TeslaProjectileComponent.cs
@@ -0,0 +1,4 @@
+namespace Content.Server._White.Wizard.Magic.TeslaProjectile;
+
+[RegisterComponent]
+public sealed partial class TeslaProjectileComponent : Component {}
diff --git a/Content.Server/_White/Wizard/Magic/TeslaProjectile/TeslaProjectileSystem.cs b/Content.Server/_White/Wizard/Magic/TeslaProjectile/TeslaProjectileSystem.cs
new file mode 100644
index 0000000000..44740f704d
--- /dev/null
+++ b/Content.Server/_White/Wizard/Magic/TeslaProjectile/TeslaProjectileSystem.cs
@@ -0,0 +1,21 @@
+using Content.Server.Lightning;
+using Content.Shared.Projectiles;
+
+namespace Content.Server._White.Wizard.Magic.TeslaProjectile;
+
+public sealed class TeslaProjectileSystem : EntitySystem
+{
+ [Dependency] private readonly LightningSystem _lightning = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnStartCollide);
+ }
+
+ private void OnStartCollide(Entity ent, ref ProjectileHitEvent args)
+ {
+ _lightning.ShootRandomLightnings(ent, 2, 4, arcDepth:2);
+ }
+}
diff --git a/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs b/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs
new file mode 100644
index 0000000000..9a4cd57b25
--- /dev/null
+++ b/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs
@@ -0,0 +1,701 @@
+using System.Linq;
+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.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.Lightning;
+using Content.Server.Magic;
+using Content.Server.Singularity.EntitySystems;
+using Content.Server.Weapons.Ranged.Systems;
+using Content.Shared._White.Wizard;
+using Content.Shared._White.Wizard.Magic;
+using Content.Shared.Actions;
+using Content.Shared.Cluwne;
+using Content.Shared.Coordinates.Helpers;
+using Content.Shared.Hands.Components;
+using Content.Shared.Hands.EntitySystems;
+using Content.Shared.Humanoid;
+using Content.Shared.Interaction.Components;
+using Content.Shared.Inventory;
+using Content.Shared.Inventory.VirtualItem;
+using Content.Shared.Item;
+using Content.Shared.Magic;
+using Content.Shared.Maps;
+using Content.Shared.Mobs.Components;
+using Content.Shared.Physics;
+using Content.Shared.Popups;
+using Content.Shared.StatusEffect;
+using Content.Shared.Throwing;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Map;
+using Robust.Shared.Physics.Components;
+using Robust.Shared.Random;
+
+namespace Content.Server._White.Wizard.Magic;
+
+public sealed class WizardSpellsSystem : EntitySystem
+{
+ #region Dependencies
+
+ [Dependency] private readonly IMapManager _mapManager = default!;
+ [Dependency] private readonly IRobustRandom _random = default!;
+ [Dependency] private readonly EntityLookupSystem _lookup = default!;
+ [Dependency] private readonly GunSystem _gunSystem = default!;
+ [Dependency] private readonly SharedTransformSystem _transformSystem = default!;
+ [Dependency] private readonly ChatSystem _chat = default!;
+ [Dependency] private readonly LightningSystem _lightning = default!;
+ [Dependency] private readonly MagicSystem _magicSystem = default!;
+ [Dependency] private readonly GravityWellSystem _gravityWell = default!;
+ [Dependency] private readonly FlammableSystem _flammableSystem = default!;
+ [Dependency] private readonly SharedHandsSystem _handsSystem = default!;
+ [Dependency] private readonly ThrowingSystem _throwingSystem = default!;
+ [Dependency] private readonly TurfSystem _turf = default!;
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!;
+ [Dependency] private readonly SharedPopupSystem _popupSystem = default!;
+ [Dependency] private readonly InventorySystem _inventory = default!;
+ [Dependency] private readonly EmpSystem _empSystem = default!;
+
+ #endregion
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnInstantRecallSpell);
+ SubscribeLocalEvent(OnMimeTouchSpell);
+ SubscribeLocalEvent(OnBananaTouchSpell);
+ SubscribeLocalEvent(OnCluwneCurseSpell);
+ SubscribeLocalEvent(OnEmpSpell);
+ SubscribeLocalEvent(OnJauntSpell);
+ SubscribeLocalEvent(OnBlinkSpell);
+ SubscribeLocalEvent(OnForcewallSpell);
+ SubscribeLocalEvent(OnCardsSpell);
+ SubscribeLocalEvent(OnFireballSpell);
+ SubscribeLocalEvent(OnForceSpell);
+ SubscribeLocalEvent(OnArcSpell);
+
+ SubscribeLocalEvent(OnBeforeCastSpell);
+ }
+
+ #region Instant Recall
+
+ private void OnInstantRecallSpell(InstantRecallSpellEvent msg)
+ {
+ if (msg.Handled || !CheckRequirements(msg.Action, msg.Performer))
+ return;
+
+ if (!TryComp(msg.Performer, out var handsComponent))
+ return;
+
+ if (!TryComp(msg.Action, out var recallComponent))
+ {
+ _popupSystem.PopupEntity("Что-то поломалось!", msg.Performer, msg.Performer);
+ return;
+ }
+
+ if (handsComponent.ActiveHandEntity != null)
+ {
+ if (HasComp(handsComponent.ActiveHandEntity.Value))
+ {
+ _popupSystem.PopupEntity("Не могу работать с этим!", msg.Performer, msg.Performer);
+ return;
+ }
+
+ recallComponent.Item = handsComponent.ActiveHandEntity.Value;
+ _popupSystem.PopupEntity($"Сопряжено с {MetaData(handsComponent.ActiveHandEntity.Value).EntityName}", msg.Performer, msg.Performer);
+ return;
+ }
+
+ if (handsComponent.ActiveHandEntity == null && recallComponent.Item != null)
+ {
+ var coordsItem = Transform(recallComponent.Item.Value).Coordinates;
+ var coordsPerformer = Transform(msg.Performer).Coordinates;
+
+ Spawn("EffectEmpPulse", coordsItem);
+
+ _transformSystem.SetCoordinates(recallComponent.Item.Value, coordsPerformer);
+ _transformSystem.AttachToGridOrMap(recallComponent.Item.Value);
+
+ _handsSystem.TryForcePickupAnyHand(msg.Performer, recallComponent.Item.Value);
+
+ msg.Handled = true;
+ return;
+ }
+
+ _popupSystem.PopupEntity("Нет привязки.", msg.Performer, msg.Performer);
+ }
+
+ #endregion
+
+ #region Mime Touch
+
+ private void OnMimeTouchSpell(MimeTouchSpellEvent msg)
+ {
+ if (msg.Handled || !CheckRequirements(msg.Action, msg.Performer))
+ return;
+
+ if (!HasComp(msg.Target))
+ {
+ _popupSystem.PopupEntity("Работает только на людях!", msg.Performer, msg.Performer);
+ return;
+ }
+
+ SetOutfitCommand.SetOutfit(msg.Target, "MimeGear", EntityManager);
+ EnsureComp(msg.Target);
+
+ Spawn("AdminInstantEffectSmoke3", Transform(msg.Target).Coordinates);
+
+ msg.Handled = true;
+ Speak(msg);
+ }
+
+ #endregion
+
+ #region Banana Touch
+
+ private void OnBananaTouchSpell(BananaTouchSpellEvent msg)
+ {
+ if (msg.Handled || !CheckRequirements(msg.Action, msg.Performer))
+ return;
+
+ if (!HasComp(msg.Target))
+ {
+ _popupSystem.PopupEntity("Работает только на людях!", msg.Performer, msg.Performer);
+ return;
+ }
+
+ SetOutfitCommand.SetOutfit(msg.Target, "ClownGear", EntityManager);
+ EnsureComp(msg.Target);
+
+ Spawn("AdminInstantEffectSmoke3", Transform(msg.Target).Coordinates);
+
+ msg.Handled = true;
+ Speak(msg);
+ }
+
+ #endregion
+
+ #region Cluwne Curse
+
+ private void OnCluwneCurseSpell(CluwneCurseSpellEvent msg)
+ {
+ if (msg.Handled || !CheckRequirements(msg.Action, msg.Performer))
+ return;
+
+ if (!HasComp(msg.Target))
+ {
+ _popupSystem.PopupEntity("Работает только на людях!", msg.Performer, msg.Performer);
+ return;
+ }
+
+ EnsureComp(msg.Target);
+
+ Spawn("AdminInstantEffectSmoke3", Transform(msg.Target).Coordinates);
+
+ msg.Handled = true;
+ Speak(msg);
+ }
+
+ #endregion
+
+ #region EMP
+
+ private void OnEmpSpell(EmpSpellEvent msg)
+ {
+ if (msg.Handled || !CheckRequirements(msg.Action, msg.Performer))
+ return;
+
+ var coords = _transformSystem.ToMapCoordinates(Transform(msg.Performer).Coordinates);
+
+ _empSystem.EmpPulse(coords, 15, 1000000, 60f);
+
+ msg.Handled = true;
+ Speak(msg);
+ }
+
+ #endregion
+
+ #region Ethereal Jaunt
+
+ private void OnJauntSpell(EtherealJauntSpellEvent msg)
+ {
+ if (msg.Handled || !CheckRequirements(msg.Action, msg.Performer))
+ return;
+
+ if (_statusEffectsSystem.HasStatusEffect(msg.Performer, "Incorporeal"))
+ {
+ _popupSystem.PopupEntity("Вы уже в потустороннем мире", msg.Performer, msg.Performer);
+ return;
+ }
+
+ Spawn("AdminInstantEffectSmoke10", Transform(msg.Performer).Coordinates);
+
+ _statusEffectsSystem.TryAddStatusEffect(msg.Performer, "Incorporeal", TimeSpan.FromSeconds(10), false);
+
+ msg.Handled = true;
+ Speak(msg);
+ }
+
+ #endregion
+
+ #region Blink
+
+ private void OnBlinkSpell(BlinkSpellEvent msg)
+ {
+ if (msg.Handled || !CheckRequirements(msg.Action, msg.Performer))
+ return;
+
+ var transform = Transform(msg.Performer);
+
+ var oldCoords = transform.Coordinates;
+
+ EntityCoordinates coords = default;
+ var foundTeleportPos = false;
+ var attempts = 10;
+
+ while (attempts > 0)
+ {
+ attempts--;
+
+ var random = new Random().Next(10, 20);
+ var offset = transform.LocalRotation.ToWorldVec().Normalized();
+ var direction = transform.LocalRotation.GetDir().ToVec();
+ var newOffset = offset + direction * random;
+ coords = transform.Coordinates.Offset(newOffset).SnapToGrid(EntityManager);
+
+ var tile = coords.GetTileRef();
+
+ if (tile != null && _turf.IsTileBlocked(tile.Value, CollisionGroup.AllMask))
+ continue;
+
+ foundTeleportPos = true;
+ break;
+ }
+
+ if (!foundTeleportPos)
+ return;
+
+ _transformSystem.SetCoordinates(msg.Performer, coords);
+ _transformSystem.AttachToGridOrMap(msg.Performer);
+
+ _audio.PlayPvs("/Audio/White/Cult/veilin.ogg", coords);
+ _audio.PlayPvs("/Audio/White/Cult/veilout.ogg", oldCoords);
+
+ Spawn("AdminInstantEffectSmoke10", oldCoords);
+ Spawn("AdminInstantEffectSmoke10", coords);
+
+ msg.Handled = true;
+ Speak(msg);
+ }
+
+ #endregion
+
+ #region Forcewall
+
+ private void OnForcewallSpell(ForceWallSpellEvent msg)
+ {
+ if (msg.Handled || !CheckRequirements(msg.Action, msg.Performer))
+ return;
+
+ switch (msg.ActionUseType)
+ {
+ case ActionUseType.Default:
+ ForcewallSpellDefault(msg);
+ break;
+ case ActionUseType.Charge:
+ ForcewallSpellCharge(msg);
+ break;
+ case ActionUseType.AltUse:
+ ForcewallSpellAlt(msg);
+ break;
+ }
+
+ msg.Handled = true;
+ Speak(msg);
+ }
+
+ private void ForcewallSpellDefault(ForceWallSpellEvent msg)
+ {
+ var transform = Transform(msg.Performer);
+
+ foreach (var position in _magicSystem.GetPositionsInFront(transform))
+ {
+ var ent = Spawn(msg.Prototype, position.SnapToGrid(EntityManager, _mapManager));
+
+ var comp = EnsureComp(ent);
+ comp.Uid = msg.Performer;
+ }
+ }
+
+ private void ForcewallSpellCharge(ForceWallSpellEvent msg)
+ {
+ var xform = Transform(msg.Performer);
+
+ var positions = GetArenaPositions(xform, msg.ChargeLevel);
+
+ foreach (var position in positions)
+ {
+ var ent = Spawn(msg.Prototype, position);
+
+ var comp = EnsureComp(ent);
+ comp.Uid = msg.Performer;
+ }
+ }
+
+ private void ForcewallSpellAlt(ForceWallSpellEvent msg)
+ {
+ var xform = Transform(msg.TargetUid);
+
+ var positions = GetArenaPositions(xform, 2);
+
+ foreach (var direction in positions)
+ {
+ var ent = Spawn(msg.Prototype, direction);
+
+ var comp = EnsureComp(ent);
+ comp.Uid = msg.Performer;
+ }
+ }
+
+ #endregion
+
+ #region Cards
+
+ private void OnCardsSpell(CardsSpellEvent msg)
+ {
+ if (msg.Handled || !CheckRequirements(msg.Action, msg.Performer))
+ return;
+
+ switch (msg.ActionUseType)
+ {
+ case ActionUseType.Default:
+ CardsSpellDefault(msg);
+ break;
+ case ActionUseType.Charge:
+ CardsSpellCharge(msg);
+ break;
+ case ActionUseType.AltUse:
+ CardsSpellAlt(msg);
+ break;
+ }
+
+ msg.Handled = true;
+ Speak(msg);
+ }
+
+ private void CardsSpellDefault(CardsSpellEvent msg)
+ {
+ var xform = Transform(msg.Performer);
+
+ for (var i = 0; i < 10; i++)
+ {
+ foreach (var pos in _magicSystem.GetSpawnPositions(xform, msg.Pos))
+ {
+ var mapPos = _transformSystem.ToMapCoordinates(pos);
+ var spawnCoords = _mapManager.TryFindGridAt(mapPos, out var gridUid, out _)
+ ? pos.WithEntityId(gridUid, EntityManager)
+ : new EntityCoordinates(_mapManager.GetMapEntityId(mapPos.MapId), mapPos.Position);
+
+ var ent = Spawn(msg.Prototype, spawnCoords);
+
+ var direction = msg.Target.ToMapPos(EntityManager, _transformSystem) - spawnCoords.ToMapPos(EntityManager, _transformSystem);
+ var randomizedDirection = direction + new Vector2(_random.Next(-2, 2), _random.Next(-2, 2));
+
+ _throwingSystem.TryThrow(ent, randomizedDirection, 60, msg.Performer);
+ }
+ }
+ }
+
+ private void CardsSpellCharge(CardsSpellEvent msg)
+ {
+ var xform = Transform(msg.Performer);
+
+ var count = 5 * msg.ChargeLevel;
+ var angleStep = 360f / count;
+
+ for (var i = 0; i < count; i++)
+ {
+ var angle = i * angleStep;
+
+ var direction = new Vector2(MathF.Cos(MathHelper.DegreesToRadians(angle)), MathF.Sin(MathHelper.DegreesToRadians(angle)));
+
+ foreach (var pos in _magicSystem.GetSpawnPositions(xform, msg.Pos))
+ {
+ var mapPos = _transformSystem.ToMapCoordinates(pos);
+
+ var spawnCoords = _mapManager.TryFindGridAt(mapPos, out var gridUid, out _)
+ ? pos.WithEntityId(gridUid, EntityManager)
+ : new EntityCoordinates(_mapManager.GetMapEntityId(mapPos.MapId), mapPos.Position);
+
+ var ent = Spawn(msg.Prototype, spawnCoords);
+
+ _throwingSystem.TryThrow(ent, direction, 60, msg.Performer);
+ }
+ }
+ }
+
+ private void CardsSpellAlt(CardsSpellEvent msg)
+ {
+ if (!HasComp(msg.TargetUid))
+ return;
+
+ Del(msg.TargetUid);
+ var item = Spawn(msg.Prototype);
+ _handsSystem.TryPickupAnyHand(msg.Performer, item);
+ }
+
+ #endregion
+
+ #region Fireball
+
+ private void OnFireballSpell(FireballSpellEvent msg)
+ {
+ if (msg.Handled || !CheckRequirements(msg.Action, msg.Performer))
+ return;
+
+ switch (msg.ActionUseType)
+ {
+ case ActionUseType.Default:
+ FireballSpellDefault(msg);
+ break;
+ case ActionUseType.Charge:
+ FireballSpellCharge(msg);
+ break;
+ case ActionUseType.AltUse:
+ FireballSpellAlt(msg);
+ break;
+ }
+
+ msg.Handled = true;
+ Speak(msg);
+ }
+
+ private void FireballSpellDefault(FireballSpellEvent msg)
+ {
+ var xform = Transform(msg.Performer);
+
+ foreach (var pos in _magicSystem.GetSpawnPositions(xform, msg.Pos))
+ {
+ var mapPos = _transformSystem.ToMapCoordinates(pos);
+ var spawnCoords = _mapManager.TryFindGridAt(mapPos, out var gridUid, out var grid)
+ ? pos.WithEntityId(gridUid, EntityManager)
+ : new EntityCoordinates(_mapManager.GetMapEntityId(mapPos.MapId), mapPos.Position);
+
+ var userVelocity = Vector2.Zero;
+
+ if (grid != null && TryComp(gridUid, out PhysicsComponent? physics))
+ userVelocity = physics.LinearVelocity;
+
+ var ent = Spawn(msg.Prototype, spawnCoords);
+ var direction = msg.Target.ToMapPos(EntityManager, _transformSystem) - spawnCoords.ToMapPos(EntityManager, _transformSystem);
+ _gunSystem.ShootProjectile(ent, direction, userVelocity, msg.Performer, msg.Performer);
+ }
+ }
+
+ private void FireballSpellCharge(FireballSpellEvent msg)
+ {
+ var coords = Transform(msg.Performer).Coordinates;
+
+ var targets = _lookup.GetEntitiesInRange(coords, 2 * msg.ChargeLevel);
+
+ foreach (var target in targets.Where(target => target.Owner != msg.Performer))
+ {
+ target.Comp.FireStacks += 3;
+ _flammableSystem.Ignite(target, msg.Performer);
+ }
+ }
+
+ private void FireballSpellAlt(FireballSpellEvent msg)
+ {
+ if (!TryComp(msg.TargetUid, out var flammableComponent))
+ return;
+
+ flammableComponent.FireStacks += 4;
+
+ _flammableSystem.Ignite(msg.TargetUid, msg.Performer);
+
+ EnsureComp(msg.TargetUid);
+ }
+
+ #endregion
+
+ #region Force
+
+ private void OnForceSpell(ForceSpellEvent msg)
+ {
+ if (msg.Handled || !CheckRequirements(msg.Action, msg.Performer))
+ return;
+
+ switch (msg.ActionUseType)
+ {
+ case ActionUseType.Default:
+ ForceSpellDefault(msg);
+ break;
+ case ActionUseType.Charge:
+ ForceSpellCharge(msg);
+ break;
+ case ActionUseType.AltUse:
+ ForceSpellAlt(msg);
+ break;
+ }
+
+ msg.Handled = true;
+ Speak(msg);
+ }
+
+ private void ForceSpellDefault(ForceSpellEvent msg)
+ {
+ Spawn("AdminInstantEffectMinusGravityWell", msg.Target);
+ }
+
+ private void ForceSpellCharge(ForceSpellEvent msg)
+ {
+ _gravityWell.GravPulse(msg.Performer, 15, 0, -80 * msg.ChargeLevel, -2 * msg.ChargeLevel);
+ }
+
+ private void ForceSpellAlt(ForceSpellEvent msg)
+ {
+ _gravityWell.GravPulse(msg.Target, 10, 0, 200, 10);
+ }
+
+ #endregion
+
+ #region Arc
+
+ private void OnArcSpell(ArcSpellEvent msg)
+ {
+ if (msg.Handled || !CheckRequirements(msg.Action, msg.Performer))
+ return;
+
+ switch (msg.ActionUseType)
+ {
+ case ActionUseType.Default:
+ ArcSpellDefault(msg);
+ break;
+ case ActionUseType.Charge:
+ ArcSpellCharge(msg);
+ break;
+ case ActionUseType.AltUse:
+ ArcSpellAlt(msg);
+ break;
+ }
+
+ msg.Handled = true;
+ Speak(msg);
+ }
+
+ private void ArcSpellDefault(ArcSpellEvent msg)
+ {
+ const int possibleEntitiesCount = 2;
+
+ var entitiesInRange = _lookup.GetEntitiesInRange(msg.Target, 1);
+ var entitiesToHit = entitiesInRange.Where(HasComp).Take(possibleEntitiesCount);
+
+ foreach (var entity in entitiesToHit)
+ {
+ _lightning.ShootLightning(msg.Performer, entity);
+ }
+ }
+
+ private void ArcSpellCharge(ArcSpellEvent msg)
+ {
+ _lightning.ShootRandomLightnings(msg.Performer, 2 * msg.ChargeLevel, msg.ChargeLevel * 2, arcDepth: 2);
+ }
+
+ private void ArcSpellAlt(ArcSpellEvent msg)
+ {
+ var xform = Transform(msg.Performer);
+
+ foreach (var pos in _magicSystem.GetSpawnPositions(xform, msg.Pos))
+ {
+ var mapPos = _transformSystem.ToMapCoordinates(pos);
+ var spawnCoords = _mapManager.TryFindGridAt(mapPos, out var gridUid, out var grid)
+ ? pos.WithEntityId(gridUid, EntityManager)
+ : new EntityCoordinates(_mapManager.GetMapEntityId(mapPos.MapId), mapPos.Position);
+
+ var userVelocity = Vector2.Zero;
+
+ if (grid != null && TryComp(gridUid, out PhysicsComponent? physics))
+ userVelocity = physics.LinearVelocity;
+
+ var ent = Spawn(msg.Prototype, spawnCoords);
+ var direction = msg.Target.ToMapPos(EntityManager, _transformSystem) - spawnCoords.ToMapPos(EntityManager, _transformSystem);
+ _gunSystem.ShootProjectile(ent, direction, userVelocity, msg.Performer, msg.Performer);
+ }
+ }
+
+ #endregion
+
+ #region Helpers
+
+ private void Speak(BaseActionEvent args)
+ {
+ if (args is not ISpeakSpell speak || string.IsNullOrWhiteSpace(speak.Speech))
+ return;
+
+ _chat.TrySendInGameICMessage(args.Performer, Loc.GetString(speak.Speech),
+ InGameICChatType.Speak, false);
+ }
+
+ private List GetArenaPositions(TransformComponent casterXform, int arenaSize)
+ {
+ var positions = new List();
+
+ arenaSize--;
+
+ for (var i = -arenaSize; i <= arenaSize; i++)
+ {
+ for (var j = -arenaSize; j <= arenaSize; j++)
+ {
+ var position = new Vector2(i, j);
+ var coordinates = casterXform.Coordinates.Offset(position);
+ positions.Add(coordinates);
+ }
+ }
+
+ return positions;
+ }
+
+ private bool CheckRequirements(EntityUid spell, EntityUid performer)
+ {
+ var ev = new BeforeCastSpellEvent(performer);
+ RaiseLocalEvent(spell, ref ev);
+ return !ev.Cancelled;
+ }
+
+ private void OnBeforeCastSpell(Entity ent, ref BeforeCastSpellEvent args)
+ {
+ var comp = ent.Comp;
+ var hasReqs = false;
+
+ if (comp.RequiresClothes)
+ {
+ var enumerator = _inventory.GetSlotEnumerator(args.Performer, SlotFlags.OUTERCLOTHING | SlotFlags.HEAD);
+ while (enumerator.MoveNext(out var containerSlot))
+ {
+ if (containerSlot.ContainedEntity is { } item)
+ hasReqs = HasComp(item);
+ else
+ hasReqs = false;
+
+ if (!hasReqs)
+ break;
+ }
+ }
+
+ if (!hasReqs)
+ {
+ args.Cancelled = true;
+ _popupSystem.PopupEntity("Missing Requirements! You need to wear your robe and hat!", args.Performer, args.Performer);
+ }
+ }
+
+ #endregion
+}
diff --git a/Content.Server/_White/Wizard/Scrolls/ScrollSystem.cs b/Content.Server/_White/Wizard/Scrolls/ScrollSystem.cs
new file mode 100644
index 0000000000..a1e1a33d27
--- /dev/null
+++ b/Content.Server/_White/Wizard/Scrolls/ScrollSystem.cs
@@ -0,0 +1,8 @@
+using Content.Shared._White.Wizard.ScrollSystem;
+
+namespace Content.Server._White.Wizard.Scrolls;
+
+public sealed class ScrollSystem : SharedScrollSystem
+{
+ protected override void BurnScroll(EntityUid uid) => Del(uid);
+}
diff --git a/Content.Shared/Actions/ActionEvents.cs b/Content.Shared/Actions/ActionEvents.cs
index 4715f03c70..a256167410 100644
--- a/Content.Shared/Actions/ActionEvents.cs
+++ b/Content.Shared/Actions/ActionEvents.cs
@@ -81,8 +81,10 @@ public sealed class GetItemActionsEvent : EntityEventArgs
public sealed class RequestPerformActionEvent : EntityEventArgs
{
public readonly NetEntity Action;
- public readonly NetEntity? EntityTarget;
+ public NetEntity? EntityTarget;
public readonly NetCoordinates? EntityCoordinatesTarget;
+ public ActionUseType ActionUseType = ActionUseType.Default;
+ public int ChargeLevel;
public RequestPerformActionEvent(NetEntity action)
{
@@ -148,6 +150,8 @@ public abstract partial class WorldTargetActionEvent : BaseActionEvent
/// The coordinates of the location that the user targeted.
///
public EntityCoordinates Target;
+
+ public EntityUid TargetUid;
}
///
@@ -161,4 +165,18 @@ public abstract partial class BaseActionEvent : HandledEntityEventArgs
/// The user performing the action.
///
public EntityUid Performer;
+
+ public EntityUid Action;
+
+ public ActionUseType ActionUseType = ActionUseType.Default;
+
+ public int ChargeLevel;
+}
+
+[Serializable, NetSerializable]
+public enum ActionUseType
+{
+ Default, // left mouse click.
+ Charge, // Holding right mouse click(has 4 charges).
+ AltUse // Alt + left mouse click.
}
diff --git a/Content.Shared/Actions/BaseTargetActionComponent.cs b/Content.Shared/Actions/BaseTargetActionComponent.cs
index 7e40b10c32..b96ac9ea38 100644
--- a/Content.Shared/Actions/BaseTargetActionComponent.cs
+++ b/Content.Shared/Actions/BaseTargetActionComponent.cs
@@ -1,4 +1,5 @@
using Content.Shared.Interaction;
+using Robust.Shared.Audio;
namespace Content.Shared.Actions;
@@ -40,4 +41,28 @@ public abstract partial class BaseTargetActionComponent : BaseActionComponent
/// over lay in place of the currently held item "held item".
///
[DataField("targetingIndicator")] public bool TargetingIndicator = true;
+
+ [DataField]
+ public bool IsAltEnabled;
+
+ [DataField]
+ public bool IsChargeEnabled;
+
+ [DataField]
+ public string ChargeProto = "MagicFollowerEntity";
+
+ [DataField]
+ public int MaxChargeLevel = 4;
+
+ [DataField]
+ public SoundSpecifier ChargingSound = new SoundPathSpecifier("/Audio/White/Magic/chargingfallback.ogg");
+
+ [DataField]
+ public bool LoopCharging = true;
+
+ [DataField]
+ public SoundSpecifier MaxChargedSound = new SoundPathSpecifier("/Audio/White/Magic/maxchargefallback.ogg");
+
+ [DataField]
+ public bool LoopMaxCharged;
}
diff --git a/Content.Shared/Actions/SharedActionsSystem.cs b/Content.Shared/Actions/SharedActionsSystem.cs
index df469f4ac1..dbe3fc8673 100644
--- a/Content.Shared/Actions/SharedActionsSystem.cs
+++ b/Content.Shared/Actions/SharedActionsSystem.cs
@@ -413,6 +413,8 @@ public abstract class SharedActionsSystem : EntitySystem
if (worldAction.Event != null)
{
worldAction.Event.Target = entityCoordinatesTarget;
+ if (ev.EntityTarget != null)
+ worldAction.Event.TargetUid = GetEntity(ev.EntityTarget.Value);
Dirty(actionEnt, worldAction);
performEvent = worldAction.Event;
}
@@ -430,7 +432,12 @@ public abstract class SharedActionsSystem : EntitySystem
}
if (performEvent != null)
+ {
performEvent.Performer = user;
+ performEvent.Action = actionEnt;
+ performEvent.ActionUseType = ev.ActionUseType;
+ performEvent.ChargeLevel = ev.ChargeLevel;
+ }
// All checks passed. Perform the action!
PerformAction(user, component, actionEnt, action, performEvent, curTime);
@@ -677,6 +684,8 @@ public abstract class SharedActionsSystem : EntitySystem
/// Entity to receive the actions
/// The actions to add
/// The entity that enables these actions (e.g., flashlight). May be null (innate actions).
+ /// ActionsComponent.
+ /// ActionContainerComponent.
public void GrantActions(EntityUid performer, IEnumerable actions, EntityUid container, ActionsComponent? comp = null, ActionsContainerComponent? containerComp = null)
{
if (!Resolve(container, ref containerComp))
diff --git a/Content.Shared/Bed/Sleep/SleepEmitSoundComponent.cs b/Content.Shared/Bed/Sleep/SleepEmitSoundComponent.cs
index 6313f633f2..2599bb5c2f 100644
--- a/Content.Shared/Bed/Sleep/SleepEmitSoundComponent.cs
+++ b/Content.Shared/Bed/Sleep/SleepEmitSoundComponent.cs
@@ -22,10 +22,4 @@ public sealed partial class SleepEmitSoundComponent : Component
///
[DataField, ViewVariables(VVAccess.ReadWrite)]
public float Chance = 0.33f;
-
- ///
- /// Popup for snore (e.g. Zzz...)
- ///
- [DataField, ViewVariables(VVAccess.ReadWrite)]
- public LocId PopUp = "sleep-onomatopoeia";
}
diff --git a/Content.Shared/Damage/Components/StaminaDamageOnCollideComponent.cs b/Content.Shared/Damage/Components/StaminaDamageOnCollideComponent.cs
index 5ed2bb628e..496614fbda 100644
--- a/Content.Shared/Damage/Components/StaminaDamageOnCollideComponent.cs
+++ b/Content.Shared/Damage/Components/StaminaDamageOnCollideComponent.cs
@@ -11,6 +11,9 @@ public sealed partial class StaminaDamageOnCollideComponent : Component
[ViewVariables(VVAccess.ReadWrite), DataField("damage")]
public float Damage = 55f;
+ [ViewVariables(VVAccess.ReadWrite), DataField]
+ public bool IgnoreResistances = true;
+
[DataField("sound")]
public SoundSpecifier? Sound;
}
diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs
index 52eef1183a..0b1e9f083c 100644
--- a/Content.Shared/Damage/Systems/StaminaSystem.cs
+++ b/Content.Shared/Damage/Systems/StaminaSystem.cs
@@ -1,4 +1,5 @@
using System.Linq;
+using Content.Shared._White.StaminaProtection;
using Content.Shared.Administration.Logs;
using Content.Shared.Alert;
using Content.Shared.CombatMode;
@@ -204,7 +205,18 @@ public sealed partial class StaminaSystem : EntitySystem
if (ev.Cancelled)
return;
- TakeStaminaDamage(target, component.Damage, source: uid, sound: component.Sound);
+ // WD EDIT START
+ var damage = component.Damage;
+
+ if (!component.IgnoreResistances)
+ {
+ var modifyEv = new StaminaDamageModifyEvent {Damage = damage};
+ RaiseLocalEvent(target, modifyEv);
+ damage = modifyEv.Damage;
+ }
+
+ TakeStaminaDamage(target, damage, source: uid, sound: component.Sound);
+ // WD EDIT END
}
private void SetStaminaAlert(EntityUid uid, StaminaComponent? component = null)
diff --git a/Content.Shared/Implants/Components/ImplanterComponent.cs b/Content.Shared/Implants/Components/ImplanterComponent.cs
index 32a3636163..23549bb21a 100644
--- a/Content.Shared/Implants/Components/ImplanterComponent.cs
+++ b/Content.Shared/Implants/Components/ImplanterComponent.cs
@@ -57,6 +57,11 @@ public sealed partial class ImplanterComponent : Component
[DataField, AutoNetworkedField]
public bool ImplantOnly;
+ // WD START
+ [DataField]
+ public bool SingleUse = true;
+ // WD END
+
///
/// The current mode of the implanter
/// Mode is changed automatically depending if it implants or draws
diff --git a/Content.Shared/Implants/SharedImplanterSystem.cs b/Content.Shared/Implants/SharedImplanterSystem.cs
index 2728709606..27ca89970f 100644
--- a/Content.Shared/Implants/SharedImplanterSystem.cs
+++ b/Content.Shared/Implants/SharedImplanterSystem.cs
@@ -117,6 +117,9 @@ public abstract class SharedImplanterSystem : EntitySystem
_container.Insert(implant.Value, implantContainer);
RaiseLocalEvent(implant.Value, new SubdermalImplantInserted(user, target, implantComp)); //WD EDIT
+ if (component.CurrentMode == ImplanterToggleMode.Inject && component.SingleUse) // WD EDIT
+ component.ImplantOnly = true;
+
if (component.CurrentMode == ImplanterToggleMode.Inject && !component.ImplantOnly)
DrawMode(implanter, component);
else
@@ -205,7 +208,8 @@ public abstract class SharedImplanterSystem : EntitySystem
break;
}
- if (component.CurrentMode == ImplanterToggleMode.Draw && !component.ImplantOnly && !permanentFound)
+ if (component.CurrentMode == ImplanterToggleMode.Draw && !component.ImplantOnly && !permanentFound &&
+ implanterContainer.Count > 0) // WD EDIT
ImplantMode(implanter, component);
Dirty(implanter, component);
diff --git a/Content.Shared/Inventory/InventorySystem.Relay.cs b/Content.Shared/Inventory/InventorySystem.Relay.cs
index 89cb3c61a6..bb5413bfb2 100644
--- a/Content.Shared/Inventory/InventorySystem.Relay.cs
+++ b/Content.Shared/Inventory/InventorySystem.Relay.cs
@@ -1,3 +1,4 @@
+using Content.Shared._White.StaminaProtection;
using Content.Shared.Chemistry;
using Content.Shared.Damage;
using Content.Shared.Electrocution;
@@ -27,6 +28,7 @@ public partial class InventorySystem
SubscribeLocalEvent(RelayInventoryEvent);
SubscribeLocalEvent(RelayInventoryEvent);
SubscribeLocalEvent(RelayInventoryEvent); // WD
+ SubscribeLocalEvent(RelayInventoryEvent); // WD
SubscribeLocalEvent(RelayInventoryEvent);
// by-ref events
diff --git a/Content.Shared/Speech/ScreamActionEvent.cs b/Content.Shared/Speech/ScreamActionEvent.cs
deleted file mode 100644
index 756f65a35d..0000000000
--- a/Content.Shared/Speech/ScreamActionEvent.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-using Content.Shared.Actions;
-
-namespace Content.Shared.Speech;
-
-public sealed partial class ScreamActionEvent : InstantActionEvent
-{
-}
diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs
index 749961def2..2e85803d7d 100644
--- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs
+++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs
@@ -123,6 +123,14 @@ public abstract partial class SharedGunSystem
private void OnGunSelected(EntityUid uid, GunComponent component, HandSelectedEvent args)
{
+ // WD EDIT START
+ if (component.FireRateModified <= 0f)
+ component.FireRateModified = component.FireRate;
+
+ if (component.FireRateModified <= 0f)
+ return;
+ // WD EDIT END
+
var fireDelay = 1f / component.FireRateModified;
if (fireDelay.Equals(0f))
return;
diff --git a/Content.Shared/_White/BetrayalDagger/BackstabSystem.cs b/Content.Shared/_White/BetrayalDagger/BackstabSystem.cs
index 72882c38de..fa11986080 100644
--- a/Content.Shared/_White/BetrayalDagger/BackstabSystem.cs
+++ b/Content.Shared/_White/BetrayalDagger/BackstabSystem.cs
@@ -48,5 +48,10 @@ public sealed class BackstabSystem : EntitySystem
args.PenetrateArmor = ent.Comp.PenetrateArmor;
+ if (!_net.IsServer)
+ return;
+
+ var message = Loc.GetString("backstab-damage-betrayal-dagger", ("damage", damage));
+ _popup.PopupClient(message, args.User, args.User, PopupType.MediumCaution);
}
}
diff --git a/Content.Shared/_White/Chemistry/HasComponentCondition.cs b/Content.Shared/_White/Chemistry/HasComponentCondition.cs
new file mode 100644
index 0000000000..c6f37a1a19
--- /dev/null
+++ b/Content.Shared/_White/Chemistry/HasComponentCondition.cs
@@ -0,0 +1,23 @@
+using Content.Shared.Chemistry.Reagent;
+using JetBrains.Annotations;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared._White.Chemistry;
+
+[UsedImplicitly]
+public sealed partial class HasComponent : ReagentEffectCondition
+{
+ [DataField]
+ public string Component = default!;
+
+ public override bool Condition(ReagentEffectArgs args)
+ {
+ return args.EntityManager.HasComponent(args.SolutionEntity,
+ args.EntityManager.ComponentFactory.GetRegistration(Component).Type);
+ }
+
+ public override string GuidebookExplanation(IPrototypeManager prototype)
+ {
+ return string.Empty;
+ }
+}
diff --git a/Content.Shared/_White/StaminaProtection/StaminaProtectionSystem.cs b/Content.Shared/_White/StaminaProtection/StaminaProtectionSystem.cs
new file mode 100644
index 0000000000..934ebce818
--- /dev/null
+++ b/Content.Shared/_White/StaminaProtection/StaminaProtectionSystem.cs
@@ -0,0 +1,32 @@
+using Content.Shared.Armor;
+using Content.Shared.Inventory;
+
+namespace Content.Shared._White.StaminaProtection;
+
+public sealed class StaminaProtectionSystem : EntitySystem
+{
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent>(OnDamageModify);
+ }
+
+ private void OnDamageModify(Entity ent, ref InventoryRelayedEvent args)
+ {
+ var modifiers = ent.Comp.Modifiers;
+
+ if (modifiers.FlatReduction.TryGetValue("Blunt", out var flat))
+ args.Args.Damage = MathF.Max(0f, args.Args.Damage - flat);
+
+ if (modifiers.Coefficients.TryGetValue("Blunt", out var coefficient))
+ args.Args.Damage *= coefficient;
+ }
+}
+
+public sealed class StaminaDamageModifyEvent : EntityEventArgs, IInventoryRelayEvent
+{
+ public SlotFlags TargetSlots => ~SlotFlags.POCKET;
+
+ public float Damage;
+}
diff --git a/Content.Shared/_White/Wizard/Charging/SharedChargingSystem.cs b/Content.Shared/_White/Wizard/Charging/SharedChargingSystem.cs
new file mode 100644
index 0000000000..2f5984bd4c
--- /dev/null
+++ b/Content.Shared/_White/Wizard/Charging/SharedChargingSystem.cs
@@ -0,0 +1,5 @@
+namespace Content.Shared._White.Wizard.Charging;
+
+public abstract class SharedChargingSystem : EntitySystem
+{
+}
diff --git a/Content.Shared/_White/Wizard/Magic/MagicComponent.cs b/Content.Shared/_White/Wizard/Magic/MagicComponent.cs
new file mode 100644
index 0000000000..a43001ca53
--- /dev/null
+++ b/Content.Shared/_White/Wizard/Magic/MagicComponent.cs
@@ -0,0 +1,13 @@
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._White.Wizard.Magic;
+
+[RegisterComponent, NetworkedComponent]
+public sealed partial class MagicComponent : Component
+{
+ ///
+ /// Does this spell require Wizard Robes & Hat?
+ ///
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
+ public bool RequiresClothes;
+}
diff --git a/Content.Shared/_White/Wizard/Magic/WizardClothesComponent.cs b/Content.Shared/_White/Wizard/Magic/WizardClothesComponent.cs
new file mode 100644
index 0000000000..13283f849d
--- /dev/null
+++ b/Content.Shared/_White/Wizard/Magic/WizardClothesComponent.cs
@@ -0,0 +1,9 @@
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._White.Wizard.Magic;
+
+[RegisterComponent, NetworkedComponent]
+public sealed partial class WizardClothesComponent : Component
+{
+
+}
diff --git a/Content.Shared/_White/Wizard/ScrollSystem/ScrollComponent.cs b/Content.Shared/_White/Wizard/ScrollSystem/ScrollComponent.cs
new file mode 100644
index 0000000000..f14576519b
--- /dev/null
+++ b/Content.Shared/_White/Wizard/ScrollSystem/ScrollComponent.cs
@@ -0,0 +1,43 @@
+using Robust.Shared.Audio;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._White.Wizard.ScrollSystem;
+
+[RegisterComponent, NetworkedComponent, Access(typeof(SharedScrollSystem))]
+public sealed partial class ScrollComponent : Component
+{
+ ///
+ /// ActionId to give on use.
+ ///
+ [DataField]
+ [ViewVariables]
+ public string ActionId;
+
+ ///
+ /// How time it takes to learn.
+ ///
+ [DataField]
+ [ViewVariables(VVAccess.ReadWrite)]
+ public float LearnTime = 5f;
+
+ ///
+ /// Popup on learn.
+ ///
+ [DataField]
+ [ViewVariables]
+ public string LearnPopup;
+
+ ///
+ /// Sound to play on use.
+ ///
+ [DataField]
+ [ViewVariables]
+ public SoundSpecifier UseSound;
+
+ ///
+ /// Sound to play after use.
+ ///
+ [DataField]
+ [ViewVariables]
+ public SoundSpecifier AfterUseSound;
+}
diff --git a/Content.Shared/_White/Wizard/ScrollSystem/SharedScrollSystem.cs b/Content.Shared/_White/Wizard/ScrollSystem/SharedScrollSystem.cs
new file mode 100644
index 0000000000..6d267eaf17
--- /dev/null
+++ b/Content.Shared/_White/Wizard/ScrollSystem/SharedScrollSystem.cs
@@ -0,0 +1,87 @@
+using Content.Shared.Actions;
+using Content.Shared.DoAfter;
+using Content.Shared.Interaction.Events;
+using Content.Shared.Popups;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Network;
+
+namespace Content.Shared._White.Wizard.ScrollSystem;
+
+public abstract class SharedScrollSystem : EntitySystem
+{
+ #region Dependencies
+
+ [Dependency] private readonly INetManager _net = default!;
+ [Dependency] private readonly SharedAudioSystem _audioSystem = default!;
+ [Dependency] private readonly SharedActionsSystem _actionsSystem = default!;
+ [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!;
+ [Dependency] private readonly SharedPopupSystem _popupSystem = default!;
+
+ #endregion
+
+ #region Init
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnScrollUse);
+ SubscribeLocalEvent(OnScrollDoAfter);
+ }
+
+ #endregion
+
+ #region Handlers
+
+ private void OnScrollUse(EntityUid uid, ScrollComponent component, UseInHandEvent args)
+ {
+ if (args.Handled)
+ return;
+
+ var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.LearnTime, new ScrollDoAfterEvent(), uid, target: uid)
+ {
+ BreakOnTargetMove = true,
+ BreakOnUserMove = true,
+ BreakOnDamage = true,
+ NeedHand = true
+ };
+
+ if (_net.IsServer)
+ {
+ _audioSystem.PlayPvs(component.UseSound, args.User);
+ }
+
+ _popupSystem.PopupClient($"You start learning about {component.LearnPopup}.", args.User, args.User, PopupType.Medium);
+
+ _doAfterSystem.TryStartDoAfter(doAfterEventArgs);
+
+ args.Handled = true;
+ }
+
+ private void OnScrollDoAfter(EntityUid uid, ScrollComponent component, ScrollDoAfterEvent args)
+ {
+ if (args.Handled || args.Cancelled)
+ return;
+
+ _actionsSystem.AddAction(args.User, component.ActionId);
+
+ if (_net.IsServer)
+ {
+ _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);
+
+ BurnScroll(uid);
+
+ args.Handled = true;
+ }
+
+ #endregion
+
+ #region Helpers
+
+ protected virtual void BurnScroll(EntityUid uid) {}
+
+ #endregion
+}
diff --git a/Content.Shared/_White/Wizard/WizardEvents.cs b/Content.Shared/_White/Wizard/WizardEvents.cs
new file mode 100644
index 0000000000..c5d6d7e055
--- /dev/null
+++ b/Content.Shared/_White/Wizard/WizardEvents.cs
@@ -0,0 +1,175 @@
+using Content.Shared.Actions;
+using Content.Shared.DoAfter;
+using Content.Shared.Magic;
+using Robust.Shared.Audio;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
+
+namespace Content.Shared._White.Wizard;
+
+#region HelperEvents
+
+[Serializable, NetSerializable]
+public sealed partial class ScrollDoAfterEvent : SimpleDoAfterEvent
+{
+}
+
+[ByRefEvent]
+public struct BeforeCastSpellEvent
+{
+ public EntityUid Performer;
+
+ public bool Cancelled;
+
+ public BeforeCastSpellEvent(EntityUid performer)
+ {
+ Performer = performer;
+ }
+}
+
+[Serializable, NetSerializable]
+public sealed partial class AddWizardChargeEvent : EntityEventArgs
+{
+ public string ChargeProto;
+
+ public AddWizardChargeEvent(string chargeProto)
+ {
+ ChargeProto = chargeProto;
+ }
+}
+
+[Serializable, NetSerializable]
+public sealed partial class RemoveWizardChargeEvent : EntityEventArgs
+{
+}
+
+[Serializable, NetSerializable]
+public sealed partial class RequestSpellChargingAudio : EntityEventArgs
+{
+ public SoundSpecifier Sound;
+ public bool Loop;
+
+ public RequestSpellChargingAudio(SoundSpecifier sound, bool loop)
+ {
+ Sound = sound;
+ Loop = loop;
+ }
+}
+
+[Serializable, NetSerializable]
+public sealed partial class RequestSpellChargedAudio : EntityEventArgs
+{
+ public SoundSpecifier Sound;
+ public bool Loop;
+
+ public RequestSpellChargedAudio(SoundSpecifier sound, bool loop)
+ {
+ Sound = sound;
+ Loop = loop;
+ }
+}
+
+[Serializable, NetSerializable]
+public sealed partial class RequestAudioSpellStop : EntityEventArgs
+{
+}
+
+#endregion
+
+#region Spells
+
+public sealed partial class ArcSpellEvent : WorldTargetActionEvent, ISpeakSpell
+{
+ [DataField("prototype", required: true, customTypeSerializer: typeof(PrototypeIdSerializer))]
+ public string Prototype = default!;
+
+ [DataField("posData")]
+ public MagicSpawnData Pos = new TargetCasterPos();
+
+ [DataField("speech")]
+ public string? Speech { get; private set; }
+}
+
+public sealed partial class ForceSpellEvent : WorldTargetActionEvent, ISpeakSpell
+{
+ [DataField("speech")]
+ public string? Speech { get; private set; }
+}
+
+public sealed partial class FireballSpellEvent : WorldTargetActionEvent, ISpeakSpell
+{
+ [DataField("prototype", required: true, customTypeSerializer: typeof(PrototypeIdSerializer))]
+ public string Prototype = default!;
+
+ [DataField("posData")]
+ public MagicSpawnData Pos = new TargetCasterPos();
+
+ [DataField("speech")]
+ public string? Speech { get; private set; }
+}
+
+public sealed partial class CardsSpellEvent : WorldTargetActionEvent, ISpeakSpell
+{
+ [DataField("prototype", required: true, customTypeSerializer: typeof(PrototypeIdSerializer))]
+ public string Prototype = default!;
+
+ [DataField("posData")]
+ public MagicSpawnData Pos = new TargetCasterPos();
+
+ [DataField("speech")]
+ public string? Speech { get; private set; }
+}
+
+public sealed partial class ForceWallSpellEvent : WorldTargetActionEvent, ISpeakSpell
+{
+ [DataField("prototype", required: true, customTypeSerializer: typeof(PrototypeIdSerializer))]
+ public string Prototype = default!;
+
+ [DataField("speech")]
+ public string? Speech { get; private set; }
+}
+
+public sealed partial class BlinkSpellEvent : InstantActionEvent, ISpeakSpell
+{
+ [DataField("speech")]
+ public string? Speech { get; private set; }
+}
+
+public sealed partial class EtherealJauntSpellEvent : InstantActionEvent, ISpeakSpell
+{
+ [DataField("speech")]
+ public string? Speech { get; private set; }
+}
+
+public sealed partial class EmpSpellEvent : InstantActionEvent, ISpeakSpell
+{
+ [DataField("speech")]
+ public string? Speech { get; private set; }
+}
+
+public sealed partial class CluwneCurseSpellEvent : EntityTargetActionEvent, ISpeakSpell
+{
+ [DataField("speech")]
+ public string? Speech { get; private set; }
+}
+
+public sealed partial class BananaTouchSpellEvent : EntityTargetActionEvent, ISpeakSpell
+{
+ [DataField("speech")]
+ public string? Speech { get; private set; }
+}
+
+public sealed partial class MimeTouchSpellEvent : EntityTargetActionEvent, ISpeakSpell
+{
+ [DataField("speech")]
+ public string? Speech { get; private set; }
+}
+
+public sealed partial class InstantRecallSpellEvent : InstantActionEvent, ISpeakSpell
+{
+ [DataField("speech")]
+ public string? Speech { get; private set; }
+}
+
+#endregion
diff --git a/Resources/Audio/Machines/attributions.yml b/Resources/Audio/Machines/attributions.yml
index a0f1c9f7e7..5ef62f6d5d 100644
--- a/Resources/Audio/Machines/attributions.yml
+++ b/Resources/Audio/Machines/attributions.yml
@@ -152,3 +152,23 @@
license: "CC0-1.0"
copyright: "dakamakat on freesound.org"
source: "https://freesound.org/people/Dakamakat/sounds/717370/"
+
+- files: ["energyshield_up.ogg"]
+ license: "CC0-1.0"
+ copyright: "unfa on freesound.org"
+ source: "https://freesound.org/people/unfa/sounds/584173/"
+
+- files: ["energyshield_down.ogg"]
+ license: "CC-BY-4.0"
+ copyright: "SilverIllusionist on freesound.org"
+ source: "https://freesound.org/people/SilverIllusionist/sounds/673556/"
+
+- files: ["energyshield_ambient.ogg"]
+ license: "CC0-1.0"
+ copyright: "julianmateo_ on freesound.org"
+ source: "https://freesound.org/people/julianmateo_/sounds/524165/"
+
+- files: ["energyshield_parry.ogg"]
+ license: "CC-BY-4.0"
+ copyright: "Robinhood76 on freesound.org"
+ source: "https://freesound.org/people/Robinhood76/sounds/107613/"
\ No newline at end of file
diff --git a/Resources/Audio/Machines/energyshield_ambient.ogg b/Resources/Audio/Machines/energyshield_ambient.ogg
new file mode 100644
index 0000000000..ea560a076b
Binary files /dev/null and b/Resources/Audio/Machines/energyshield_ambient.ogg differ
diff --git a/Resources/Audio/Machines/energyshield_down.ogg b/Resources/Audio/Machines/energyshield_down.ogg
new file mode 100644
index 0000000000..a92915ff07
Binary files /dev/null and b/Resources/Audio/Machines/energyshield_down.ogg differ
diff --git a/Resources/Audio/Machines/energyshield_parry.ogg b/Resources/Audio/Machines/energyshield_parry.ogg
new file mode 100644
index 0000000000..4c5d1517a2
Binary files /dev/null and b/Resources/Audio/Machines/energyshield_parry.ogg differ
diff --git a/Resources/Audio/Machines/energyshield_up.ogg b/Resources/Audio/Machines/energyshield_up.ogg
new file mode 100644
index 0000000000..9f0121a7b5
Binary files /dev/null and b/Resources/Audio/Machines/energyshield_up.ogg differ
diff --git a/Resources/Audio/White/Items/scroll/after_use.ogg b/Resources/Audio/White/Items/scroll/after_use.ogg
new file mode 100644
index 0000000000..bd87b67f08
Binary files /dev/null and b/Resources/Audio/White/Items/scroll/after_use.ogg differ
diff --git a/Resources/Audio/White/Items/scroll/use.ogg b/Resources/Audio/White/Items/scroll/use.ogg
new file mode 100644
index 0000000000..9789a13817
Binary files /dev/null and b/Resources/Audio/White/Items/scroll/use.ogg differ
diff --git a/Resources/Audio/White/Magic/Arc/cast.ogg b/Resources/Audio/White/Magic/Arc/cast.ogg
new file mode 100644
index 0000000000..1562ecbb1b
Binary files /dev/null and b/Resources/Audio/White/Magic/Arc/cast.ogg differ
diff --git a/Resources/Audio/White/Magic/Arc/charge.ogg b/Resources/Audio/White/Magic/Arc/charge.ogg
new file mode 100644
index 0000000000..94b6abbd9e
Binary files /dev/null and b/Resources/Audio/White/Magic/Arc/charge.ogg differ
diff --git a/Resources/Audio/White/Magic/Arc/max.ogg b/Resources/Audio/White/Magic/Arc/max.ogg
new file mode 100644
index 0000000000..cb2bfa608c
Binary files /dev/null and b/Resources/Audio/White/Magic/Arc/max.ogg differ
diff --git a/Resources/Audio/White/Magic/Cards/cast.ogg b/Resources/Audio/White/Magic/Cards/cast.ogg
new file mode 100644
index 0000000000..bc8cf03553
Binary files /dev/null and b/Resources/Audio/White/Magic/Cards/cast.ogg differ
diff --git a/Resources/Audio/White/Magic/Cards/charge.ogg b/Resources/Audio/White/Magic/Cards/charge.ogg
new file mode 100644
index 0000000000..ee9957ae2c
Binary files /dev/null and b/Resources/Audio/White/Magic/Cards/charge.ogg differ
diff --git a/Resources/Audio/White/Magic/Cards/max.ogg b/Resources/Audio/White/Magic/Cards/max.ogg
new file mode 100644
index 0000000000..cb2bfa608c
Binary files /dev/null and b/Resources/Audio/White/Magic/Cards/max.ogg differ
diff --git a/Resources/Audio/White/Magic/Force/cast.ogg b/Resources/Audio/White/Magic/Force/cast.ogg
new file mode 100644
index 0000000000..88d12fbd89
Binary files /dev/null and b/Resources/Audio/White/Magic/Force/cast.ogg differ
diff --git a/Resources/Audio/White/Magic/Force/charge.ogg b/Resources/Audio/White/Magic/Force/charge.ogg
new file mode 100644
index 0000000000..a227dfc0e2
Binary files /dev/null and b/Resources/Audio/White/Magic/Force/charge.ogg differ
diff --git a/Resources/Audio/White/Magic/Force/max.ogg b/Resources/Audio/White/Magic/Force/max.ogg
new file mode 100644
index 0000000000..cb2bfa608c
Binary files /dev/null and b/Resources/Audio/White/Magic/Force/max.ogg differ
diff --git a/Resources/Audio/White/Magic/chargingfallback.ogg b/Resources/Audio/White/Magic/chargingfallback.ogg
new file mode 100644
index 0000000000..4a7ba5bd80
Binary files /dev/null and b/Resources/Audio/White/Magic/chargingfallback.ogg differ
diff --git a/Resources/Audio/White/Magic/maxchargefallback.ogg b/Resources/Audio/White/Magic/maxchargefallback.ogg
new file mode 100644
index 0000000000..1a34e0484a
Binary files /dev/null and b/Resources/Audio/White/Magic/maxchargefallback.ogg differ
diff --git a/Resources/Changelog/ChangelogWhite.yml b/Resources/Changelog/ChangelogWhite.yml
index 59a39228da..273d2af537 100644
--- a/Resources/Changelog/ChangelogWhite.yml
+++ b/Resources/Changelog/ChangelogWhite.yml
@@ -1914,3 +1914,260 @@
id: 177
time: '2024-03-02T14:17:52.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/152
+- author: Aviu
+ changes:
+ - message: "\u0411\u0417 \u0442\u0435\u043F\u0435\u0440\u044C \u0443\u0441\u044B\
+ \u043F\u043B\u044F\u0435\u0442 \u0433\u0435\u043D\u043E\u043A\u0440\u0430\u0434\
+ \u043E\u0432."
+ type: Add
+ - message: "\u041D\u0438\u0442\u0440\u0438\u0443\u043C \u0441\u043D\u043E\u0432\u0430\
+ \ \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442."
+ type: Fix
+ id: 178
+ time: '2024-03-03T08:09:04.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/167
+- author: ThereDrD
+ changes:
+ - message: "\u0424\u0438\u043A\u0441 \u043F\u0443\u0441\u0442\u044B\u0445 \u0441\
+ \u0442\u0440\u043E\u0447\u0435\u043A \u0432\u043C\u0435\u0441\u0442\u043E \u043F\
+ \u043E\u043F\u0430\u043F\u043E\u0432"
+ type: Fix
+ - message: "\u0424\u0438\u043A\u0441 \u043F\u0440\u043E\u043F\u0430\u0432\u0448\u0438\
+ \u0445 \u043F\u043E\u043F\u0430\u043F\u043E\u0432"
+ type: Fix
+ id: 179
+ time: '2024-03-04T06:56:23.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/176
+- author: Aviu
+ changes:
+ - message: "\u0422\u041A \u0437\u0430 \u0432\u043E\u0439\u043D\u0443 20 -> 30."
+ type: Tweak
+ - message: "\u041A\u043E\u0441\u0430 \u0436\u043D\u0435\u0446\u0430: \u0443\u0440\
+ \u043E\u043D 27 -> 24."
+ type: Tweak
+ - message: "\u041F\u043E\u0441\u043E\u0445 \u043C\u043E\u043D\u0430\u0445\u0430\
+ : \u0443\u0440\u043E\u043D 20 -> 18."
+ type: Tweak
+ - message: "\u041D\u0435\u0447\u0435\u0441\u0442\u0438\u0432\u044B\u0435 \u0432\u0438\
+ \u043B\u044B: \u0443\u0440\u043E\u043D 25 -> 24."
+ type: Tweak
+ - message: "\u0413\u0438\u043F\u0435\u0440\u0438\u043D\u0441\u0442\u0440\u0443\u043C\
+ \u0435\u043D\u0442: \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C \u0430\u0442\
+ \u0430\u043A\u0438 0.75 -> 1, \u0443\u0440\u043E\u043D \u043F\u043E \u0441\u0442\
+ \u0430\u043C\u0438\u043D\u0435 60 -> 40."
+ type: Tweak
+ - message: "\u0423 \u0432\u043D\u0435\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\
+ \u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u043B\u0438\u043D\
+ \u043A\u0430 \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u0435\u0442\u0441\u044F\
+ \ \u0443\u0440\u043E\u043D \u0441 \u041F\u041A\u041C \u0430\u0442\u0430\u043A\
+ \u0438, \u043A\u0430\u043A \u0438 \u0443 \u043E\u0441\u0442\u0430\u043B\u044C\
+ \u043D\u044B\u0445 \u043E\u0440\u0443\u0436\u0438\u0439."
+ type: Tweak
+ - message: "\u0413\u043B\u0443\u0448\u0438\u043B\u043A\u0430 \u0440\u0430\u0434\u0438\
+ \u043E: \u0446\u0435\u043D\u0430 4 -> 2."
+ type: Tweak
+ - message: "\u0421\u0432\u0438\u043D\u0446\u043E\u0432\u044B\u0435 \u0431\u043E\u043A\
+ \u0441\u0435\u0440\u0441\u043A\u0438\u0435 \u043F\u0435\u0440\u0447\u0430\u0442\
+ \u043A\u0438: \u0443\u0440\u043E\u043D 8 -> 10, \u0443\u0440\u043E\u043D \u043F\
+ \u043E \u0441\u0442\u0430\u043C\u0438\u043D\u0435 25 -> 30, \u0441\u043A\u043E\
+ \u0440\u043E\u0441\u0442\u044C \u0430\u0442\u0430\u043A\u0438 1.4 -> 1.5."
+ type: Tweak
+ - message: "\u0421\u0435\u0442\u0447\u0430\u0442\u044B\u0439 \u0436\u0438\u043B\u0435\
+ \u0442: \u0440\u0435\u0437\u0438\u0441\u0442 \u043A \u043F\u0440\u043E\u043D\
+ \u0438\u043A\u0430\u044E\u0449\u0435\u043C\u0443 \u0443\u0440\u043E\u043D\u0443\
+ \ 70 -> 60, \u043A \u0442\u0435\u043F\u043B\u043E\u0432\u043E\u043C\u0443 10\
+ \ -> 20."
+ type: Tweak
+ - message: "\u0421\u0442\u0430\u043D\u043F\u0440\u043E\u0434 \u0438 \u0441\u043D\
+ \u0430\u0442\u0447\u0435\u0440\u043F\u0440\u043E\u0434: \u0443\u0440\u043E\u043D\
+ \ \u043F\u043E \u0441\u0442\u0430\u043C\u0438\u043D\u0435 30 -> 40."
+ type: Tweak
+ - message: "\u0418\u0437\u043C\u0435\u043D\u0435\u043D \u043A\u0440\u0430\u0444\u0442\
+ \ \u0441\u0442\u0430\u043D\u043F\u0440\u043E\u0434\u0430 \u0438 \u0441\u043D\
+ \u0430\u0442\u0447\u0435\u0440\u043F\u0440\u043E\u0434\u0430, \u0442\u0435\u043F\
+ \u0435\u0440\u044C \u043D\u0443\u0436\u043D\u043E \u043A\u043B\u0438\u043A\u043D\
+ \u0443\u0442\u044C \u0441\u0442\u0435\u0440\u0436\u043D\u044F\u043C\u0438 \u043F\
+ \u043E \u0441\u0442\u044F\u0436\u043A\u0430\u043C, \u0434\u043E\u0431\u0430\u0432\
+ \u0438\u0442\u044C \u0438\u0433\u043D\u0438\u0442\u0435\u0440 \u0438 \u043A\u043E\
+ \u043D\u0434\u0435\u043D\u0441\u0430\u0442\u043E\u0440/\u0442\u0435\u043B\u0435\
+ \u043A\u0440\u0438\u0441\u0442\u0430\u043B\u043B."
+ type: Tweak
+ - message: "\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D \u043A\u0440\u0430\
+ \u0444\u0442 \u0441\u0442\u0430\u043D\u043F\u0440\u043E\u0434\u0430 \u0432 \u043C\
+ \u0435\u043D\u044E \u043A\u0440\u0430\u0444\u0442\u0430."
+ type: Tweak
+ - message: "\u0412 \u0432\u0435\u043D\u0434\u043E\u043C\u0430\u0442\u0435 \u0442\
+ \u0435\u043F\u0435\u0440\u044C 5 \u0438\u0433\u043D\u0438\u0442\u0435\u0440\u043E\
+ \u0432 \u0438 4 \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043A\
+ \u0430 \u0441\u0438\u0433\u043D\u0430\u043B\u0430."
+ type: Tweak
+ id: 180
+ time: '2024-03-04T07:02:16.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/170
+- author: Aviu
+ changes:
+ - message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u043F\u0440\u043E\u0434\
+ \u0432\u0438\u043D\u0443\u0442\u044B\u0439 \u0438\u043C\u043F\u043B\u0430\u043D\
+ \u0442\u0435\u0440 \u0432 \u0430\u043F\u043B\u0438\u043D\u043A."
+ type: Add
+ - message: "\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u043E \u0432\u0440\u0435\
+ \u043C\u044F \u0432\u043A\u0430\u043B\u044B\u0432\u0430\u043D\u0438\u044F \u0438\
+ \u043C\u043F\u043B\u0430\u043D\u0442\u043E\u0432 \u0441\u0438\u043D\u0434\u0438\
+ \u043A\u0430\u0442\u0430 5s -> 2s."
+ type: Tweak
+ - message: "\u0412\u0441\u0435 \u0438\u043C\u043F\u043B\u0430\u043D\u0442\u0435\u0440\
+ \u044B \u0442\u0435\u043F\u0435\u0440\u044C \u043E\u0434\u043D\u043E\u0440\u0430\
+ \u0437\u043E\u0432\u044B\u0435, \u0442\u043E \u0435\u0441\u0442\u044C \u043B\
+ \u043E\u043C\u0430\u044E\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u0432\
+ \u043A\u0430\u043B\u044B\u0432\u0430\u043D\u0438\u044F."
+ type: Tweak
+ id: 181
+ time: '2024-03-05T18:42:07.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/171
+- author: ThereDrD
+ changes:
+ - message: "\u041F\u043E\u0444\u0438\u043A\u0448\u0435\u043D\u043E \u0430\u0432\u0442\
+ \u043E\u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 the \u0432\
+ \ \u0440\u0443\u0441\u0441\u043A\u043E\u0439 \u043B\u043E\u043A\u0430\u043B\u0438\
+ \u0437\u0430\u0446\u0438\u0438."
+ type: Fix
+ id: 182
+ time: '2024-03-06T18:06:28.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/178
+- author: rhailrake
+ changes:
+ - message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u0430\u043B\u044C\
+ \u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0435 \u0441\u043F\
+ \u0435\u043B\u043B\u044B."
+ type: Add
+ id: 183
+ time: '2024-03-07T16:01:55.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/156
+- author: Aviu
+ changes:
+ - message: "\u0422\u0435\u043F\u0435\u0440\u044C \u0431\u0440\u043E\u043D\u044F\
+ \ \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043E\u0442 \u0440\u0435\
+ \u0437\u0438\u043D\u043E\u0432\u044B\u0445 \u043F\u0443\u043B\u044C \u043F\u0440\
+ \u043E\u043F\u043E\u0440\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E\
+ \ \u0440\u0435\u0437\u0438\u0441\u0442\u0443 \u043E\u0442 \u0442\u0443\u043F\
+ \u043E\u0433\u043E \u0443\u0440\u043E\u043D\u0430."
+ type: Add
+ - message: "\u0423\u0440\u043E\u043D \u043F\u043E \u0441\u0442\u0430\u043C\u0438\
+ \u043D\u0435 \u0442\u0440\u0430\u0432\u043C\u0430\u0442\u0438\u0447\u0435\u0441\
+ \u043A\u0438\u0445 \u043F\u0430\u0442\u0440\u043E\u043D\u043E\u0432 \u043E\u0442\
+ \ \u0434\u0440\u043E\u0431\u043E\u0432\u0438\u043A\u0430: 40 -> 70."
+ type: Tweak
+ - message: "\u041D\u0435\u043C\u043D\u043E\u0433\u043E \u0441\u043D\u0438\u0436\u0435\
+ \u043D \u0440\u0435\u0437\u0438\u0441\u0442\u044B \u0443 \u0431\u0440\u043E\u043D\
+ \u0438 \u0441\u0432\u044F\u0449\u0435\u043D\u043D\u0438\u043A\u0430."
+ type: Tweak
+ - message: "\u0412 \u0438\u043C\u043F\u043B\u0430\u043D\u0442\u0435 \u0430\u043F\
+ \u043B\u0438\u043D\u043A\u0430 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435\
+ \u0442 \u0441\u043A\u0438\u0434\u043E\u043A."
+ type: Tweak
+ - message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u0431\u043E\u043B\
+ \u044B \u0432 \u0421\u0411\u0422\u0435\u0445."
+ type: Add
+ - message: "\u0412\u044B\u0441\u0442\u0440\u0435\u043B\u044B \u0442\u0435\u043C\u043F\
+ \u0435\u0440\u0430\u0442\u0443\u0440\u043D\u044B\u0445 \u043F\u0443\u0448\u0435\
+ \u043A \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u043F\u0440\u043E\u0445\
+ \u043E\u0434\u044F\u0442 \u0441\u043A\u0432\u043E\u0437\u044C \u0441\u0442\u0435\
+ \u043A\u043B\u043E."
+ type: Tweak
+ - message: "\u0423\u0434\u0432\u043E\u0435\u043D\u0430 \u0441\u043A\u043E\u0440\u043E\
+ \u0441\u0442\u044C \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\
+ \u0435\u043D\u0438\u044F \u0442\u0435\u043C\u043F\u0435\u0440\u0430\u0442\u0443\
+ \u0440\u044B \u0432 \u0441\u043A\u0430\u0444\u0430\u043D\u0434\u0440\u0430\u0445\
+ ."
+ type: Tweak
+ id: 184
+ time: '2024-03-08T15:35:11.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/177
+- author: Remuchi
+ changes:
+ - message: "\u0418\u043C\u043F\u043B\u0430\u043D\u0442 \u043F\u043E\u0434\u0447\u0438\
+ \u043D\u0435\u043D\u0438\u044F \u0442\u0435\u043F\u0435\u0440\u044C \u043D\u0435\
+ \ \u0443\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044F \u043F\u0440\u0438\
+ \ \u0434\u043E\u0441\u0442\u0430\u0432\u0430\u043D\u0438\u0438 \u043B\u044E\u0431\
+ \u043E\u0433\u043E \u0438\u043C\u043F\u043B\u0430\u043D\u0442\u0430 \u0438\u0437\
+ \ \u0442\u0435\u043B\u0430 \u0440\u0430\u0431\u0430"
+ type: Fix
+ - message: "\u0421\u043A\u0430\u043D\u0435\u0440 \u0440\u0430\u0441\u0442\u0435\u043D\
+ \u0438\u0439 \u0442\u0435\u043F\u0435\u0440\u044C \u043C\u043E\u0436\u043D\u043E\
+ \ \u043F\u043E\u043B\u043E\u0436\u0438\u0442\u044C \u0432 \u043F\u043E\u044F\
+ \u0441 \u0431\u043E\u0442\u0430\u043D\u0438\u043A\u0430"
+ type: Fix
+ - message: "\u041F\u0435\u0440\u0435\u0432\u043E\u0434 \u0432\u043A\u0443\u0441\u0430\
+ \ \u043F\u0438\u0432\u0430, \u0440\u0430\u0437\u043C\u0435\u0440\u043E\u0432\
+ \ \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\u0432"
+ type: Add
+ - message: "\u041A\u043E\u0441\u043C\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u043E\
+ \u0447\u0438\u0441\u0442\u0438\u0442\u0435\u043B\u044C \u0441\u043D\u043E\u0432\
+ \u0430 \u043C\u043E\u0436\u0435\u0442 \u0441\u0442\u0438\u0440\u0430\u0442\u044C\
+ \ \u0440\u0438\u0441\u0443\u043D\u043A\u0438"
+ type: Add
+ - message: "\u0411\u043E\u043B\u044C\u0448\u0435 \u043D\u0435\u043B\u044C\u0437\u044F\
+ \ \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u0438\u043C\u043F\u043B\
+ \u0430\u043D\u0442\u044B \u0432 \u0431\u043E\u0440\u0433\u043E\u0432 (\u043D\
+ \u0438\u043A\u0430\u043A\u0438\u0445 \u0431\u043E\u0440\u0433\u043E\u0432-\u0440\
+ \u0430\u0431\u043E\u0432)"
+ type: Add
+ - message: "\u0422\u0435\u043F\u0435\u0440\u044C \u0442\u043E\u043B\u044C\u043A\u043E\
+ \ \u043B\u044E\u0434\u0438 \u0441\u043F\u0430\u0432\u043D\u044F\u0442\u0441\u044F\
+ \ \u043D\u0430 \u0440\u043E\u043B\u044F\u0445 \u0426\u041A (\u041E\u0442\u0440\
+ \u044F\u0434 \u0421\u043C\u0435\u0440\u0442\u0438, \u041E\u0411\u0420, \u041F\
+ \u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043B\u044C \u0426\
+ \u041A, \u0420\u0425\u0411\u0417"
+ type: Add
+ - message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044B \u0440\u0430\
+ \u0437\u043C\u0435\u0440\u044B \u043E\u0441\u0442\u0430\u0432\u0448\u0438\u0445\
+ \u0441\u044F \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\u043E\u0432 (\u0441\
+ \u0442\u0435\u043A\u043B\u0430, \u0441\u0442\u0435\u0440\u0436\u043D\u0438,\
+ \ \u0441\u043B\u0438\u0442\u043A\u0438, \u043F\u043B\u0430\u0441\u0442\u0438\
+ \u043A, \u0443\u0440\u0430\u043D \u0438 \u043F\u0440\u043E\u0447\u0435\u0435\
+ )"
+ type: Tweak
+ - message: "\u0420\u0430\u0437\u043C\u0435\u0440 \u043F\u043E\u0440\u0442\u0441\u0438\
+ \u0433\u0430\u0440\u0430 \u0443\u043C\u0435\u043D\u044C\u0448\u0435\u043D \u0434\
+ \u043E 2x2"
+ type: Tweak
+ - message: "\u0423\u0434\u0430\u043B\u0435\u043D\u043E \u0434\u0435\u0439\u0441\u0442\
+ \u0432\u0438\u0435 \"\u041A\u0440\u0438\u0447\u0430\u0442\u044C\" \u0441 \u043F\
+ \u0430\u043D\u0435\u043B\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439"
+ type: Remove
+ id: 185
+ time: '2024-03-08T16:50:01.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/181
+- author: ThereDrD
+ changes:
+ - message: "\u0420\u0430\u0443\u043D\u0434\u0441\u0442\u0430\u0440\u0442\u043E\u0432\
+ \u044B\u0439 \u0438\u043D\u0432\u0435\u043D\u0442\u0430\u0440\u044C \u0440\u043E\
+ \u043B\u0435\u0439 \u043F\u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u0430\
+ \u043D"
+ type: Add
+ - message: "\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u043E \u043A\u043E\u043B\
+ \u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0432\u0435\u0449\u0435\u0439 \u0432\
+ \ \u0448\u043A\u0430\u0444\u0447\u0438\u043A\u0430\u0445 \u0440\u043E\u043B\u0435\
+ \u0439."
+ type: Add
+ id: 186
+ time: '2024-03-10T23:02:48.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/180
+- author: ThereDrD
+ changes:
+ - message: "\u041F\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u043E \u0441\u043E\u0434\
+ \u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0432\u0435\u043D\u0434\u043E\u043C\
+ \u0430\u0442\u043E\u0432 \u043D\u043E\u0432\u044B\u043C\u0438 \u0442\u043E\u0432\
+ \u0430\u0440\u0430\u043C\u0438"
+ type: Add
+ id: 187
+ time: '2024-03-10T23:02:31.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/179
+- author: ThereDrD
+ changes:
+ - message: "\u0423\u0431\u0440\u0430\u043D \u043F\u043E\u043F\u0430\u043F \u0441\
+ \u043D\u0430(Zzz...)"
+ type: Remove
+ id: 188
+ time: '2024-03-10T23:07:37.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/146
diff --git a/Resources/Locale/en-US/EnergyDome/energydome.ftl b/Resources/Locale/en-US/EnergyDome/energydome.ftl
new file mode 100644
index 0000000000..e9a42503d8
--- /dev/null
+++ b/Resources/Locale/en-US/EnergyDome/energydome.ftl
@@ -0,0 +1,9 @@
+energy-dome-access-denied = Access denied
+energy-dome-recharging = Recharging...
+energy-dome-no-power = Low battery
+energy-dome-no-cell = There is no power source
+
+energy-dome-on-examine-is-on-message = The energy barrier is [color=darkgreen]up[/color].
+energy-dome-on-examine-is-off-message = The energy barrier is [color=darkred]down[/color].
+
+energy-dome-verb-toggle = Toggle energy dome
\ No newline at end of file
diff --git a/Resources/Locale/en-US/actions/actions/sleep.ftl b/Resources/Locale/en-US/actions/actions/sleep.ftl
index fd833fd4a5..d048c8e4d5 100644
--- a/Resources/Locale/en-US/actions/actions/sleep.ftl
+++ b/Resources/Locale/en-US/actions/actions/sleep.ftl
@@ -1,6 +1,5 @@
action-name-wake = Wake up
-sleep-onomatopoeia = Zzz...
sleep-examined = [color=lightblue]{CAPITALIZE(SUBJECT($target))} {CONJUGATE-BE($target)} asleep.[/color]
wake-other-success = You shake {THE($target)} awake.
diff --git a/Resources/Locale/en-US/research/technologies.ftl b/Resources/Locale/en-US/research/technologies.ftl
index 081e46fbff..ce26762eaf 100644
--- a/Resources/Locale/en-US/research/technologies.ftl
+++ b/Resources/Locale/en-US/research/technologies.ftl
@@ -32,6 +32,7 @@ research-technology-wave-particle-harnessing = Wave Particle Harnessing
research-technology-advanced-riot-control = Advanced Riot Control
research-technology-portable-microfusion-weaponry = Portable Microfusion Weaponry
research-technology-experimental-battery-ammo = Experimental Battery Ammo
+research-technology-energy_barriers = Energy Barriers
research-technology-basic-shuttle-armament = Shuttle basic armament
research-technology-advanced-shuttle-weapon = Advanced shuttle weapons
diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl
index 7f5c8cebfc..b445c31571 100644
--- a/Resources/Locale/en-US/store/uplink-catalog.ftl
+++ b/Resources/Locale/en-US/store/uplink-catalog.ftl
@@ -306,6 +306,9 @@ uplink-hardsuit-syndieelite-desc = An elite version of the blood-red hardsuit, w
uplink-clothing-outer-hardsuit-juggernaut-name = Cybersun Juggernaut Suit
uplink-clothing-outer-hardsuit-juggernaut-desc = Hyper resilient armor made of materials tested in the Tau chromosphere facility. The only thing that's going to be slowing you down is this suit... and tasers.
+uplink-energy-dome-name = Personal energy dome
+uplink-energy-dome-desc = A personal shield generator that protects the wearer from lasers and bullets but prevents from using ranged weapons himself. Comes with a small power cell.
+
# Misc
uplink-cyberpen-name = Cybersun Pen
uplink-cyberpen-desc = Cybersun's legal department pen, invaluable for forging documents and escaping prisons. Smells vaguely of hard-light and war profiteering.
diff --git a/Resources/Locale/ru-RU/White/items/betrayal-dagger.ftl b/Resources/Locale/ru-RU/White/items/betrayal-dagger.ftl
new file mode 100644
index 0000000000..288bb28d72
--- /dev/null
+++ b/Resources/Locale/ru-RU/White/items/betrayal-dagger.ftl
@@ -0,0 +1 @@
+backstab-damage-betrayal-dagger = Удар в спину: {$damage}!
diff --git a/Resources/Locale/ru-RU/actions/actions/sleep.ftl b/Resources/Locale/ru-RU/actions/actions/sleep.ftl
index 7b46518e73..53ea8cfde8 100644
--- a/Resources/Locale/ru-RU/actions/actions/sleep.ftl
+++ b/Resources/Locale/ru-RU/actions/actions/sleep.ftl
@@ -2,7 +2,6 @@ action-name-sleep = Спать
action-desc-sleep = Лечь спать.
action-name-wake = Проснуться
action-desc-wake = Перестать спать.
-sleep-onomatopoeia = Zzz...
sleep-examined = [color=lightblue]{ CAPITALIZE($target) } спит.[/color]
wake-other-success = Вы разбудили { $target }.
wake-other-failure = Вы тормошите { $target }, но { $target } не просыпается.
diff --git a/Resources/Locale/ru-RU/bonk/components/bonkable-component.ftl b/Resources/Locale/ru-RU/bonk/components/bonkable-component.ftl
index 0ae92ca232..1bf587a771 100644
--- a/Resources/Locale/ru-RU/bonk/components/bonkable-component.ftl
+++ b/Resources/Locale/ru-RU/bonk/components/bonkable-component.ftl
@@ -1,2 +1,2 @@
-bonkable-success-message-others = { CAPITALIZE(THE($user)) } стукает голову { POSS-ADJ($user) } об { $bonkable }
+bonkable-success-message-others = { CAPITALIZE($user) } стукает голову { POSS-ADJ($user) } об { $bonkable }
bonkable-success-message-user = Вы стукаете свою голову об { $bonkable }
diff --git a/Resources/Locale/ru-RU/cluwne/cluwne.ftl b/Resources/Locale/ru-RU/cluwne/cluwne.ftl
index 97b5584a00..9c72e1f81a 100644
--- a/Resources/Locale/ru-RU/cluwne/cluwne.ftl
+++ b/Resources/Locale/ru-RU/cluwne/cluwne.ftl
@@ -1,2 +1,2 @@
-cluwne-transform = { CAPITALIZE(THE($target)) } превратился в клувна!
+cluwne-transform = { CAPITALIZE($target) } превратился в клувна!
cluwne-name-prefix = Клувнифицированный { $target }
diff --git a/Resources/Locale/ru-RU/components/storage-component.ftl b/Resources/Locale/ru-RU/components/storage-component.ftl
index 68ca5ecfde..2562f0dcc0 100644
--- a/Resources/Locale/ru-RU/components/storage-component.ftl
+++ b/Resources/Locale/ru-RU/components/storage-component.ftl
@@ -3,7 +3,7 @@ comp-storage-cant-insert = Невозможно поместить.
comp-storage-insufficient-capacity = Недостаточная вместимость.
comp-storage-invalid-container = Неправильный контейнер для этого предмета.
comp-storage-anchored-failure = Невозможно поместить закрепленный предмет.
-comp-storage-cant-drop = Вы не можете отпустить { THE($entity) }!
+comp-storage-cant-drop = Вы не можете отпустить { $entity }!
comp-storage-window-title = Предмет хранилище
comp-storage-window-volume = Занято: { $usedVolume }/{ $maxVolume }, предметов: { $itemCount }
comp-storage-window-volume-unlimited = Предметов: { $itemCount }
diff --git a/Resources/Locale/ru-RU/flavors/flavor-profiles.ftl b/Resources/Locale/ru-RU/flavors/flavor-profiles.ftl
index 8231952573..a6aa60da1a 100644
--- a/Resources/Locale/ru-RU/flavors/flavor-profiles.ftl
+++ b/Resources/Locale/ru-RU/flavors/flavor-profiles.ftl
@@ -179,7 +179,7 @@ flavor-complex-rocksandstones = как скалы и камни
## Basic drinks
flavor-complex-water = как вода
-flavor-complex-water = как вода
+flavor-complex-beer = как моча
flavor-complex-cognac = как сухой пряный алкоголь
flavor-complex-mead = как забродивший мёд
flavor-complex-vermouth = как виноградная мякоть
diff --git a/Resources/Locale/ru-RU/fluids/components/absorbent-component.ftl b/Resources/Locale/ru-RU/fluids/components/absorbent-component.ftl
index c83eff4b50..70f022fa5a 100644
--- a/Resources/Locale/ru-RU/fluids/components/absorbent-component.ftl
+++ b/Resources/Locale/ru-RU/fluids/components/absorbent-component.ftl
@@ -1,10 +1,10 @@
mopping-system-tool-full = { CAPITALIZE($used) } полная!
-mopping-system-target-container-empty-water = { CAPITALIZE(THE($target)) } не имеет воды!
-mopping-system-puddle-space = { THE($used) } заполнено водой
-mopping-system-puddle-evaporate = { THE($target) } испаряется
-mopping-system-no-water = { THE($used) } не имеет воды!
-mopping-system-full = { THE($used) } полное!
-mopping-system-empty = { THE($used) } пустое!
+mopping-system-target-container-empty-water = { CAPITALIZE($target) } не имеет воды!
+mopping-system-puddle-space = { $used } заполнено водой
+mopping-system-puddle-evaporate = { $target } испаряется
+mopping-system-no-water = { $used } не имеет воды!
+mopping-system-full = { $used } полное!
+mopping-system-empty = { $used } пустое!
mopping-system-puddle-diluted = Вы разбавляете лужу.
mopping-system-puddle-success = Вы убираете лужу.
mopping-system-release-to-floor = Вы выжимаете часть жидкости на пол.
diff --git a/Resources/Locale/ru-RU/fluids/components/drain-component.ftl b/Resources/Locale/ru-RU/fluids/components/drain-component.ftl
index 8d49860ea5..716328cf29 100644
--- a/Resources/Locale/ru-RU/fluids/components/drain-component.ftl
+++ b/Resources/Locale/ru-RU/fluids/components/drain-component.ftl
@@ -1,8 +1,8 @@
-drain-component-empty-verb-using-is-empty-message = { CAPITALIZE(THE($object)) } пусто!
-drain-component-empty-verb-target-is-full-message = { CAPITALIZE(THE($object)) } полный!
+drain-component-empty-verb-using-is-empty-message = { CAPITALIZE($object) } пусто!
+drain-component-empty-verb-target-is-full-message = { CAPITALIZE($object) } полный!
drain-component-empty-verb-inhand = Пустой { $object }
drain-component-examine-hint-full = [color="blue"]Он наполнен до краев. Может вантуз поможет?[/color]
drain-component-examine-volume = [color="blue"]Оставшееся место - { $volume }ед.[/color]
-drain-component-unclog-fail = { CAPITALIZE(THE($object)) } все еще полон.
-drain-component-unclog-success = { CAPITALIZE(THE($object)) } очищается.
-drain-component-unclog-notapplicable = { CAPITALIZE(THE($object)) } не забит.
+drain-component-unclog-fail = { CAPITALIZE($object) } все еще полон.
+drain-component-unclog-success = { CAPITALIZE($object) } очищается.
+drain-component-unclog-notapplicable = { CAPITALIZE($object) } не забит.
diff --git a/Resources/Locale/ru-RU/fluids/components/puddle-component.ftl b/Resources/Locale/ru-RU/fluids/components/puddle-component.ftl
index b3f1267b4d..39891beb25 100644
--- a/Resources/Locale/ru-RU/fluids/components/puddle-component.ftl
+++ b/Resources/Locale/ru-RU/fluids/components/puddle-component.ftl
@@ -2,4 +2,4 @@ puddle-component-examine-is-slipper-text = Выглядит скользким.
puddle-component-examine-evaporating = Оно [color=#5E7C16]испаряемое[/color].
puddle-component-examine-evaporating-partial = Оно [color=#FED83D]частично испаряемое[/color].
puddle-component-examine-evaporating-no = Оно [color=#B02E26]не испаряемое[/color].
-puddle-component-slipped-touch-reaction = Вещества в { THE($puddle) } попадают на вашу кожу!
+puddle-component-slipped-touch-reaction = Вещества в { $puddle } попадают на вашу кожу!
diff --git a/Resources/Locale/ru-RU/fluids/components/spillable-component.ftl b/Resources/Locale/ru-RU/fluids/components/spillable-component.ftl
index e2af5250bd..c1a094be11 100644
--- a/Resources/Locale/ru-RU/fluids/components/spillable-component.ftl
+++ b/Resources/Locale/ru-RU/fluids/components/spillable-component.ftl
@@ -3,8 +3,8 @@
spill-target-verb-get-data-text = Выплеснуть содержимое
spill-target-verb-activate-cannot-drain-message = Вы не можете ничего выплеснуть из { $owner }!
spill-target-verb-activate-is-empty-message = В { $owner } пусто!
-spill-melee-hit-attacker = Вы проливаете { $amount }ед { THE($spillable) } на { THE($target) }!
-spill-melee-hit-others = { CAPITALIZE(THE($attacker)) } выливаете часть { THE($spillable) } на { THE($target) }!
-spill-land-spilled-on-other = { CAPITALIZE(THE($spillable)) } проливает часть своего содержимого на { THE($target) }!
+spill-melee-hit-attacker = Вы проливаете { $amount }ед { $spillable } на { $target }!
+spill-melee-hit-others = { CAPITALIZE($attacker) } выливаете часть { $spillable } на { $target }!
+spill-land-spilled-on-other = { CAPITALIZE($spillable) } проливает часть своего содержимого на { $target }!
spill-examine-is-spillable = Этот контейнер выглядит так, что его можно пролить.
spill-examine-spillable-weapon = Вы могли бы выплеснуть это на кого-нибудь при атаке в ближнем бою.
diff --git a/Resources/Locale/ru-RU/glue/glue.ftl b/Resources/Locale/ru-RU/glue/glue.ftl
index c09476e65e..48c6c26441 100644
--- a/Resources/Locale/ru-RU/glue/glue.ftl
+++ b/Resources/Locale/ru-RU/glue/glue.ftl
@@ -1,3 +1,3 @@
-glue-success = { THE($target) } покрыли в клее.
+glue-success = { $target } покрыли в клее.
glued-name-prefix = Приклеенный { $target }
-glue-failure = { THE($target) } уже покрыт клеем.
+glue-failure = { $target } уже покрыт клеем.
diff --git a/Resources/Locale/ru-RU/interaction/interaction-popup-component.ftl b/Resources/Locale/ru-RU/interaction/interaction-popup-component.ftl
index 1c42820e11..3a62aeff01 100644
--- a/Resources/Locale/ru-RU/interaction/interaction-popup-component.ftl
+++ b/Resources/Locale/ru-RU/interaction/interaction-popup-component.ftl
@@ -10,7 +10,7 @@ petting-success-bird = Вы гладите { $target } по { POSS-ADJ($target)
petting-success-cat = Вы гладите { $target } по { POSS-ADJ($target) } маленькой пушистой голове.
petting-success-corrupted-corgi = В порыве самонадеянности, вы гладите { $target } по { POSS-ADJ($target) } маленькой проклятой голове.
petting-success-crab = Вы гладите { $target } по { POSS-ADJ($target) } маленькой гладкой голове.
-petting-success-dehydrated-carp = Вы гладите { THE($target) } по { POSS-ADJ($target) } сухой маленькой голове. { CAPITALIZE(OBJECT($target)) } похоже теперь любит вас.
+petting-success-dehydrated-carp = Вы гладите { $target } по { POSS-ADJ($target) } сухой маленькой голове. { CAPITALIZE(OBJECT($target)) } похоже теперь любит вас.
petting-success-dog = Вы гладите { $target } по { POSS-ADJ($target) } мягкой пушистой голове.
petting-success-frog = Вы гладите { $target } по { POSS-ADJ($target) } маленькой скользкой голове.
petting-success-goat = Вы гладите { $target } по { POSS-ADJ($target) } рогатой пушистой голове.
@@ -24,17 +24,17 @@ petting-success-tarantula = Вы гладите { $target } по { POSS-ADJ($tar
petting-success-holo = Вы гладите { $target } по { POSS-ADJ($target) } металлической шипастой голове.
petting-success-dragon = Уворачиваясь от клыков, когтей, и пламени, вы гладите { $target } по { POSS-ADJ($target) } огромной чешуйчатой голове.
petting-success-hamster = Вы гладите { $target } по { POSS-ADJ($target) } маленькой пушистой голове.
-petting-success-bear = Вы неохотно гладите { THE($target) } по { POSS-ADJ($target) } мистической голове.
-petting-success-slimes = Вы гладите { THE($target) } по { POSS-ADJ($target) } слизистой поверхности.
-petting-success-snake = Вы гладите {THE($target)} по {POSS-ADJ($target)} чешуйчатой большой голове.
-petting-success-monkey = Вы гладите {THE($target)} по {POSS-ADJ($target)} озорной маленькой голове.
-petting-success-nymph = Вы гладите {THE($target)} по {POSS-ADJ($target)} деревянной маленькой голове.
+petting-success-bear = Вы неохотно гладите { $target } по { POSS-ADJ($target) } мистической голове.
+petting-success-slimes = Вы гладите { $target } по { POSS-ADJ($target) } слизистой поверхности.
+petting-success-snake = Вы гладите { $target } по { POSS-ADJ($target) } чешуйчатой большой голове.
+petting-success-monkey = Вы гладите { $target } по { POSS-ADJ($target) } озорной маленькой голове.
+petting-success-nymph = Вы гладите { $target } по { POSS-ADJ($target) } деревянной маленькой голове.
petting-failure-generic = Вы тянетесь погладить { $target }, но { $target } настороженно уклоняется от вас.
petting-failure-bat = Вы тянетесь погладить { $target }, но { $target } очень трудно поймать!
petting-failure-corrupted-corgi = Вы тянетесь погладить { $target }, но решаете, что лучше не надо.
petting-failure-crab = Вы тянетесь погладить { $target }, но { $target } щёлкает клешнями в вашу сторону!
-petting-failure-dehydrated-carp = Вы гладите { THE($target) } по { POSS-ADJ($target) } сухой маленькой голове.
+petting-failure-dehydrated-carp = Вы гладите { $target } по { POSS-ADJ($target) } сухой маленькой голове.
petting-failure-goat = Вы тянетесь погладить { $target }, но { $target } упорно отказывается!
petting-failure-goose = Вы тянетесь погладить { $target }, но { $target } слишком ужасен!
petting-failure-possum = Вы тянетесь погладить { $target }, но на вас шипят и рычат.
@@ -42,20 +42,20 @@ petting-failure-sloth = Вы тянетесь погладить { $target }, н
petting-failure-holo = Вы тянетесь погладить { $target }, но { $target } едва не пронзает шипами вашу руку!
petting-failure-dragon = Вы поднимаете руку, но { $target } издаёт рёв, и вы решаете, что не хотите стать кормом для карпов.
petting-failure-hamster = Вы тянетесь погладить { $target }, но { $target } пытается укусить вас за палец, и только ваши молниеносные рефлексы спасают вас от почти смертельной травмы.
-petting-failure-bear = Вы протягиваете руку, чтобы погладить { THE($target) }, но { SUBJECT($target) } рычит, заставляя вас дважды подумать.
-petting-failure-monkey = Вы протягиваете руку, чтобы погладить {THE($target)}, но {SUBJECT($target)} чуть-ли не откусывает ваши пальцы!
-petting-failure-nymph = Вы протягиваете руку, чтобы погладить {THE($target)}, но {POSS-ADJ($target)} отодвигает свои ветки от вас.
-petting-failure-shadow = Вы пытаетесь погладить {THE($target)}, но ваша рука проходит сквозь холодную темноту его тела.
+petting-failure-bear = Вы протягиваете руку, чтобы погладить { $target }, но { SUBJECT($target) } рычит, заставляя вас дважды подумать.
+petting-failure-monkey = Вы протягиваете руку, чтобы погладить { $target }, но { SUBJECT($target) } чуть-ли не откусывает ваши пальцы!
+petting-failure-nymph = Вы протягиваете руку, чтобы погладить { $target }, но { POSS-ADJ($target) } отодвигает свои ветки от вас.
+petting-failure-shadow = Вы пытаетесь погладить {$target}, но ваша рука проходит сквозь холодную темноту его тела.
## Knocking on windows
petting-success-honkbot = Вы гладите { $target } по его скользкой металлической голове.
-petting-success-mimebot = Вы гладите { THE($target) } по { POSS-ADJ($target) } холодной металлической голове.
+petting-success-mimebot = Вы гладите { $target } по { POSS-ADJ($target) } холодной металлической голове.
petting-success-cleanbot = Вы гладите { $target } по его влажной металлической голове.
petting-success-medibot = Вы гладите { $target } по его стерильной металлической голове.
petting-failure-honkbot = Вы тянетесь погладить { $target }, но { $target } хонкает и уворачивается!
petting-failure-cleanbot = Вы тянетесь погладить { $target }, но { $target } занят уборкой!
-petting-failure-mimebot = Вы тянетесь погладить { THE($target) }, но { SUBJECT($target) } { CONJUGATE-BE($target) } занятый мимикацией!
+petting-failure-mimebot = Вы тянетесь погладить { $target }, но { SUBJECT($target) } { CONJUGATE-BE($target) } занятый мимикацией!
petting-failure-medibot = Вы тянетесь погладить { $target }, но { $target } едва не пронзает вашу руку шприцом!
# Shown when knocking on a window
hugging-success-generic = Вы обнимаете { $target }.
diff --git a/Resources/Locale/ru-RU/items/components/item-component.ftl b/Resources/Locale/ru-RU/items/components/item-component.ftl
index f761f46b3b..1e59ec7869 100644
--- a/Resources/Locale/ru-RU/items/components/item-component.ftl
+++ b/Resources/Locale/ru-RU/items/components/item-component.ftl
@@ -5,3 +5,12 @@ pick-up-verb-get-data-text = Подобрать
# "pick up" doesn't make sense if the item is already in their inventory
pick-up-verb-get-data-text-inventory = Взять в руку
+
+item-component-on-examine-size = Это {INDEFINITE($size)} [bold]{$size}[/bold] предмет.
+
+item-component-size-Tiny = крошечный
+item-component-size-Small = маленький
+item-component-size-Normal = средний
+item-component-size-Large = большой
+item-component-size-Huge = огромный
+item-component-size-Ginormous = гигантский
\ No newline at end of file
diff --git a/Resources/Locale/ru-RU/kitchen/components/butcherable-component.ftl b/Resources/Locale/ru-RU/kitchen/components/butcherable-component.ftl
index 7965600581..4ab2eb7ff0 100644
--- a/Resources/Locale/ru-RU/kitchen/components/butcherable-component.ftl
+++ b/Resources/Locale/ru-RU/kitchen/components/butcherable-component.ftl
@@ -1,4 +1,4 @@
-butcherable-different-tool = Вам понадобится другой инструмент для разделки { THE($target) }.
+butcherable-different-tool = Вам понадобится другой инструмент для разделки { $target }.
butcherable-knife-butchered-success = Вы разделываете { $target } с помощью { $knife }.
butcherable-need-knife = Используйте острый предмет чтобы разделать { $target }.
butcherable-not-in-container = Сперва достаньте { $target } из контейнера.
diff --git a/Resources/Locale/ru-RU/kitchen/components/kitchen-spike-component.ftl b/Resources/Locale/ru-RU/kitchen/components/kitchen-spike-component.ftl
index c19d62d66e..9fbd3c0aed 100644
--- a/Resources/Locale/ru-RU/kitchen/components/kitchen-spike-component.ftl
+++ b/Resources/Locale/ru-RU/kitchen/components/kitchen-spike-component.ftl
@@ -1,6 +1,6 @@
comp-kitchen-spike-deny-collect = На { CAPITALIZE($this) } уже что-то есть, закончите сначала собирать мясо!
comp-kitchen-spike-deny-butcher = { CAPITALIZE($victim) } не может быть разделан на { $this }.
-comp-kitchen-spike-deny-butcher-knife = { CAPITALIZE(THE($victim)) } не может быть разделан на { THE($this) }, вы должны разделать это, используя нож.
+comp-kitchen-spike-deny-butcher-knife = { CAPITALIZE($victim) } не может быть разделан на { THE($this) }, вы должны разделать это, используя нож.
comp-kitchen-spike-deny-not-dead = { CAPITALIZE($victim) } не может быть разделан. { CAPITALIZE(SUBJECT($victim)) } { $victim } не умер!
comp-kitchen-spike-begin-hook-victim = { $user } начинает насаживать вас на { $this }!
comp-kitchen-spike-begin-hook-self = Вы начинаете насаживать себя на { $this }!
diff --git a/Resources/Locale/ru-RU/lube/lube.ftl b/Resources/Locale/ru-RU/lube/lube.ftl
index 08eef90d73..1a92d6267e 100644
--- a/Resources/Locale/ru-RU/lube/lube.ftl
+++ b/Resources/Locale/ru-RU/lube/lube.ftl
@@ -1,4 +1,4 @@
-lube-success = { THE($target) } был покрыт смазкой!
+lube-success = { $target } был покрыт смазкой!
lubed-name-prefix = Смазал { $target }
-lube-failure = Не могу покрыть { THE($target) } в смазке!
-lube-slip = { THE($target) } выскальзывает из твоих рук!
+lube-failure = Не могу покрыть { $target } в смазке!
+lube-slip = { $target } выскальзывает из твоих рук!
diff --git a/Resources/Locale/ru-RU/nutrition/components/animal-husbandry.ftl b/Resources/Locale/ru-RU/nutrition/components/animal-husbandry.ftl
index f15a93ddaa..b557935876 100644
--- a/Resources/Locale/ru-RU/nutrition/components/animal-husbandry.ftl
+++ b/Resources/Locale/ru-RU/nutrition/components/animal-husbandry.ftl
@@ -1,3 +1,3 @@
infant-name-prefix = младенец { $name }
-reproductive-birth-popup = { CAPITALIZE(THE($parent)) } родила!
-reproductive-laid-egg-popup = { CAPITALIZE(THE($parent)) } откладывает яйцо!
+reproductive-birth-popup = { CAPITALIZE($parent) } родила!
+reproductive-laid-egg-popup = { CAPITALIZE($parent) } откладывает яйцо!
diff --git a/Resources/Locale/ru-RU/nutrition/components/food-component.ftl b/Resources/Locale/ru-RU/nutrition/components/food-component.ftl
index c994675004..a1a7cec105 100644
--- a/Resources/Locale/ru-RU/nutrition/components/food-component.ftl
+++ b/Resources/Locale/ru-RU/nutrition/components/food-component.ftl
@@ -11,8 +11,8 @@ food-system-you-cannot-eat-any-more = В вас больше не лезет!
food-system-you-cannot-eat-any-more-other = В него больше не лезет!
food-system-try-use-food-is-empty = { $entity } пустая!
food-system-wrong-utensil = вы не можете есть { $food } с помощью { $utensil }.
-food-system-cant-digest = Ты не можешь переварить { THE($entity) }!
-food-system-cant-digest-other = Они не могут переварить { THE($entity) }!
+food-system-cant-digest = Ты не можешь переварить { $entity }!
+food-system-cant-digest-other = Они не могут переварить { $entity }!
food-system-verb-eat = Съесть
## Force feeding
diff --git a/Resources/Locale/ru-RU/nutrition/components/vape-component.ftl b/Resources/Locale/ru-RU/nutrition/components/vape-component.ftl
index 989bc951ac..ccf6cea242 100644
--- a/Resources/Locale/ru-RU/nutrition/components/vape-component.ftl
+++ b/Resources/Locale/ru-RU/nutrition/components/vape-component.ftl
@@ -1,7 +1,7 @@
vape-component-vape-success = Ты затянулся вейпом.
-vape-component-vape-success-forced = { CAPITALIZE(THE($user)) } заставил тебя затянуться вейпом.
-vape-component-vape-success-user-forced = Вас успешно заставили затянуться { THE($target) }.
-vape-component-try-use-vape-forced = { CAPITALIZE(THE($user)) } пытается заставить тебя затянуться вейпом.
-vape-component-try-use-vape-forced-user = Вы вынуждаете { THE($target) } затянуться вейпом.
+vape-component-vape-success-forced = { CAPITALIZE($user) } заставил тебя затянуться вейпом.
+vape-component-vape-success-user-forced = Вас успешно заставили затянуться { $target }.
+vape-component-try-use-vape-forced = { CAPITALIZE($user) } пытается заставить тебя затянуться вейпом.
+vape-component-try-use-vape-forced-user = Вы вынуждаете { $target } затянуться вейпом.
vape-component-try-use-vape = Ты пытаешься затянуться вейпом.
vape-component-vape-empty = Вейп пуст!
diff --git a/Resources/Locale/ru-RU/payload/payload-case.ftl b/Resources/Locale/ru-RU/payload/payload-case.ftl
index 864b880750..3cbe0dce0d 100644
--- a/Resources/Locale/ru-RU/payload/payload-case.ftl
+++ b/Resources/Locale/ru-RU/payload/payload-case.ftl
@@ -1,3 +1,3 @@
payload-case-not-close-enough = Вам нужно подойти ближе, чтобы определить, содержит ли { $ent } заряд.
payload-case-has-payload = В { CAPITALIZE($ent) } установлен заряд!
-payload-case-does-not-have-payload = { CAPITALIZE(THE($ent)) } не содержит заряд.
+payload-case-does-not-have-payload = { CAPITALIZE($ent) } не содержит заряд.
diff --git a/Resources/Locale/ru-RU/power/components/generator.ftl b/Resources/Locale/ru-RU/power/components/generator.ftl
index 96e357ba0f..7d2562a6f0 100644
--- a/Resources/Locale/ru-RU/power/components/generator.ftl
+++ b/Resources/Locale/ru-RU/power/components/generator.ftl
@@ -1,4 +1,4 @@
-generator-clogged = {THE($generator)} резко отключается!
+generator-clogged = {$generator} резко отключается!
portable-generator-verb-start = Запустить генератор
portable-generator-verb-start-msg-unreliable = Запуск генератора. Это может потребовать нескольких попыток.
diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/actions/types.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/actions/types.ftl
index 07546da98e..4a9364816a 100644
--- a/Resources/Locale/ru-RU/ss14-ru/prototypes/actions/types.ftl
+++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/actions/types.ftl
@@ -1,5 +1,3 @@
-ent-ActionScream = Крикнуть
- .desc = ААААААААААААААААААААААААА
ent-ActionTurnUndead = Обратиться в зомби
.desc = Поддайтесь заражению и превратитесь в зомби.
ent-ActionToggleLight = Переключить фонарь
diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/implanters.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/implanters.ftl
index 07672cfe3b..eb02b08eac 100644
--- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/implanters.ftl
+++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/implanters.ftl
@@ -52,3 +52,5 @@ ent-DeathAcidifierImplanter = { ent-BaseImplanter }
ent-ImplanterAdmeme = { ent-BaseImplanter }
.desc = {""}
.suffix = адмемы
+ent-ImplanterSyndi = { ent-BaseImplanter }
+ .desc = { ent-BaseImplanter.desc }
diff --git a/Resources/Locale/ru-RU/storage/components/pick-random-component.ftl b/Resources/Locale/ru-RU/storage/components/pick-random-component.ftl
index ba5a0db141..23887e3d5c 100644
--- a/Resources/Locale/ru-RU/storage/components/pick-random-component.ftl
+++ b/Resources/Locale/ru-RU/storage/components/pick-random-component.ftl
@@ -1,2 +1,2 @@
-comp-pick-random-empty = { CAPITALIZE(THE($storage)) } пустое!
+comp-pick-random-empty = { CAPITALIZE($storage) } пустое!
comp-pick-random-verb-text = Выбрать предмет
diff --git a/Resources/Locale/ru-RU/store/currency.ftl b/Resources/Locale/ru-RU/store/currency.ftl
index 145293a778..d1387625e6 100644
--- a/Resources/Locale/ru-RU/store/currency.ftl
+++ b/Resources/Locale/ru-RU/store/currency.ftl
@@ -1,6 +1,6 @@
store-currency-inserted = { CAPITALIZE($used) } внесены в { $target }.
store-currency-war-boost-given = { CAPITALIZE($target) } начинает жужжать
-store-currency-inserted-implant = { CAPITALIZE(THE($used)) } вставляется в ваш имплантат.
+store-currency-inserted-implant = { CAPITALIZE($used) } вставляется в ваш имплантат.
store-currency-free = Бесплатно
store-currency-display-debugdollar =
{ $amount ->
diff --git a/Resources/Locale/ru-RU/weapons/grenades/timer-trigger.ftl b/Resources/Locale/ru-RU/weapons/grenades/timer-trigger.ftl
index 66c09783df..84b929a42e 100644
--- a/Resources/Locale/ru-RU/weapons/grenades/timer-trigger.ftl
+++ b/Resources/Locale/ru-RU/weapons/grenades/timer-trigger.ftl
@@ -12,4 +12,4 @@ verb-toggle-start-on-stick = Переключить автоактивацию
popup-start-on-stick-off = Устройство НЕ будет автоматически активировано после установки
popup-start-on-stick-on = Устройство будет автоматически активировано после установки
-trigger-activated = Вы активируете {THE($device)}.
+trigger-activated = Вы активируете {$device}.
diff --git a/Resources/Locale/ru-RU/weapons/melee/melee.ftl b/Resources/Locale/ru-RU/weapons/melee/melee.ftl
index d9ce371d92..3cf903a702 100644
--- a/Resources/Locale/ru-RU/weapons/melee/melee.ftl
+++ b/Resources/Locale/ru-RU/weapons/melee/melee.ftl
@@ -1,6 +1,6 @@
melee-inject-failed-hardsuit = Ваше { $weapon } не может впрыскивать через скафандры!
-melee-balloon-pop = {CAPITALIZE(THE($balloon))} взорвался!
+melee-balloon-pop = {CAPITALIZE($balloon)} взорвался!
#BatteryComponent
melee-battery-examine = Заряда хватит на [color={$color}]{$count}[/color] ударов.
diff --git a/Resources/Locale/ru-RU/weapons/ranged/gun.ftl b/Resources/Locale/ru-RU/weapons/ranged/gun.ftl
index 32376ea599..ba33dfa6cd 100644
--- a/Resources/Locale/ru-RU/weapons/ranged/gun.ftl
+++ b/Resources/Locale/ru-RU/weapons/ranged/gun.ftl
@@ -17,9 +17,9 @@ gun-PullMob = тащить существ
gun-ballistic-cycle = Перезарядка
gun-ballistic-cycled = Перезаряжено
gun-ballistic-cycled-empty = Разряжено
-gun-ballistic-transfer-invalid = {CAPITALIZE(THE($ammoEntity))} нельзя поместить в {THE($targetEntity)}!
-gun-ballistic-transfer-empty = В {CAPITALIZE(THE($entity))} пусто.
-gun-ballistic-transfer-target-full = {CAPITALIZE(THE($entity))} уже полностью заряжен.
+gun-ballistic-transfer-invalid = { CAPITALIZE($ammoEntity) } нельзя поместить в { $targetEntity }!
+gun-ballistic-transfer-empty = В { CAPITALIZE($entity) } пусто.
+gun-ballistic-transfer-target-full = { CAPITALIZE($entity) } уже полностью заряжен.
# CartridgeAmmo
gun-cartridge-spent = Он [color=red]израсходован[/color].
diff --git a/Resources/Locale/ru-RU/white/species/felinid/felinid.ftl b/Resources/Locale/ru-RU/white/species/felinid/felinid.ftl
index 99d8c0a523..265a89f148 100644
--- a/Resources/Locale/ru-RU/white/species/felinid/felinid.ftl
+++ b/Resources/Locale/ru-RU/white/species/felinid/felinid.ftl
@@ -1,7 +1,7 @@
hairball-action = Откашлять комок шерсти.
hairball-action-desc = Люди это не любят.
hairball-mask = Сначала сними { $mask }.
-hairball-cough = { CAPITALIZE(THE($name)) } пытается выкашлять комок шерсти!
+hairball-cough = { CAPITALIZE($name) } пытается выкашлять комок шерсти!
action-name-eat-mouse = Съесть мышь.
action-description-eat-mouse = Съешьте мышь в своей руке, получая питательные вещества и заряд комка шерсти.
diff --git a/Resources/Locale/ru-RU/wieldable/wieldable-component.ftl b/Resources/Locale/ru-RU/wieldable/wieldable-component.ftl
index 52dbf07e38..2bc040551a 100644
--- a/Resources/Locale/ru-RU/wieldable/wieldable-component.ftl
+++ b/Resources/Locale/ru-RU/wieldable/wieldable-component.ftl
@@ -14,4 +14,4 @@ wieldable-component-not-enough-free-hands =
*[other] свободных рук
}.
wieldable-component-not-in-hands = { CAPITALIZE($item) } не в ваших руках!
-wieldable-component-requires = { CAPITALIZE(THE($item)) } должно быть в руках!
+wieldable-component-requires = { CAPITALIZE($item) } должно быть в руках!
diff --git a/Resources/Locale/ru-RU/zombies/zombie.ftl b/Resources/Locale/ru-RU/zombies/zombie.ftl
index 839230c031..c389398006 100644
--- a/Resources/Locale/ru-RU/zombies/zombie.ftl
+++ b/Resources/Locale/ru-RU/zombies/zombie.ftl
@@ -1,4 +1,4 @@
-zombie-transform = {CAPITALIZE(THE($target))} превратился в зомби!
+zombie-transform = {CAPITALIZE($target)} превратился в зомби!
zombie-infection-greeting = Вы стали зомби. Ваша цель - заражать любое живое существо на вашем пути. Работайте с другими зомби чтобы захвать всю станцию!
zombie-generic = зомби
diff --git a/Resources/Prototypes/Actions/types.yml b/Resources/Prototypes/Actions/types.yml
index 5abcaf9bc3..cd22605b64 100644
--- a/Resources/Prototypes/Actions/types.yml
+++ b/Resources/Prototypes/Actions/types.yml
@@ -1,16 +1,3 @@
-- type: entity
- id: ActionScream
- name: Scream
- description: AAAAAAAAAAAAAAAAAAAAAAAAA
- noSpawn: true
- components:
- - type: InstantAction
- useDelay: 10
- icon: Interface/Actions/scream.png
- event: !type:ScreamActionEvent
- checkCanInteract: false
- - type: LesserFormRestricted
-
- type: entity
id: ActionTurnUndead
name: Turn Undead
@@ -33,6 +20,16 @@
iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png
event: !type:ToggleActionEvent
+- type: entity
+ id: ActionToggleDome
+ name: Toggle energy dome
+ description: Turn the energy barrier on or off.
+ noSpawn: true
+ components:
+ - type: InstantAction
+ icon: { sprite: Objects/Weapons/Melee/e_shield.rsi, state: eshield-on }
+ event: !type:ToggleActionEvent
+
- type: entity
id: ActionOpenStorageImplant
name: Open Storage Implant
diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml
index b961659c08..469a07a3bb 100644
--- a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml
+++ b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml
@@ -27,7 +27,6 @@
contents:
- id: BoxSurvivalSecurity
- id: Flash
- - id: MagazinePistol
- type: entity
noSpawn: true
@@ -135,7 +134,6 @@
contents:
- id: BoxSurvivalSecurity
- id: Flash
- - id: MagazinePistol
- type: entity
noSpawn: true
diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml
index 504054dc27..e173a08f8c 100644
--- a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml
+++ b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml
@@ -26,7 +26,6 @@
contents:
- id: BoxSurvivalSecurity
- id: Flash
- - id: MagazinePistol
- type: entity
noSpawn: true
@@ -143,7 +142,6 @@
contents:
- id: BoxSurvivalSecurity
- id: Flash
- - id: MagazinePistol
- type: entity
noSpawn: true
diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml
index a17d49127d..dc5edb3abf 100644
--- a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml
+++ b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml
@@ -40,7 +40,6 @@
contents:
- id: BoxSurvivalSecurity
- id: Flash
- - id: MagazinePistol
- type: entity
noSpawn: true
@@ -157,7 +156,6 @@
contents:
- id: BoxSurvivalSecurity
- id: Flash
- - id: MagazinePistol
- type: entity
noSpawn: true
diff --git a/Resources/Prototypes/Catalog/Fills/Items/firstaidkits.yml b/Resources/Prototypes/Catalog/Fills/Items/firstaidkits.yml
index 6400dce5b6..d922955d62 100644
--- a/Resources/Prototypes/Catalog/Fills/Items/firstaidkits.yml
+++ b/Resources/Prototypes/Catalog/Fills/Items/firstaidkits.yml
@@ -20,7 +20,7 @@
- type: StorageFill
contents:
- id: Ointment
- amount: 2
+ amount: 3
- id: PillCanisterKelotane
- id: PillCanisterDermaline
@@ -32,7 +32,7 @@
- type: StorageFill
contents:
- id: Brutepack
- - id: Gauze
+ amount: 3
- id: PillCanisterIron
- id: PillCanisterCopper
@@ -47,6 +47,7 @@
- id: SyringeEthylredoxrazine
- id: AntiPoisonMedipen
- id: PillCanisterDylovene
+ amount: 2
- id: PillCanisterCharcoal
- type: entity
@@ -61,6 +62,7 @@
- id: EmergencyMedipen
- id: SyringeInaprovaline
- id: PillCanisterDexalin
+ - id: Gauze
- type: entity
id: MedkitRadiationFilled
@@ -73,6 +75,7 @@
- id: RadAutoInjector
- id: EmergencyMedipen
- id: PillCanisterHyronalin
+ amount: 2
- type: entity
id: MedkitAdvancedFilled
diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/dressers.yml b/Resources/Prototypes/Catalog/Fills/Lockers/dressers.yml
index 4ca0ac3a74..9e45d72f63 100644
--- a/Resources/Prototypes/Catalog/Fills/Lockers/dressers.yml
+++ b/Resources/Prototypes/Catalog/Fills/Lockers/dressers.yml
@@ -13,6 +13,7 @@
- id: ClothingUniformJumpskirtCapFormalDress
- id: ClothingHandsGlovesCaptain
- id: ClothingNeckMantleCap
+ - id: ClothingEyesGlassesSunglasses
- type: entity
id: DresserChiefEngineerFilled
@@ -50,6 +51,7 @@
- id: ClothingNeckCloakHop
- id: ClothingHeadHatHopcap
- id: ClothingOuterWinterHoP
+ - id: ClothingHandsGlovesHop
- type: entity
id: DresserHeadOfSecurityFilled
@@ -67,6 +69,7 @@
- id: ClothingUniformJumpskirtHosFormal
- id: ClothingUniformJumpsuitHosFormal
- id: ClothingMaskNeckGaiter
+ - id: ClothingHandsGlovesCombat
- type: entity
id: DresserQuarterMasterFilled
diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml
index f10bebce0c..e685377234 100644
--- a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml
+++ b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml
@@ -90,6 +90,8 @@
- id: MedkitOxygenFilled
- id: HolofanProjector
- id: DoorRemoteFirefight
+ - id: ClothingBeltUtilityEngineering
+ - id: ClothingEyesGlassesMeson
- type: entity
id: LockerAtmosphericsFilled
@@ -105,6 +107,8 @@
- id: MedkitOxygenFilled
- id: HolofanProjector
- id: DoorRemoteFirefight
+ - id: ClothingBeltUtilityEngineering
+ - id: ClothingEyesGlassesMeson
- type: entity
id: LockerEngineerFilledHardsuit
@@ -119,6 +123,8 @@
- id: OxygenTankFilled
- id: NitrogenTankFilled
- id: ClothingShoesBootsMag
+ - id: ClothingBeltUtilityEngineering
+ - id: ClothingEyesGlassesMeson
- type: entity
id: LockerEngineerFilled
@@ -130,6 +136,8 @@
- id: ClothingHandsGlovesColorYellow
- id: ClothingMaskGas
- id: trayScanner
+ - id: ClothingBeltUtilityEngineering
+ - id: ClothingEyesGlassesMeson
- type: entity
id: ClosetRadiationSuitFilled
diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml
index efbf03a9b8..550f0b8fdc 100644
--- a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml
+++ b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml
@@ -171,6 +171,7 @@
- id: AccessConfigurator
- id: RCD
- id: RCDAmmo
+ - id: ClothingHeadHatHardhatWhite
- type: entity
id: LockerChiefMedicalOfficerFilledHardsuit
@@ -196,6 +197,7 @@
- id: MedicalTechFabCircuitboard
- id: BoxEncryptionKeyMedical
- id: Eftpos
+ - id: ClothingBeltMedical
- type: entity
id: LockerChiefMedicalOfficerFilled
@@ -217,6 +219,7 @@
- id: MedicalTechFabCircuitboard
- id: BoxEncryptionKeyMedical
- id: Eftpos
+ - id: ClothingBeltMedical
- type: entity
id: LockerResearchDirectorFilledHardsuit
@@ -279,6 +282,7 @@
- id: BoxEncryptionKeySecurity
- id: HoloprojectorSecurity
- id: BookSecretDocuments
+ - id: WeaponPistolMk58Nonlethal
- type: entity
id: LockerHeadOfSecurityFilled
@@ -304,6 +308,8 @@
- id: BoxEncryptionKeySecurity
- id: HoloprojectorSecurity
- id: BookSecretDocuments
+ - id: WeaponPistolMk58Nonlethal
+ - id: MagazinePistol
- type: entity
id: LockerFreezerVaultFilled
diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml b/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml
index a2615d6441..754eb95435 100644
--- a/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml
+++ b/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml
@@ -119,11 +119,15 @@
- id: BoxBottle
- id: BoxVial
- id: ChemBag
+ amount: 3
- id: ClothingHandsGlovesLatex
+ amount: 3
- id: ClothingHeadsetMedical
+ amount: 3
- id: ClothingMaskSterile
+ amount: 3
- id: HandLabeler
- prob: 0.5
+ amount: 3
- id: Eftpos
- type: entity
diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/security.yml b/Resources/Prototypes/Catalog/Fills/Lockers/security.yml
index f5c1a34912..90eecb2b57 100644
--- a/Resources/Prototypes/Catalog/Fills/Lockers/security.yml
+++ b/Resources/Prototypes/Catalog/Fills/Lockers/security.yml
@@ -15,12 +15,15 @@
- id: ClothingHandsGlovesCombat
- id: ClothingShoesBootsJack
- id: ClothingOuterCoatWarden
+ - id: ClothingHeadHatWarden
- id: ClothingOuterWinterWarden
- id: RubberStampWarden
- id: DoorRemoteArmory
- id: ClothingOuterHardsuitWarden
- id: HoloprojectorSecurity
- id: BoxBodyCamera
+ - id: WeaponPistolMk58Nonlethal
+ - id: MagazinePistol
- type: entity
id: LockerWardenFilled
@@ -45,6 +48,8 @@
- id: DoorRemoteArmory
- id: HoloprojectorSecurity
- id: BoxBodyCamera
+ - id: WeaponPistolMk58Nonlethal
+ - id: MagazinePistol
- type: entity
id: LockerSecurityFilled
@@ -54,7 +59,6 @@
- type: StorageFill
contents:
- id: FlashlightSeclite
- prob: 0.8
- id: ClothingUniformJumpsuitSecGrey
prob: 0.3
- id: ClothingHeadHelmetBasic
@@ -72,6 +76,9 @@
- id: HoloprojectorSecurity
prob: 0.6
- id: WeaponTempGun
+ - id: WeaponPistolMk58Nonlethal
+ - id: BoxBodyCamera
+ - id: MagazinePistol
- type: entity
id: LockerBrigmedicFilled
@@ -127,6 +134,10 @@
- id: ClothingHandsGlovesForensic
- id: HoloprojectorSecurity
- id: BoxEvidenceMarkers
+ - id: ClothingBeltHolsterFilled
+ - id: BoxBodyCamera
+ - id: VoiceRecorder
+ - id: ClothingEyesGlassesSecurity
- type: entity
id: ClosetBombFilled
diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/service.yml b/Resources/Prototypes/Catalog/Fills/Lockers/service.yml
index c1f1dfedb9..b0e592499f 100644
--- a/Resources/Prototypes/Catalog/Fills/Lockers/service.yml
+++ b/Resources/Prototypes/Catalog/Fills/Lockers/service.yml
@@ -111,6 +111,9 @@
- id: ClothingHeadHatTrucker
prob: 0.1
- id: Eftpos
+ - id: HydroponicsToolSpade
+ - id: HydroponicsToolMiniHoe
+ - id: RobustHarvestChemistryBottle
- type: entity
id: LockerBotanistLoot
diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/wardrobe_job.yml b/Resources/Prototypes/Catalog/Fills/Lockers/wardrobe_job.yml
index 49601980f3..d079771c34 100644
--- a/Resources/Prototypes/Catalog/Fills/Lockers/wardrobe_job.yml
+++ b/Resources/Prototypes/Catalog/Fills/Lockers/wardrobe_job.yml
@@ -172,12 +172,19 @@
- type: StorageFill
contents:
- id: ClothingHeadHatCargosoft
+ amount: 3
- id: ClothingUniformJumpsuitCargo
+ amount: 3
- id: ClothingBackpack
+ amount: 3
- id: ClothingShoesColorBlack
+ amount: 3
- id: ClothingUniformJumpskirtCargo
+ amount: 3
- id: ClothingHandsGlovesFingerless
+ amount: 3
- id: AppraisalTool
+ amount: 3
- type: entity
id: WardrobeSalvageFilled
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/atmosdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/atmosdrobe.yml
index 72864ba851..24b990df2e 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/atmosdrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/atmosdrobe.yml
@@ -1,15 +1,19 @@
- type: vendingMachineInventory
id: AtmosDrobeInventory
startingInventory:
- ClothingBackpackDuffelAtmospherics: 2
- ClothingBackpackSatchelAtmospherics: 2
- ClothingBackpackAtmospherics: 2
+ ClothingBackpackDuffelAtmospherics: 3
+ ClothingBackpackSatchelAtmospherics: 3
+ ClothingBackpackAtmospherics: 3
+ ClothingHeadHatBeretEngineering: 3
+ ClothingHeadsetEngineering: 3
+ ClothingNeckScarfStripedLightBlue: 3
+ ClothingMaskGasAtmos: 3
+ ClothingOuterWinterAtmos: 2
ClothingUniformJumpsuitAtmos: 3
ClothingUniformJumpskirtAtmos: 3
ClothingUniformJumpsuitAtmosCasual: 3
ClothingShoesColorWhite: 3
- ClothingHeadsetEngineering: 2
ClothingHeadHelmetFire: 2
ClothingOuterSuitFire: 2
- ClothingOuterWinterAtmos: 2
- ClothingNeckScarfStripedLightBlue: 3
+ ClothingOuterSuitAtmosFire: 1
+ ClothingHeadHelmetAtmosFire: 1
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/bardrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/bardrobe.yml
index cbc71f85af..f3c738096a 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/bardrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/bardrobe.yml
@@ -4,16 +4,15 @@
ClothingHeadHatBowlerHat: 2
ClothingHeadHatTophat: 2
ClothingEyesHudBeer: 2
- ClothingEyesEyepatchHudBeer: 1
+ ClothingEyesGlassesSunglasses: 2
ClothingHeadsetService: 2
- ClothingOuterApronBar: 2
+ ClothingOuterArmorBasicSlim: 2
ClothingOuterWinterBar: 2
+ ClothingOuterVest: 2
ClothingUniformJumpsuitBartender: 2
ClothingUniformJumpskirtBartender: 2
ClothingUniformJumpsuitBartenderPurple: 2
- ClothingShoesColorBlack: 2
- ClothingOuterArmorBasicSlim: 2
- ClothingOuterVest: 2
ClothingBeltBandolier: 2
- ClothingEyesGlassesSunglasses: 2
-
+ ClothingShoesColorBlack: 2
+ ClothingEyesEyepatchHudBeer: 1
+ ClothingOuterApronBar: 2
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/boozeomat.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/boozeomat.yml
index fd943a87de..3e442cd481 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/boozeomat.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/boozeomat.yml
@@ -1,13 +1,13 @@
- type: vendingMachineInventory
id: BoozeOMatInventory
startingInventory:
- DrinkGlass: 20 #Kept glasses at top for ease to differentiate from booze.
+ DrinkGlass: 20
DrinkShotGlass: 10
DrinkGlassCoupeShaped: 10
DrinkVacuumFlask: 5
DrinkFlaskBar: 5
DrinkShaker: 5
- CustomDrinkJug: 2 #to allow for custom drinks in the soda/booze dispensers
+ CustomDrinkJug: 2
DrinkAbsintheBottleFull: 2
DrinkAleBottleFull: 5
DrinkBeerBottleFull: 5
@@ -16,7 +16,7 @@
DrinkColaBottleFull: 4
DrinkCreamCarton: 5
DrinkGinBottleFull: 3
- DrinkGildlagerBottleFull: 2 #if champagne gets less because its premium, then gildlager should match this and have two
+ DrinkGildlagerBottleFull: 2
DrinkGrenadineBottleFull: 2
DrinkJuiceLimeCarton: 3
DrinkJuiceOrangeCarton: 3
@@ -34,7 +34,7 @@
DrinkVodkaBottleFull: 5
DrinkWhiskeyBottleFull: 5
DrinkWineBottleFull: 5
- DrinkChampagneBottleFull: 2 #because the premium drink
+ DrinkChampagneBottleFull: 2
Eftpos: 4
DrinkBeerCan: 5
DrinkWineCan: 5
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/cargodrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/cargodrobe.yml
index d1e80ba0c8..9326eb79a0 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/cargodrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/cargodrobe.yml
@@ -1,17 +1,18 @@
- type: vendingMachineInventory
id: CargoDrobeInventory
startingInventory:
- ClothingBackpackCargo: 3
- ClothingBackpackSatchelCargo: 3
- ClothingBackpackDuffelCargo: 3
- ClothingUniformJumpsuitCargo: 3
- ClothingUniformJumpskirtCargo: 3
- ClothingShoesColorBlack: 3
- ClothingHandsGlovesFingerless: 3
- ClothingHeadHatCargosoft: 3
- ClothingHeadBandBrown: 3
- ClothingHeadsetCargo: 3
- ClothingOuterWinterCargo: 2
- ClothingOuterWinterMiner: 2
- ClothingNeckScarfStripedBrown: 3
+ ClothingBackpackCargo: 4
+ ClothingBackpackSatchelCargo: 4
+ ClothingBackpackDuffelCargo: 4
+ ClothingUniformJumpsuitCargo: 4
+ ClothingUniformJumpskirtCargo: 4
+ ClothingShoesColorBlack: 4
+ ClothingHandsGlovesFingerless: 4
+ ClothingHeadHatCargosoft: 4
+ ClothingHeadBandBrown: 4
+ ClothingHeadsetCargo: 4
+ ClothingOuterWinterCargo: 4
+ ClothingOuterWinterMiner: 4
+ ClothingNeckScarfStripedBrown: 4
ClothingShoesBootsWinterCargo: 2
+
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/cart.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/cart.yml
index cb0ef3246d..0d725a504e 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/cart.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/cart.yml
@@ -1,16 +1,16 @@
- type: vendingMachineInventory
id: PTechInventory
startingInventory:
- PassengerPDA: 5
- ClearPDA: 5
- PassengerIDCard: 5
- ClothingHeadsetGrey: 5
+ PassengerPDA: 7
+ ClearPDA: 7
+ PassengerIDCard: 7
+ ClothingHeadsetGrey: 7
RubberStampApproved: 1
RubberStampDenied: 1
- Paper: 10
- EncryptionKeyCargo: 2
- EncryptionKeyEngineering: 2
- EncryptionKeyMedical: 2
- EncryptionKeyScience: 2
- EncryptionKeySecurity: 1
+ Paper: 13
+ EncryptionKeyCargo: 3
+ EncryptionKeyEngineering: 3
+ EncryptionKeyMedical: 3
+ EncryptionKeyScience: 3
+ EncryptionKeySecurity: 3
EncryptionKeyService: 3
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chang.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chang.yml
index 282f58535b..30e1c6b6a2 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chang.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chang.yml
@@ -3,8 +3,7 @@
startingInventory:
FoodCondimentPacketSoy: 5
FoodSnackCookieFortune: 5
- DrinkRamen: 3
- DrinkHellRamen: 3
- FoodSnackChowMein: 3
- FoodSnackDanDanNoodles: 3
-# rice?
+ DrinkRamen: 5
+ DrinkHellRamen: 5
+ FoodSnackChowMein: 5
+ FoodSnackDanDanNoodles: 5
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml
index 3877701036..558e8e2b5e 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml
@@ -1,34 +1,31 @@
- type: vendingMachineInventory
id: PietyVendInventory
startingInventory:
+ ClothingUniformJumpsuitChaplain: 2
+ ClothingUniformJumpskirtChaplain: 2
+ ClothingUniformJumpsuitMonasticRobeDark: 2
+ ClothingUniformJumpsuitMonasticRobeLight: 2
+ ClothingOuterHoodieChaplain: 2
+ ClothingOuterHoodieBlack: 2
+ ClothingHeadHatHoodChaplainHood: 2
+ ClothingHeadHatHoodNunHood: 2
+ ClothingOuterNunRobe: 2
+ ClothingHeadHatFez: 2
+ ClothingHeadHatPlaguedoctor: 2
+ ClothingHeadHatWitch: 2
+ ClothingHeadHatWitch1: 2
+ ClothingOuterPlagueSuit: 2
+ ClothingMaskPlague: 2
+ ClothingHeadsetService: 2
ClothingNeckNecklaceSilver: 2
ClothingNeckNecklaceGold: 1
ClothingNeckNecklaceTech: 1
- ClothingUniformJumpsuitChaplain: 2
- ClothingUniformJumpskirtChaplain: 2
- ClothingUniformJumpsuitMonasticRobeDark: 1
- ClothingUniformJumpsuitMonasticRobeLight: 1
ClothingNeckStoleChaplain: 1
- ClothingOuterHoodieChaplain: 1
- ClothingOuterHoodieBlack: 1
- ClothingHeadHatHoodNunHood: 1
- ClothingOuterNunRobe: 1
- ClothingHeadHatFez: 1
- ClothingHeadHatPlaguedoctor: 1
- ClothingHeadHatWitch: 1
- ClothingHeadHatWitch1: 1
- ClothingOuterPlagueSuit: 1
- ClothingMaskPlague: 1
- ClothingHeadsetService: 2
BoxCandle: 2
BoxCandleSmall: 2
Urn: 5
emaggedInventory:
- #ClothingOuterArmorCult: 1
- #ClothingHeadHelmetCult: 1
- #ClothingOuterRobesCult: 3
- #ClothingHeadHatHoodCulthood: 3
- #ClothingShoesCult: 4
BedsheetCult: 4
+ BibleNecronomicon: 1
ClothingNeckScarfStripedBlack: 3
ClothingNeckNecklaceUnholy: 1
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefdrobe.yml
index 4379a97896..eb42b1c41e 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefdrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefdrobe.yml
@@ -2,10 +2,10 @@
id: ChefDrobeInventory
startingInventory:
ClothingHeadsetService: 2
- ClothingOuterApronChef: 3
+ ClothingOuterApronChef: 2
ClothingOuterWinterChef: 2
- ClothingOuterJacketChef: 1
- ClothingUniformJumpsuitChef: 1
+ ClothingOuterJacketChef: 2
+ ClothingUniformJumpsuitChef: 2
ClothingMaskItalianMoustache: 2
ClothingUniformJumpskirtChef: 2
ClothingHeadHatChef: 2
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefvend.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefvend.yml
index 1078654704..0437cf3a94 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefvend.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chefvend.yml
@@ -6,18 +6,23 @@
ReagentContainerSugar: 2
ReagentContainerRice: 2
FoodCondimentPacketSalt: 4
+ FoodCondimentPacketPepper: 4
FoodCondimentBottleEnzyme: 2
- FoodCondimentBottleHotsauce: 1
- FoodCondimentBottleKetchup: 1
- FoodCondimentBottleBBQ: 1
+ FoodCondimentBottleHotsauce: 2
+ FoodCondimentBottleKetchup: 2
+ FoodCondimentBottleBBQ: 2
FoodCondimentBottleVinegar: 2
ReagentContainerOliveoil: 2
+ FoodContainerEgg: 2
+ ReagentContainerMilk: 3
+ ReagentContainerMilkSoy: 3
+ MonkeyCubeBox: 1
ReagentContainerMayo: 1
VariantCubeBox: 1
- FoodContainerEgg: 1
DrinkMilkCarton: 2
DrinkSoyMilkCarton: 1
FoodButter: 4
FoodCheese: 1
FoodMeat: 6
Eftpos: 4
+
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chemdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chemdrobe.yml
index d028c55cab..0f148a26ba 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chemdrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chemdrobe.yml
@@ -1,15 +1,16 @@
- type: vendingMachineInventory
id: ChemDrobeInventory
startingInventory:
- ClothingUniformJumpsuitChemistry: 2
- ClothingUniformJumpskirtChemistry: 2
- ClothingOuterCoatLabChem: 2
- ClothingShoesColorWhite: 2
- ClothingBackpackChemistry: 2
- ClothingBackpackSatchelChemistry: 2
- ClothingBackpackDuffelChemistry: 2
- ChemBag: 2
- ClothingBeltMedical: 2
- ClothingHandsGlovesLatex: 2
- ClothingHeadsetMedical: 2
- ClothingOuterWinterChem: 2
+ ClothingBackpackChemistry: 3
+ ClothingBackpackSatchelChemistry: 3
+ ClothingBackpackDuffelChemistry: 3
+ ClothingHeadHatBeretBrigmedic: 3
+ ClothingHeadsetMedical: 3
+ ClothingOuterWinterChem: 3
+ ClothingOuterCoatLabChem: 3
+ ClothingUniformJumpsuitChemistry: 3
+ ClothingUniformJumpskirtChemistry: 3
+ ClothingHandsGlovesLatex: 3
+ ChemBag: 3
+ ClothingBeltMedical: 3
+ ClothingShoesColorWhite: 3
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/cigs.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/cigs.yml
index 4b21e05235..a642e84d82 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/cigs.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/cigs.yml
@@ -1,18 +1,19 @@
- type: vendingMachineInventory
id: CigaretteMachineInventory
startingInventory:
- CigPackGreen: 2
- CigPackRed: 2
- CigPackBlue: 2
- CigPackBlack: 2
- CigPackMixed: 2
+ CigPackGreen: 3
+ CigPackRed: 3
+ CigPackBlue: 3
+ CigPackBlack: 3
CigarCase: 1
- SmokingPipeFilledTobacco: 1
+ SmokingPipeFilledTobacco: 3
Vape: 1
Matchbox: 5
PackPaperRollingFilters: 3
- CheapLighter: 4
+ CheapLighter: 5
Lighter: 2
+ CigPackMixed: 2
FlippoLighter: 2
+
emaggedInventory:
- CigPackSyndicate: 1
+ CigPackSyndicate: 2
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml
index 71780f6d82..314d58de13 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml
@@ -3,75 +3,104 @@
startingInventory:
ClothingBackpack: 5
ClothingBackpackDuffel: 5
- ClothingBackpackSatchel: 3
- ClothingBackpackSatchelLeather: 2
- ClothingHeadHatBeret: 4
- ClothingHeadBandBlack: 2
- ClothingHeadBandBlue: 2
- ClothingHeadBandGreen: 2
- ClothingHeadBandRed: 2
- ClothingHeadBandSkull: 2
- ClothingHeadHatGreyFlatcap: 3
- ClothingHeadHatBrownFlatcap: 3
+ ClothingBackpackSatchel: 5
+ ClothingBackpackSatchelLeather: 5
+ ClothingBeltStorageWaistbag: 5
+ ClothingHeadBandBlack: 3
+ ClothingHeadBandBlue: 3
+ ClothingHeadBandGreen: 3
+ ClothingHeadBandRed: 3
+ ClothingHeadBandSkull: 3
ClothingUniformJumpsuitColorGrey: 8
ClothingUniformJumpskirtColorGrey: 8
ClothingUniformJumpsuitColorWhite: 3
ClothingUniformJumpskirtColorWhite: 3
- ClothingUniformJumpsuitColorBlack: 3
- ClothingUniformJumpskirtColorBlack: 3
- ClothingUniformJumpsuitColorBlue: 2
- ClothingUniformJumpskirtColorBlue: 2
- ClothingUniformJumpsuitColorYellow: 2
- ClothingUniformJumpskirtColorYellow: 2
- ClothingUniformJumpsuitColorGreen: 2
- ClothingUniformJumpskirtColorGreen: 2
- ClothingUniformJumpsuitColorOrange: 2
- ClothingUniformJumpskirtColorOrange: 2
- ClothingUniformJumpsuitColorRed: 2
- ClothingUniformJumpskirtColorRed: 2
- ClothingUniformJumpsuitColorPurple: 2
- ClothingUniformJumpskirtColorPurple: 2
- ClothingUniformJumpsuitColorPink: 2
- ClothingUniformJumpskirtColorPink: 2
- ClothingUniformJumpsuitColorDarkBlue: 2
- ClothingUniformJumpskirtColorDarkBlue: 2
- ClothingUniformJumpsuitColorDarkGreen: 2
- ClothingUniformJumpskirtColorDarkGreen: 2
- ClothingUniformJumpsuitColorTeal: 2
- ClothingUniformJumpskirtColorTeal: 2
+ ClothingUniformJumpsuitColorBlue: 3
+ ClothingUniformJumpskirtColorBlue: 3
+ ClothingUniformJumpsuitColorYellow: 3
+ ClothingUniformJumpskirtColorYellow: 3
+ ClothingUniformJumpsuitColorGreen: 3
+ ClothingUniformJumpskirtColorGreen: 3
+ ClothingUniformJumpsuitColorOrange: 3
+ ClothingUniformJumpskirtColorOrange: 3
+ ClothingUniformJumpsuitColorRed: 3
+ ClothingUniformJumpskirtColorRed: 3
+ ClothingUniformJumpsuitColorPurple: 3
+ ClothingUniformJumpskirtColorPurple: 3
+ ClothingUniformJumpsuitColorPink: 3
+ ClothingUniformJumpskirtColorPink: 3
+ ClothingUniformJumpsuitColorDarkBlue: 3
+ ClothingUniformJumpskirtColorDarkBlue: 3
+ ClothingUniformJumpsuitColorTeal: 3
+ ClothingUniformJumpskirtColorTeal: 3
+ ClothingShoesColorBlack: 8
+ ClothingShoesColorBrown: 3
+ ClothingShoesColorWhite: 3
+ ClothingShoesColorBlue: 3
+ ClothingShoesColorYellow: 3
+ ClothingShoesColorGreen: 3
+ ClothingShoesColorOrange: 3
+ ClothingShoesColorRed: 3
+ ClothingShoesColorPurple: 3
+ ClothingHeadHatGreysoft: 8
+ ClothingHeadHatMimesoft: 3
+ ClothingHeadHatBluesoft: 3
+ ClothingHeadHatYellowsoft: 3
+ ClothingHeadHatGreensoft: 3
+ ClothingHeadHatOrangesoft: 3
+ ClothingHeadHatRedsoft: 3
+ ClothingHeadHatPurplesoft: 3
+ ClothingHeadHatCorpsoft: 3
+ ClothingNeckScarfStripedLightBlue: 2
+ ClothingNeckScarfStripedBlue: 2
+ ClothingNeckScarfStripedRed: 2
+ ClothingNeckScarfStripedOrange: 2
+ ClothingNeckScarfStripedBrown: 2
+ ClothingNeckScarfStripedPurple: 2
+ ClothingNeckScarfStripedBlack: 2
+ ClothingMaskNeckGaiter: 1
ClothingUniformJumpsuitHawaiBlack: 2
ClothingUniformJumpsuitHawaiBlue: 2
ClothingUniformJumpsuitHawaiRed: 2
ClothingUniformJumpsuitHawaiYellow: 2
ClothingUniformJumpsuitFlannel: 2
+ #WD edit start
+ ClothingUniformJumpsuitCossack: 1
+ ClothingOuterCoatBomber: 1
+ ClothingOuterWinterCoat: 1
+ ClothingOuterCoatGentle: 1
+ ClothingOuterCoatInspector: 1
+ ClothingUniformJumpsuitKimono: 1
+ ClothingOuterPonchoClassic: 1
+ ClothingOuterHoodieGrey: 1
+ ClothingOuterApron: 1
+ ClothingHeadHatHetmanHat: 1
+ ClothingHeadHatFedoraGrey: 1
+ ClothingHeadHatFedoraBrown: 1
+ ClothingHeadHatTophat: 1
+ ClothingHeadHatBeaverHat: 1
+ ClothingHeadHatUshanka: 1
+ ClothingHeadSafari: 1
+ ClothingHeadFishCap: 2
+ ClothingHeadHatCasa: 1
+ ClothingHeadHatFez: 1
+ ClothingHeadRastaHat: 1
+ ClothingEyesEyepatch: 1
+ ClothingShoesLeather: 1
+ ClothingHeadHatBeret: 4
+ ClothingHeadHatGreyFlatcap: 3
+ ClothingHeadHatBrownFlatcap: 3
+ ClothingUniformJumpsuitColorBlack: 3
+ ClothingUniformJumpskirtColorBlack: 3
+ ClothingUniformJumpsuitColorDarkGreen: 2
+ ClothingUniformJumpskirtColorDarkGreen: 2
ClothingUniformJumpsuitCasualBlue: 2
ClothingUniformJumpskirtCasualBlue: 2
ClothingUniformJumpsuitCasualPurple: 2
ClothingUniformJumpskirtCasualPurple: 2
ClothingUniformJumpsuitCasualRed: 2
ClothingUniformJumpskirtCasualRed: 2
- ClothingShoesColorBlack: 8
- ClothingShoesColorBrown: 4
- ClothingShoesColorWhite: 3
- ClothingShoesColorBlue: 2
- ClothingShoesColorYellow: 2
- ClothingShoesColorGreen: 2
- ClothingShoesColorOrange: 2
- ClothingShoesColorRed: 2
- ClothingShoesColorPurple: 2
- ClothingHeadHatGreysoft: 8
- ClothingHeadHatMimesoft: 3
- ClothingHeadHatBluesoft: 2
- ClothingHeadHatYellowsoft: 2
- ClothingHeadHatGreensoft: 2
- ClothingHeadHatOrangesoft: 2
- ClothingHeadHatRedsoft: 2
ClothingHeadHatBlacksoft: 2
- ClothingHeadHatPurplesoft: 2
- ClothingHeadHatCorpsoft: 2
- ClothingHeadFishCap: 2
- ClothingHeadRastaHat: 2
- ClothingBeltStorageWaistbag: 3
ClothingEyesGlasses: 6
ClothingEyesGlassesSunglasses: 2
ClothingHandsGlovesColorBlack: 4
@@ -83,6 +112,7 @@
ClothingHandsGlovesColorGreen: 2
ClothingHandsGlovesColorOrange: 2
ClothingHandsGlovesColorPurple: 2
+
#White bra start
ClothingUnderwearTopBraWhite: 5
ClothingUnderwearTopBraSports: 5
@@ -150,9 +180,3 @@
ClothingUnderwearSocksStripedThigh: 2
ClothingUnderwearSocksThinKnee: 1
ClothingUnderwearSocksThinThigh: 1
- # white end
- contrabandInventory:
- ClothingMaskNeckGaiter: 2
- ClothingUniformJumpsuitTacticool: 1
- ClothingUniformJumpskirtTacticool: 1
-
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/cola.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/cola.yml
index 2f9ce3d3ae..acf569ec0d 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/cola.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/cola.yml
@@ -1,12 +1,13 @@
- type: vendingMachineInventory
id: RobustSoftdrinksInventory
startingInventory:
- DrinkColaCan: 4
- DrinkGrapeCan: 2
- DrinkRootBeerCan: 2
- DrinkIcedTeaCan: 2
- DrinkLemonLimeCan: 2
- DrinkFourteenLokoCan: 2
+ DrinkColaCan: 6
+ DrinkGrapeCan: 4
+ DrinkRootBeerCan: 4
+ DrinkIcedTeaCan: 4
+ DrinkLemonLimeCan: 4
+ DrinkDrGibbCan: 4
+ DrinkFourteenLokoCan: 4
+ DrinkColaBottleFull: 2
emaggedInventory:
DrinkNukieCan: 2
- DrinkChangelingStingCan: 2
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/detdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/detdrobe.yml
index f45dd229a2..0d76415a6e 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/detdrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/detdrobe.yml
@@ -1,16 +1,24 @@
- type: vendingMachineInventory
id: DetDrobeInventory
startingInventory:
+ ClothingBackpackSatchelLeather: 2
+ ClothingHeadHatFedoraGrey: 2
+ ClothingHeadHatFedoraBrown: 2
+ ClothingHeadsetSecurity: 2
ClothingUniformJumpsuitDetective: 2
ClothingUniformJumpskirtDetective: 2
- ClothingShoesColorBrown: 2
ClothingOuterCoatDetective: 2
- ClothingHeadHatFedoraBrown: 2
+ ClothingOuterVestDetective: 2
+ ClothingOuterCoatGentle: 1
+ ClothingOuterCoatInspector: 1
+ ClothingOuterCoatJensen: 1
ClothingUniformJumpsuitDetectiveGrey: 2
ClothingUniformJumpskirtDetectiveGrey: 2
- ClothingOuterVestDetective: 2
ClothingNeckTieDet: 2
- ClothingHeadHatFedoraGrey: 2
+ ClothingShoesLeather: 2
+ ClothingShoesColorBrown: 2
ClothingHandsGlovesColorBlack: 2
ClothingHandsGlovesLatex: 2
- ClothingHeadsetSecurity: 2
+ CigPackGreen: 4
+ SmokingPipeFilledTobacco: 1
+ Matchbox: 2
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml
index 86f35b5269..49cc7b2486 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml
@@ -1,7 +1,7 @@
- type: vendingMachineInventory
id: DinnerwareInventory
startingInventory:
- ButchCleaver: 1
+ ButchCleaver: 2
KitchenKnife: 5
RollingPin: 4
Spoon: 4
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/discount.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/discount.yml
index ddf7943217..4a405be40e 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/discount.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/discount.yml
@@ -1,9 +1,8 @@
- type: vendingMachineInventory
id: DiscountDansInventory
startingInventory:
- FoodSnackCheesie: 3
- FoodSnackChips: 3
- FoodSnackBoritos: 3
- FoodSnackPopcorn: 3
- FoodSnackEnergy: 3
- CigPackMixed: 2
+ FoodSnackCheesie: 4
+ FoodSnackChips: 4
+ FoodSnackBoritos: 4
+ FoodSnackPopcorn: 4
+ FoodSnackEnergy: 4
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/donut.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/donut.yml
index 16dc3e628f..e9e7fc1d87 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/donut.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/donut.yml
@@ -1,9 +1,19 @@
- type: vendingMachineInventory
id: DonutInventory
startingInventory:
- FoodDonutChocolate: 5
- FoodDonutApple: 3
- FoodDonutPink: 3
- FoodDonutBungo: 3
+ #WD edit start
+ FoodDonutPlain: 3
+ FoodDonutPink: 2
+ FoodDonutChocolate: 2
+ FoodDonutCaramel: 2
+ FoodDonutApple: 2
+ FoodDonutBlumpkin: 2
+ FoodDonutMeat: 2
+ FoodDonutSpaceman: 2
+ FoodDonutBungo: 2
+ FoodDonutJellySlugcat: 1
emaggedInventory:
- FoodDonutPoison: 1
+ FoodDonutPoison: 3
+ contrabandInventory:
+ FoodDonutHomer: 2
+ #WD edit end
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/engidrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/engidrobe.yml
index 5d732def49..39df003b20 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/engidrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/engidrobe.yml
@@ -1,18 +1,20 @@
- type: vendingMachineInventory
id: EngiDrobeInventory
startingInventory:
- ClothingBackpackDuffelEngineering: 3
- ClothingBackpackSatchelEngineering: 3
- ClothingBackpackEngineering: 3
- ClothingUniformJumpsuitEngineering: 3
- ClothingUniformJumpskirtEngineering: 3
- ClothingUniformJumpsuitEngineeringHazard: 3
- ClothingShoesColorBlack: 3
- ClothingOuterVestHazard: 3
- ClothingShoesBootsWork: 3
- ClothingHeadHatHardhatYellow: 3
- ClothingHeadHatHardhatOrange: 3
- ClothingHeadsetEngineering: 3
- ClothingOuterWinterEngi: 2
- ClothingNeckScarfStripedOrange: 3
+ ClothingBackpackDuffelEngineering: 5
+ ClothingBackpackSatchelEngineering: 5
+ ClothingBackpackEngineering: 5
+ ClothingHeadHatBeretEngineering: 5
+ ClothingHeadHatHardhatYellow: 5
+ ClothingHeadHatHardhatOrange: 5
+ ClothingHeadsetEngineering: 5
+ ClothingNeckScarfStripedOrange: 5
+ ClothingOuterVestHazard: 5
+ ClothingOuterWinterEngi: 5
+ ClothingUniformJumpsuitEngineering: 5
+ ClothingUniformJumpskirtEngineering: 5
+ ClothingUniformJumpsuitEngineeringHazard: 5
+ ClothingBeltUtility: 5
+ ClothingShoesColorBlack: 5
+ ClothingShoesBootsWork: 5
ClothingShoesBootsWinterEngi: 2
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml
index c91eb1ef2e..30d36ff3af 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml
@@ -7,4 +7,8 @@
NetworkConfigurator: 5
PowerCellMedium: 5
ClothingHandsGlovesColorYellow: 6
- BoxInflatable: 2
+ HolofanProjector: 5
+ trayScanner: 5
+ GeigerCounter: 5
+ InflatableWallStack1: 24
+ InflatableDoorStack1: 8
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml
index f022b4b9a5..baca83007a 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml
@@ -16,3 +16,5 @@
PaperCNCSheet: 6
MysteryFigureBox: 2
BooksBag: 3
+ emaggedInventory:
+ BalloonSyn: 3
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/genedrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/genedrobe.yml
index 84a5f9a79b..a3dd6f9482 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/genedrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/genedrobe.yml
@@ -1,11 +1,12 @@
- type: vendingMachineInventory
id: GeneDrobeInventory
startingInventory:
- ClothingUniformJumpsuitGenetics: 2
- ClothingUniformJumpskirtGenetics: 2
- ClothingShoesColorWhite: 2
- ClothingOuterCoatLabGene: 2
- ClothingOuterWinterGen: 2
ClothingBackpackGenetics: 2
ClothingBackpackSatchelGenetics: 2
ClothingBackpackDuffelGenetics: 2
+ ClothingHeadHatBeretBrigmedic: 2
+ ClothingOuterCoatLabGene: 2
+ ClothingOuterWinterGen: 2
+ ClothingUniformJumpsuitGenetics: 2
+ ClothingUniformJumpskirtGenetics: 2
+ ClothingShoesColorWhite: 2
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/happyhonk.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/happyhonk.yml
index 50695edc19..6d271466ce 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/happyhonk.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/happyhonk.yml
@@ -2,7 +2,7 @@
id: HappyHonkDispenserInventory
startingInventory:
HappyHonk: 10
- HappyHonkMime: 4
+ HappyHonkMime: 10
emaggedInventory:
- HappyHonkCluwne: 1
- HappyHonkNukie: 1
+ HappyHonkCluwne: 3
+ HappyHonkNukie: 3
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/hydrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/hydrobe.yml
index 470abda91e..fd24fedc14 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/hydrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/hydrobe.yml
@@ -1,15 +1,17 @@
- type: vendingMachineInventory
id: HyDrobeInventory
startingInventory:
- ClothingBackpackHydroponics: 2
- ClothingBackpackSatchelHydroponics: 2
- ClothingBackpackDuffelHydroponics: 2
- ClothingOuterApronBotanist: 2
+ ClothingBackpackHydroponics: 3
+ ClothingBackpackSatchelHydroponics: 3
+ ClothingBackpackDuffelHydroponics: 3
+ ClothingHeadBandBotany: 3
+ ClothingHeadsetService: 3
+ ClothingOuterWinterHydro: 3
+ ClothingOuterApronBotanist: 3
+ ClothingBeltPlant: 3
ClothingUniformOveralls: 3
ClothingUniformJumpsuitHydroponics: 3
ClothingUniformJumpskirtHydroponics: 3
+ ClothingHandsGlovesLeather: 3
+ ClothingShoesColorGreen: 3
ClothingNeckScarfStripedGreen: 3
- ClothingHeadBandBotany: 3
- ClothingHeadsetService: 2
- ClothingOuterWinterHydro: 2
-
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/janidrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/janidrobe.yml
index b585d34051..ae465470d4 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/janidrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/janidrobe.yml
@@ -1,16 +1,15 @@
- type: vendingMachineInventory
id: JaniDrobeInventory
startingInventory:
- ClothingUniformJumpsuitJanitor: 2
- ClothingUniformJumpskirtJanitor: 2
+ ClothingBackpack: 4
+ ClothingHeadHatPurplesoft: 4
+ ClothingHeadsetService: 4
+ ClothingNeckScarfStripedPurple: 4
+ ClothingOuterWinterJani: 4
+ ClothingUniformJumpsuitJanitor: 4
+ ClothingUniformJumpskirtJanitor: 4
+ ClothingBeltJanitor: 4
+ ClothingHandsGlovesColorBlack: 4
+ ClothingShoesGaloshes: 2
+ ClothingShoesColorBlack: 4
ClothingHandsGlovesJanitor: 2
- ClothingShoesColorBlack: 2
- ClothingHeadHatPurplesoft: 2
- ClothingBeltJanitor: 2
- ClothingHeadsetService: 2
- ClothingOuterWinterJani: 2
- ClothingNeckScarfStripedPurple: 3
-
- emaggedInventory:
- ClothingUniformJumpskirtJanimaid: 2
- ClothingUniformJumpskirtJanimaidmini: 1
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/lawdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/lawdrobe.yml
index 8f39a102a8..56b892a804 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/lawdrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/lawdrobe.yml
@@ -1,19 +1,24 @@
- type: vendingMachineInventory
id: LawDrobeInventory
startingInventory:
- ClothingUniformJumpsuitLawyerBlue: 1
- ClothingUniformJumpskirtLawyerBlue: 1
- ClothingUniformJumpsuitLawyerPurple: 1
- ClothingUniformJumpskirtLawyerPurple: 1
- ClothingUniformJumpsuitLawyerRed: 1
- ClothingUniformJumpskirtLawyerRed: 1
- ClothingUniformJumpsuitLawyerBlack: 1
- ClothingUniformJumpskirtLawyerBlack: 1
- ClothingUniformJumpsuitLawyerGood: 1
- ClothingUniformJumpskirtLawyerGood: 1
- ClothingShoesBootsLaceup: 2
+ ClothingBackpack: 2
ClothingHeadsetService: 2
+ ClothingEyesGlassesSunglasses: 2
+ ClothingEyesGlasses: 2
ClothingNeckLawyerbadge: 2
+ ClothingUniformJumpsuitLawyerBlue: 2
+ ClothingUniformJumpskirtLawyerBlue: 2
+ ClothingUniformJumpsuitLawyerPurple: 2
+ ClothingUniformJumpskirtLawyerPurple: 2
+ ClothingUniformJumpsuitLawyerRed: 2
+ ClothingUniformJumpskirtLawyerRed: 2
+ ClothingUniformJumpsuitLawyerBlack: 2
+ ClothingUniformJumpskirtLawyerBlack: 2
+ ClothingUniformJumpsuitLawyerGood: 2
+ ClothingUniformJumpskirtLawyerGood: 2
+ ClothingHandsGlovesColorWhite: 2
+ ClothingShoesBootsLaceup: 2
+ RubberStampLawyer: 1
Eftpos: 3
emaggedInventory:
CyberPen: 1
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/magivend.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/magivend.yml
index 7617186dd9..8125fa0dc4 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/magivend.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/magivend.yml
@@ -9,6 +9,3 @@
ClothingHeadHatVioletwizard: 3
ClothingOuterWizardViolet: 3
ClothingShoesWizard: 9
- #TO DO:
- #only missing staff
- #and if wizarditis reagent when hacked if we want this.
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/medical.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/medical.yml
index 09c7ba7f99..df23526d30 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/medical.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/medical.yml
@@ -5,6 +5,12 @@
Brutepack: 5
Ointment: 5
Bloodpack: 5
+ Gauze: 5
EpinephrineChemistryBottle: 3
Syringe: 5
- Eftpos: 2 #WD edit
+ EmergencyMedipen: 2
+ SyringeBicaridine: 1
+ SyringeDermaline: 1
+ Eftpos: 2
+ emaggedInventory:
+ SyringeEphedrine: 1
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/medidrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/medidrobe.yml
index a511b08d65..f4d80b5d5c 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/medidrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/medidrobe.yml
@@ -4,18 +4,29 @@
ClothingBackpackDuffelMedical: 4
ClothingBackpackMedical: 4
ClothingBackpackSatchelMedical: 4
+ ClothingHeadHelmetVoidParamed: 2
+ ClothingOuterHardsuitVoidParamed: 2
+ ClothingHeadHatBeretBrigmedic: 4
+ ClothingHeadNurseHat: 4
+ ClothingHeadHatParamedicsoft: 4
+ ClothingHeadsetMedical: 4
+ ClothingEyesHudMedical: 5
+ ClothingMaskSterile: 4
+ ClothingOuterWinterMed: 4
+ ClothingOuterWinterPara: 4
+ ClothingOuterCoatParamedicWB: 4
+ ClothingOuterCoatLab: 4
+ ClothingUniformJumpsuitParamedic: 4
+ ClothingUniformJumpskirtParamedic: 4
+ ClothingHandsGlovesLatex: 4
+ ClothingShoesColorWhite: 9
+ ClothingOuterHospitalGown: 5
+ UniformScrubsColorGreen: 5
+ UniformScrubsColorBlue: 5
+ UniformScrubsColorPurple: 5
ClothingUniformJumpsuitMedicalDoctor: 4
ClothingUniformJumpskirtMedicalDoctor: 4
ClothingEyesEyepatchHudMedical: 1
ClothingHeadHatBeretMedic: 4
- ClothingHeadNurseHat: 4
- ClothingOuterCoatLab: 4
- ClothingShoesColorWhite: 4
- ClothingHandsGlovesLatex: 4
- ClothingHeadsetMedical: 4
- ClothingOuterWinterMed: 2
- ClothingOuterHospitalGown: 5
- UniformScrubsColorGreen: 4
- UniformScrubsColorBlue: 4
- UniformScrubsColorPurple: 4
ClothingShoesBootsWinterMed: 2
+
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/nutri.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/nutri.yml
index 08b400518d..614a018c87 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/nutri.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/nutri.yml
@@ -7,17 +7,16 @@
HydroponicsToolScythe: 4
HydroponicsToolHatchet: 4
PlantBag: 4
- HandheldSeedAnalyzer: 4
PlantBGoneSpray: 20
WeedSpray: 20
PestSpray: 20
Syringe: 5
- RobustHarvestChemistryBottle: 3
- EZNutrientChemistryBottle: 3
- Bucket: 3
+ RobustHarvestChemistryBottle: 5
+ Bucket: 5
DiseaseSwab: 20
- Eftpos: 4 #WD edit
- #TO DO:
- #plant analyzer
+ HandheldSeedAnalyzer: 4
+ EZNutrientChemistryBottle: 3
+ Eftpos: 4
+
emaggedInventory:
Left4ZedChemistryBottle: 1
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/pwrgame.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/pwrgame.yml
index 96513fca8a..800865c859 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/pwrgame.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/pwrgame.yml
@@ -1,13 +1,13 @@
- type: vendingMachineInventory
id: PwrGameInventory
startingInventory:
- DrinkPwrGameCan: 4
- DrinkEnergyDrinkCan: 4
- DrinkGrapeCan: 2
- DrinkRootBeerCan: 2
- DrinkIcedTeaCan: 2
- DrinkLemonLimeCan: 2
- DrinkFourteenLokoCan: 2
+ DrinkPwrGameCan: 5
+ DrinkEnergyDrinkCan: 5
+ DrinkGrapeCan: 5
+ DrinkRootBeerCan: 5
+ DrinkIcedTeaCan: 5
+ DrinkLemonLimeCan: 5
+ DrinkDrGibbCan: 5
+ DrinkFourteenLokoCan: 5
emaggedInventory:
DrinkNukieCan: 2
- DrinkChangelingStingCan: 2
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/robodrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/robodrobe.yml
index abccb7e714..969dee34fb 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/robodrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/robodrobe.yml
@@ -1,12 +1,15 @@
- type: vendingMachineInventory
id: RoboDrobeInventory
startingInventory:
- ClothingOuterCoatRobo: 2
- ClothingUniformJumpsuitRoboticist: 2
- ClothingUniformJumpskirtRoboticist: 2
- ClothingShoesColorBlack: 2
- ClothingHandsGlovesRobohands: 2
ClothingHeadHatCorpsoft: 2
ClothingHeadBandSkull: 2
ClothingHeadsetRobotics: 2
+ ClothingEyesHudDiagnostic: 2
ClothingOuterWinterRobo: 2
+ ClothingOuterCoatRobo: 2
+ ClothingUniformJumpsuitRoboticist: 2
+ ClothingUniformJumpskirtRoboticist: 2
+ ClothingHandsGlovesFingerless: 2
+ ClothingShoesColorBlack: 2
+ ClothingHandsGlovesRobohands: 2
+
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/robotics.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/robotics.yml
index 077aa2dca4..16a1d8dc78 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/robotics.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/robotics.yml
@@ -1,19 +1,19 @@
- type: vendingMachineInventory
id: RoboticsInventory
startingInventory:
- CableApcStack: 4
+ CableApcStack: 10
+ ProximitySensor: 10
+ RemoteSignaller: 10
SciFlash: 4
- ProximitySensor: 3
ClothingEyesHudDiagnostic: 2
- RemoteSignaller: 3
- Igniter: 3 # its more ordnance but yeah
+ Igniter: 3
HandheldHealthAnalyzer: 3
Scalpel: 2
SawElectric: 2
- #Bonesetter: 2 add when robotics
NitrousOxideTankFilled: 2
ClothingMaskBreathMedical: 5
ClothingHeadHatWeldingMaskFlame: 1
Welder: 1
Screwdriver: 2
Crowbar: 2
+
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/salvage.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/salvage.yml
index b5665df37b..63ce6940da 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/salvage.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/salvage.yml
@@ -1,15 +1,24 @@
- type: vendingMachineInventory
id: SalvageEquipmentInventory
startingInventory:
- Crowbar: 2
- Pickaxe: 4
- OreBag: 4
- Flare: 4
- FlashlightLantern: 2
- Floodlight: 2
- HandheldGPSBasic: 2
- RadioHandheld: 2
WeaponProtoKineticAccelerator: 4
- SeismicCharge: 2
- FultonBeacon: 1
- Fulton: 2
+ WeaponCrusher: 4
+ WeaponCrusherDagger: 4
+ WeaponGrapplingGun: 3
+ HandheldGPSBasic: 10
+ Crowbar: 6
+ BoxMRE: 6
+ Pickaxe: 6
+ SurvivalKnife: 3
+ OreBag: 6
+ Flare: 20
+ FlashlightLantern: 6
+ Floodlight: 2
+ RadioHandheld: 10
+ StackHolderHealingItem: 2
+ InflatableWallStack1: 40
+ InflatableDoorStack1: 10
+ SeismicCharge: 3
+ FultonBeacon: 2
+ Fulton: 3
+
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/scidrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/scidrobe.yml
index 9827d02284..4f433bd84d 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/scidrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/scidrobe.yml
@@ -1,17 +1,23 @@
- type: vendingMachineInventory
id: SciDrobeInventory
startingInventory:
- ClothingBackpackScience: 3
- ClothingBackpackSatchelScience: 3
- ClothingBackpackDuffelScience: 3
- ClothingUniformJumpsuitScientist: 3
- ClothingUniformJumpskirtScientist: 3
- ClothingUniformJumpsuitScientistFormal: 3
- ClothingOuterCoatRnd: 3
- ClothingShoesColorWhite: 3
- ClothingNeckTieSci: 3
- ClothingHeadsetScience: 3
- ClothingMaskGas: 3
- ClothingOuterWinterSci: 2
- ClothingNeckScarfStripedPurple: 3
+ ClothingBackpackScience: 6
+ ClothingBackpackSatchelScience: 6
+ ClothingBackpackDuffelScience: 6
+ ClothingHeadHatBeretRND: 6
+ ClothingHeadsetScience: 6
+ ClothingMaskGas: 6
+ ClothingNeckScarfStripedPurple: 6
+ ClothingNeckTieSci: 6
+ ClothingOuterCoatRnd: 6
+ ClothingOuterWinterSci: 6
+ ClothingUniformJumpsuitScientist: 6
+ ClothingUniformJumpskirtScientist: 6
+ ClothingUniformJumpsuitScientistFormal: 6
+ ClothingHandsGlovesLatex: 6
+ ClothingShoesColorWhite: 6
+ ClothingOuterBioScientist: 2
+ ClothingHeadHatHoodBioScientist: 2
ClothingShoesBootsWinterSci: 2
+
+
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml
index d3b7b41cad..a09b6efc20 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml
@@ -1,26 +1,29 @@
- type: vendingMachineInventory
id: SecTechInventory
startingInventory:
- SecurityWhistle: 5
Handcuffs: 8
+ Zipties: 12
GrenadeFlashBang: 4
- TearGasGrenade: 4
- ClusterBangFull: 2
+ TearSmokeGrenade: 4
+ SmokeGrenade: 6
GrenadeStinger: 4
- Flash: 5
- Tourniquet: 5
+ Flash: 7
+ Bola: 7
FlashlightSeclite: 5
ClothingEyesGlassesSunglasses: 2
- ClothingEyesHudSecurity: 2
- ClothingEyesEyepatchHudSecurity: 1
- ClothingEyesGlassesSecurity: 4
ClothingBeltSecurityWebbing: 5
- Zipties: 12
RiotShield: 2
RiotLaserShield: 2
RiotBulletShield: 2
- # security officers need to follow a diet regimen!
+ SecurityWhistle: 5
+ TearGasGrenade: 4
+ ClusterBangFull: 2
+ Tourniquet: 5
+
contrabandInventory:
FoodDonutHomer: 12
FoodBoxDonut: 2
- #box evidence
+
+ emaggedInventory:
+ ExGrenade: 1
+ Truncheon: 1
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/secdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/secdrobe.yml
index fb269ddc43..b3634d4dab 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/secdrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/secdrobe.yml
@@ -1,26 +1,27 @@
- type: vendingMachineInventory
id: SecDrobeInventory
startingInventory:
- ClothingBackpackSecurity: 3
- ClothingBackpackSatchelSecurity: 3
- ClothingBackpackDuffelSecurity: 3
- ClothingUniformJumpsuitSec: 3
- ClothingShoesBootsJack: 3
- ClothingHeadHatBeretSecurity: 3
- ClothingHeadHatSecsoft: 3
- ClothingHeadBandRed: 3
- ClothingHandsGlovesColorBlack: 3
- ClothingHandsGlovesFingerless: 3
- ClothingUniformJumpskirtSec: 3
- ClothingUniformJumpsuitSecGrey: 3
- ClothingUniformJumpskirtSecGrey: 3
- ClothingUniformJumpsuitSecBlue: 3
- ClothingHeadsetSecurity: 3
- ClothingOuterWinterSec: 2
+ ClothingBackpackSecurity: 4
+ ClothingBackpackSatchelSecurity: 4
+ ClothingBackpackDuffelSecurity: 4
+ ClothingHeadHatBeret: 4
+ ClothingHeadHatSecsoft: 4
+ ClothingHeadBandRed: 4
+ ClothingHeadsetSecurity: 4
+ ClothingEyesGlassesSecurity: 4
+ ClothingOuterWinterSec: 4
ClothingOuterArmorBasic: 4
+ ClothingUniformJumpsuitSec: 4
+ ClothingUniformJumpskirtSec: 4
+ ClothingUniformJumpsuitSecGrey: 4
+ ClothingUniformJumpsuitSecBlue: 4
+ ClothingHandsGlovesColorBlack: 4
+ ClothingShoesBootsJack: 4
+ ClothingShoesBootsCombat: 4
+ ClothingHeadHatBeretSecurity: 3
+ ClothingHandsGlovesFingerless: 3
+ ClothingUniformJumpskirtSecGrey: 3
ClothingNeckScarfStripedRed: 3
- ClothingEyesBlindfold: 1
- ClothingShoesBootsCombat: 1
- ClothingShoesBootsWinterSec: 2
- ClothingShoesBootsCowboyBlack: 1
- ClothingHeadHatCowboyBlack: 1
\ No newline at end of file
+ ClothingShoesBootsWinterSec: 3
+ ClothingShoesBootsCowboyBlack: 3
+ ClothingHeadHatCowboyBlack: 3
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/seeds.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/seeds.yml
index 25e41702af..a9646559d9 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/seeds.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/seeds.yml
@@ -1,8 +1,8 @@
- type: vendingMachineInventory
id: MegaSeedServitorInventory
startingInventory:
- AloeSeeds: 3
- AmbrosiaVulgarisSeeds: 3
+ AloeSeeds: 5
+ AmbrosiaVulgarisSeeds: 5
AppleSeeds: 5
BananaSeeds: 5
CarrotSeeds: 5
@@ -12,20 +12,18 @@
CornSeeds: 5
EggplantSeeds: 5
EggySeeds: 5
- GalaxythistleSeeds: 3
- GarlicSeeds: 3
+ GalaxythistleSeeds: 5
+ GarlicSeeds: 5
GrapeSeeds: 5
LemonSeeds: 5
LimeSeeds: 5
- PineappleSeeds: 4
- LingzhiSeeds: 3
+ LingzhiSeeds: 5
OatSeeds: 5
OnionSeeds: 5
OnionRedSeeds: 5
OrangeSeeds: 5
- PoppySeeds: 3
+ PoppySeeds: 5
PotatoSeeds: 5
- PumpkinSeeds: 5
RiceSeeds: 5
SoybeanSeeds: 5
SugarcaneSeeds: 5
@@ -33,6 +31,8 @@
TowercapSeeds: 5
WheatSeeds: 5
WatermelonSeeds: 5
+ PineappleSeeds: 4
+ PumpkinSeeds: 5
CocoaSeeds: 3
BerrySeeds: 5
PeaSeeds: 5
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/shamblersjuice.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/shamblersjuice.yml
index 08c0162c08..9ebf93ecc8 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/shamblersjuice.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/shamblersjuice.yml
@@ -2,11 +2,13 @@
id: ShamblersJuiceInventory
startingInventory:
DrinkShamblersJuiceCan: 4
- DrinkGrapeCan: 2
- DrinkRootBeerCan: 2
- DrinkIcedTeaCan: 2
- DrinkLemonLimeCan: 2
- DrinkFourteenLokoCan: 2
+ DrinkGrapeCan: 4
+ DrinkRootBeerCan: 4
+ DrinkIcedTeaCan: 4
+ DrinkLemonLimeCan: 4
+ DrinkDrGibbCan: 4
+ DrinkFourteenLokoCan: 4
+
emaggedInventory:
DrinkNukieCan: 2
- DrinkChangelingStingCan: 2
+
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/snack.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/snack.yml
index b797f588fe..e7f7c61f58 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/snack.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/snack.yml
@@ -1,12 +1,16 @@
- type: vendingMachineInventory
id: GetmoreChocolateCorpInventory
startingInventory:
- FoodSnackRaisins: 3
- FoodSnackChocolate: 3
+ FoodSnackRaisins: 4
+ FoodSnackChocolate: 4
+ FoodSnackPopcorn: 4
+ DrinkRamen: 4
+ DrinkHellRamen: 4
FoodSnackCnDs: 3
FoodSnackPistachios: 3
FoodSnackSus: 3
FoodSnackSemki: 3
+
emaggedInventory:
FoodSnackSyndi: 3
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/soda.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/soda.yml
index 494f05f6a3..abf61f3bdc 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/soda.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/soda.yml
@@ -1,12 +1,13 @@
- type: vendingMachineInventory
id: SodaInventory
startingInventory:
- DrinkColaCan: 3
- DrinkGrapeCan: 3
- DrinkRootBeerCan: 3
- DrinkIcedTeaCan: 3
- DrinkLemonLimeCan: 3
- DrinkFourteenLokoCan: 3
+ DrinkColaCan: 4
+ DrinkGrapeCan: 4
+ DrinkRootBeerCan: 4
+ DrinkIcedTeaCan: 4
+ DrinkLemonLimeCan: 4
+ DrinkDrGibbCan: 4
+ DrinkFourteenLokoCan: 4
emaggedInventory:
DrinkNukieCan: 3
DrinkChangelingStingCan: 3
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sovietsoda.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sovietsoda.yml
index 34f0906366..8fb25c0087 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sovietsoda.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sovietsoda.yml
@@ -1,6 +1,6 @@
- type: vendingMachineInventory
id: BodaInventory
startingInventory:
- DrinkSodaWaterCan: 10 #typically hacked product. Default product is "soda"
+ DrinkSodaWaterCan: 20
contrabandInventory:
DrinkColaCan: 10
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/spaceup.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/spaceup.yml
index 0dc33cf07f..00a77794a9 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/spaceup.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/spaceup.yml
@@ -1,13 +1,14 @@
- type: vendingMachineInventory
id: SpaceUpInventory
startingInventory:
- DrinkSpaceUpCan: 3
- DrinkSpaceMountainWindCan: 3
- DrinkGrapeCan: 2
- DrinkRootBeerCan: 2
- DrinkIcedTeaCan: 2
- DrinkLemonLimeCan: 2
- DrinkFourteenLokoCan: 2
+ DrinkSpaceUpCan: 4
+ DrinkSpaceMountainWindCan: 4
+ DrinkGrapeCan: 4
+ DrinkRootBeerCan: 4
+ DrinkIcedTeaCan: 4
+ DrinkLemonLimeCan: 4
+ DrinkDrGibbCan: 4
+ DrinkFourteenLokoCan: 4
emaggedInventory:
DrinkNukieCan: 2
DrinkChangelingStingCan: 2
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/starkist.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/starkist.yml
index 6afbe1eae6..eb38164840 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/starkist.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/starkist.yml
@@ -2,11 +2,12 @@
id: StarkistInventory
startingInventory:
DrinkStarkistCan: 4
- DrinkGrapeCan: 2
- DrinkRootBeerCan: 2
- DrinkIcedTeaCan: 2
- DrinkLemonLimeCan: 2
- DrinkFourteenLokoCan: 2
+ DrinkGrapeCan: 4
+ DrinkRootBeerCan: 4
+ DrinkIcedTeaCan: 4
+ DrinkLemonLimeCan: 4
+ DrinkDrGibbCan: 4
+ DrinkFourteenLokoCan: 4
emaggedInventory:
DrinkNukieCan: 2
DrinkChangelingStingCan: 2
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sustenance.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sustenance.yml
index 9fa3499e15..59eced2370 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sustenance.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sustenance.yml
@@ -1,7 +1,7 @@
- type: vendingMachineInventory
id: SustenanceInventory
startingInventory:
- DrinkMREFlask: 3
+ DrinkMREFlask: 5
FoodSnackNutribrick: 5
FoodSnackMREBrownie: 5
FoodCondimentPacketKetchup: 5
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/tankdispenser.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/tankdispenser.yml
index fce18024a7..2435e1d5e6 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/tankdispenser.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/tankdispenser.yml
@@ -1,8 +1,10 @@
- type: vendingMachineInventory
id: TankDispenserEVAInventory
startingInventory:
- OxygenTankFilled: 10
- NitrogenTankFilled: 10
+ OxygenTankFilled: 7
+ EmergencyOxygenTankFilled: 10
+ ExtendedEmergencyOxygenTankFilled: 3
+ NitrogenTankFilled: 7
- type: vendingMachineInventory
id: TankDispenserEngineeringInventory
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml
index f39cda0ed4..2a68af6cc5 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml
@@ -21,7 +21,6 @@
ClothingOuterSanta: 2
ClothingHeadHatSkub: 2
ClothingOuterSkub: 2
- ClothingHeadHatBeretFrench: 2
ClothingOuterSuitChicken: 2
ClothingHeadHatChickenhead: 2
ClothingOuterSuitMonkey: 2
@@ -29,8 +28,6 @@
ClothingHeadHatShrineMaidenWig: 2
ClothingOuterSuitShrineMaiden: 2
Gohei: 2
- ClothingHeadHatRedRacoon: 2
- ClothingOuterRedRacoon: 2
ClothingHeadPaperSack: 2
ClothingHeadPaperSackSmile: 2
ClothingEyesBlindfold: 1
@@ -44,6 +41,23 @@
ClothingUniformJumpsuitKimono: 1
ClothingHeadHatCasa: 1
ClothingHeadHatHairflower: 1
+ ClothingShoesClownLarge: 1
+ ClothingMaskItalianMoustache: 1
+ ClothingShoesFlippers: 1
+ ClothingMaskRat: 1
+ ClothingMaskRaven: 1
+ ClothingMaskBear: 1
+ ClothingMaskJackal: 1
+ ClothingMaskFox: 1
+ ClothingShoeSlippersDuck: 3
+ ClothingShoesSlippers: 1
+ ClothingHeadHatHoodMoth: 2
+ ClothingNeckCloakMoth: 2
+ ClothingOuterDogi: 1
+ ClothingHeadHatMagician: 1
+ ClothingHeadHatBeretFrench: 2
+ ClothingHeadHatRedRacoon: 2
+ ClothingOuterRedRacoon: 2
ClothingHeadHatGladiator: 1
ClothingUniformJumpsuitGladiator: 1
ClothingHeadHatCowboyBrown: 1
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/vendomat.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/vendomat.yml
index da7e30fd76..4b261ced7f 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/vendomat.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/vendomat.yml
@@ -1,8 +1,8 @@
- type: vendingMachineInventory
id: VendomatInventory
startingInventory:
- RemoteSignaller: 1
- Igniter: 2
+ RemoteSignaller: 4
+ Igniter: 5
Wirecutter: 1
CableApcStack: 2
FlashlightLantern: 2
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/virodrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/virodrobe.yml
index b9144167a1..de742497b4 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/virodrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/virodrobe.yml
@@ -1,12 +1,16 @@
- type: vendingMachineInventory
id: ViroDrobeInventory
startingInventory:
- ClothingUniformJumpsuitVirology: 2
- ClothingUniformJumpskirtVirology: 2
- ClothingShoesColorWhite: 2
- ClothingOuterCoatLabViro: 2
- ClothingOuterWinterViro: 2
- ClothingMaskSterile: 2
ClothingBackpackVirology: 2
ClothingBackpackSatchelVirology: 2
ClothingBackpackDuffelVirology: 2
+
+ ClothingMaskSterile: 2
+ ClothingHeadsetMedical: 2
+ ClothingEyesGlasses: 2
+ ClothingOuterCoatLabViro: 2
+ ClothingOuterWinterViro: 2
+ ClothingUniformJumpsuitVirology: 2
+ ClothingUniformJumpskirtVirology: 2
+ ClothingHandsGlovesLatex: 2
+ ClothingShoesColorWhite: 2
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/wallmed.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/wallmed.yml
index 405e2eff56..7fec8454b5 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/wallmed.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/wallmed.yml
@@ -1,8 +1,13 @@
- type: vendingMachineInventory
id: NanoMedInventory
startingInventory:
- Brutepack: 3
- Ointment: 3
- Bloodpack: 3
+ HandheldHealthAnalyzer: 3
+ Brutepack: 5
+ Ointment: 5
+ Bloodpack: 5
+ Gauze: 5
EpinephrineChemistryBottle: 3
- Syringe: 3
+ Syringe: 5
+ EmergencyMedipen: 2
+ SyringeBicaridine: 1
+ SyringeDermaline: 1
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml
index 0f8c73dac3..bb08661f3d 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml
@@ -18,7 +18,6 @@
ClothingOuterCoatBomber: 3
ClothingHeadHatSantahat: 2
ClothingHeadHatXmasCrown: 2
-
emaggedInventory:
ClothingNeckScarfStripedSyndieGreen: 3
ClothingNeckScarfStripedSyndieRed: 3
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/youtool.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/youtool.yml
index 2231c714ff..15e7f6c22e 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/youtool.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/youtool.yml
@@ -3,18 +3,17 @@
startingInventory:
CableApcStack: 5
Crowbar: 5
- Welder: 2
- Wirecutter: 3
- Wrench: 3
- Screwdriver: 3
- trayScanner: 3
- NetworkConfigurator: 3
- GasAnalyzer: 3
+ Welder: 5
+ Wirecutter: 5
+ Wrench: 5
+ Screwdriver: 5
+ trayScanner: 5
+ NetworkConfigurator: 5
+ GasAnalyzer: 5
FlashlightLantern: 5
- ClothingHandsGlovesColorYellowBudget: 3
- SprayPainter: 3
- # Some engineer forgot to take the multitool out the youtool when working on it, happens.
+ ClothingHandsGlovesColorYellowBudget: 5
+ AirlockPainter: 5
+ Multitool: 5
+
contrabandInventory:
- Multitool: 1
- emaggedInventory:
- ClothingHandsGlovesColorYellow: 1
+ ClothingHandsGlovesColorYellow: 2
diff --git a/Resources/Prototypes/Catalog/catalog.yml b/Resources/Prototypes/Catalog/catalog.yml
index 49cdef2a40..07bc9f850d 100644
--- a/Resources/Prototypes/Catalog/catalog.yml
+++ b/Resources/Prototypes/Catalog/catalog.yml
@@ -24,16 +24,6 @@
categories:
- Debug
-- type: listing
- id: DebugListing4
- name: debug name 4
- description: debug desc 4
- productAction: ActionScream
- categories:
- - Debug
- cost:
- DebugDollar: 1
-
- type: listing
id: DebugListing2
name: debug name 2
diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml
index 3448a8cf5d..8e990e3846 100644
--- a/Resources/Prototypes/Catalog/uplink_catalog.yml
+++ b/Resources/Prototypes/Catalog/uplink_catalog.yml
@@ -578,7 +578,7 @@
description: uplink-radio-jammer-desc
productEntity: RadioJammer
cost:
- Telecrystal: 4
+ Telecrystal: 2
categories:
- UplinkUtility
diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml
index 31dd47a9e1..e850785863 100644
--- a/Resources/Prototypes/Damage/modifier_sets.yml
+++ b/Resources/Prototypes/Damage/modifier_sets.yml
@@ -171,6 +171,16 @@
flatReductions:
Heat: 3
+- type: damageModifierSet
+ id: HardLightBarrier
+ coefficients:
+ Heat: 0.8
+ Blunt: 0.8
+ Slash: 0.8
+ Piercing: 0.8
+ Cold: 0.8
+ Shock: 1.6
+
- type: damageModifierSet
id: Scale # Skin tougher, bones weaker, strong stomachs, cold-blooded (kindof)
coefficients:
diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml
index e5993c6349..4e77d63987 100644
--- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml
+++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml
@@ -339,7 +339,7 @@
- type: Storage
whitelist:
tags:
- # - PlantAnalyzer
+ - PlantAnalyzer
- PlantSampleTaker
- BotanyShovel
- BotanyHoe
@@ -358,10 +358,10 @@
whitelist:
tags:
- BotanyHatchet
- # hydro:
- # whitelist:
- # tags:
- # - PlantAnalyzer # Dunno what to put here, should be aight.
+ hydro:
+ whitelist:
+ tags:
+ - PlantAnalyzer # Dunno what to put here, should be aight.
hoe:
whitelist:
tags:
diff --git a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml
index e49f22ceec..ac2545d165 100644
--- a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml
+++ b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml
@@ -83,12 +83,12 @@
suffix: Rigged
components:
- type: StaminaDamageOnHit
- damage: 25
+ damage: 30
- type: MeleeWeapon
- attackRate: 1.4
+ attackRate: 1.5
damage:
types:
- Blunt: 8
+ Blunt: 10
bluntStaminaDamageFactor: 0.0 # so blunt doesn't deal stamina damage at all
- type: entity
diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
index 42ca6ebfbf..0307a01ef1 100644
--- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
+++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
@@ -664,12 +664,36 @@
Heat: 0.25
Radiation: 0.25
Caustic: 0.75
- - type: ClothingSpeedModifier
- walkModifier: 0.8
- sprintModifier: 0.8
- - type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitWizard
+ - type: ContainerContainer
+ containers:
+ cell_slot: !type:ContainerSlot
+ toggleable-clothing: !type:ContainerSlot
+ - type: PowerCellSlot
+ cellSlotId: cell_slot
+ - type: ItemSlots
+ slots:
+ cell_slot:
+ name: power-cell-slot-component-slot-name-default
+ startingItem: PowerCellMicroreactor
+ whitelist:
+ tags:
+ - PowerCell
+ - PowerCellSmall
+ - PowerCellHyper
+ - PowerCellMicroreactor
+ - type: EnergyDomeGenerator
+ damageEnergyDraw: 3
+ domePrototype: EnergyDomeSmallPink
+ - type: ClothingSpeedModifier
+ walkModifier: 1
+ sprintModifier: 1
+ - type: PowerCellDraw
+ drawRate: 8
+ useRate: 0
+ - type: UseDelay
+ delay: 10.0
#Ling Space Suit
- type: entity
diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml
index 0df8fae943..7ca1a8da6a 100644
--- a/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml
+++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml
@@ -14,8 +14,8 @@
coefficients:
Blunt: 0.6 #ballistic plates = better protection
Slash: 0.6
- Piercing: 0.3
- Heat: 0.9
+ Piercing: 0.4
+ Heat: 0.8
- type: ExplosionResistance
damageCoefficient: 0.9
diff --git a/Resources/Prototypes/Entities/Effects/admin_triggers.yml b/Resources/Prototypes/Entities/Effects/admin_triggers.yml
index e1f366678d..d61847f907 100644
--- a/Resources/Prototypes/Entities/Effects/admin_triggers.yml
+++ b/Resources/Prototypes/Entities/Effects/admin_triggers.yml
@@ -7,7 +7,7 @@
sprite: /Textures/Objects/Fun/goldbikehorn.rsi
visible: false
state: icon
- - type: TriggerOnSpawn
+ - type: TriggerOnSpawn
- type: TimedDespawn
lifetime: 5
@@ -27,9 +27,9 @@
components:
- type: FlashOnTrigger
range: 7
- - type: SpawnOnTrigger
+ - type: SpawnOnTrigger
proto: GrenadeFlashEffect
-
+
- type: entity
id: AdminInstantEffectSmoke3
suffix: Smoke (03 sec)
@@ -43,7 +43,7 @@
- type: TimerTriggerVisuals
primingSound:
path: /Audio/Effects/Smoke-grenade.ogg
-
+
- type: entity
id: AdminInstantEffectSmoke10
suffix: Smoke (10 sec)
@@ -57,7 +57,7 @@
- type: TimerTriggerVisuals
primingSound:
path: /Audio/Effects/Smoke-grenade.ogg
-
+
- type: entity
id: AdminInstantEffectSmoke30
suffix: Smoke (30 sec)
@@ -89,7 +89,7 @@
id: AdminInstantEffectGravityWell
suffix: Gravity Well
parent: AdminInstantEffectBase
- components:
+ components:
- type: SoundOnTrigger
removeOnTrigger: true
sound:
@@ -103,10 +103,34 @@
path: /Audio/Effects/Grenades/Supermatter/supermatter_loop.ogg
- type: GravityWell
maxRange: 8
- baseRadialAcceleration: 10
+ baseRadialAcceleration: 250
baseTangentialAcceleration: 0
gravPulsePeriod: 0.01
- type: SingularityDistortion
intensity: 10
falloffPower: 1.5
-
+
+- type: entity
+ id: AdminInstantEffectMinusGravityWell
+ suffix: Gravity Well
+ parent: AdminInstantEffectBase
+ components:
+ - type: SoundOnTrigger
+ removeOnTrigger: true
+ sound:
+ path: /Audio/Effects/Grenades/Supermatter/supermatter_start.ogg
+ volume: 5
+ - type: AmbientSound
+ enabled: true
+ volume: -5
+ range: 14
+ sound:
+ path: /Audio/Effects/Grenades/Supermatter/supermatter_loop.ogg
+ - type: GravityWell
+ maxRange: 10
+ baseRadialAcceleration: -200
+ baseTangentialAcceleration: -5
+ gravPulsePeriod: 0.01
+ - type: SingularityDistortion
+ intensity: 10
+ falloffPower: 1.5
diff --git a/Resources/Prototypes/Entities/Effects/dome.yml b/Resources/Prototypes/Entities/Effects/dome.yml
new file mode 100644
index 0000000000..77a3113e0f
--- /dev/null
+++ b/Resources/Prototypes/Entities/Effects/dome.yml
@@ -0,0 +1,129 @@
+- type: entity
+ id: EnergyDomeBase
+ abstract: true
+ components:
+ - type: Sprite
+ drawdepth: Effects
+ noRot: true
+ - type: Fixtures
+ fixtures:
+ fix1:
+ shape:
+ !type:PhysShapeCircle
+ radius: 0.8
+ density: 0
+ mask:
+ - None
+ layer:
+ - BulletImpassable
+ - Opaque
+ - type: Physics
+ bodyType: Static
+ - type: Damageable
+ damageContainer: Inorganic
+ damageModifierSet: HardLightBarrier
+ - type: AmbientSound
+ volume: 35
+ range: 5
+ sound:
+ path: /Audio/Machines/energyshield_ambient.ogg
+ - type: EnergyDome
+ - type: Tag
+ tags:
+ - HideContextMenu
+
+- type: entity
+ id: EnergyDomeSmallPink
+ noSpawn: true
+ parent: EnergyDomeBase
+ components:
+ - type: Sprite
+ sprite: Effects/EnergyDome/energydome_small.rsi
+ layers:
+ - state: small
+ color: "#f5166b"
+ - type: PointLight
+ enabled: true
+ radius: 5
+ power: 2
+ color: "#f5166b"
+
+- type: entity
+ id: EnergyDomeSmallRed
+ noSpawn: true
+ parent: EnergyDomeBase
+ components:
+ - type: Sprite
+ drawdepth: Effects
+ noRot: true
+ sprite: Effects/EnergyDome/energydome_small.rsi
+ layers:
+ - state: small
+ color: "#b00000"
+ - type: PointLight
+ enabled: true
+ radius: 5
+ power: 2
+ color: "#b00000"
+
+- type: entity
+ id: EnergyDomeMediumBlue
+ noSpawn: true
+ parent: EnergyDomeBase
+ components:
+ - type: Fixtures
+ fixtures:
+ fix1:
+ shape:
+ !type:PhysShapeCircle
+ radius: 1.8
+ density: 0
+ mask:
+ - None
+ layer:
+ - BulletImpassable
+ - Opaque
+ - type: Sprite
+ sprite: Effects/EnergyDome/energydome_medium.rsi
+ layers:
+ - state: medium
+ color: "#64b9de"
+ - type: PointLight
+ enabled: true
+ radius: 5
+ power: 10
+ color: "#64b9de"
+
+- type: entity
+ id: EnergyDomeSlowing
+ noSpawn: true
+ parent: EnergyDomeBase
+ components:
+ - type: Fixtures
+ fixtures:
+ fix1:
+ shape:
+ !type:PhysShapeCircle
+ radius: 2.8
+ density: 0
+ hard: false
+ mask:
+ - None
+ layer:
+ - MidImpassable
+ - type: Sprite
+ drawdepth: LowFloors
+ sprite: Effects/EnergyDome/energydome_slowdown_big.rsi
+ layers:
+ - state: big
+ color: "#a3d177"
+ - type: PointLight
+ enabled: true
+ radius: 5
+ power: 30
+ color: "#a3d177"
+ - type: DamageContacts
+ damage:
+ types:
+ Slash: -1.5
+ Piercing: -1.5
\ No newline at end of file
diff --git a/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml b/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml
index b0a2571875..315bd361e3 100644
--- a/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml
+++ b/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml
@@ -19,6 +19,21 @@
- type: InitialInfectedExempt
- type: randomHumanoidSettings
+ id: Nanotrasen
+ speciesBlacklist:
+ - Arachnid
+ - Diona
+ - Moth
+ - Reptilian
+ - Skrell
+ - SlimePerson
+ - Vox
+ - Harpy
+ - Felinid
+ - Dwarf
+
+- type: randomHumanoidSettings
+ parent: Nanotrasen
id: DeathSquad
randomizeName: false
components:
@@ -55,6 +70,7 @@
- type: InitialInfectedExempt
- type: randomHumanoidSettings
+ parent: Nanotrasen
id: ERTLeader
randomizeName: false
components:
@@ -395,6 +411,7 @@
- type: InitialInfectedExempt
- type: randomHumanoidSettings
+ parent: Nanotrasen
id: CBURNAgent
components:
- type: MindShield
@@ -423,6 +440,7 @@
- type: InitialInfectedExempt
- type: randomHumanoidSettings
+ parent: Nanotrasen
id: CentcomOfficial
components:
- type: MindShield
diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml
index 05850a8b85..83d4831dbe 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/base.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml
@@ -317,6 +317,7 @@
- Muted
- Pacified
- StaminaModifier
+ - Incorporeal
- type: Blindable
# Other
- type: Temperature
diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigars/case.yml b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigars/case.yml
index f51640d4c6..525fbc312b 100644
--- a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigars/case.yml
+++ b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigars/case.yml
@@ -40,9 +40,6 @@
- type: Item
sprite: Objects/Consumable/Smokeables/Cigars/case.rsi
size: Normal
- shape:
- - 0,0,2,1
- storedRotation: 90
- type: StorageFill
contents:
- id: Cigar
diff --git a/Resources/Prototypes/Entities/Objects/Magic/books.yml b/Resources/Prototypes/Entities/Objects/Magic/books.yml
deleted file mode 100644
index 89acd9e7da..0000000000
--- a/Resources/Prototypes/Entities/Objects/Magic/books.yml
+++ /dev/null
@@ -1,106 +0,0 @@
-- type: entity
- id: BaseSpellbook
- name: spellbook
- parent: BaseItem
- abstract: true
- components:
- - type: Sprite
- sprite: Objects/Misc/books.rsi
- layers:
- - state: book_demonomicon
- - type: Spellbook
- - type: Tag
- tags:
- - Spellbook
-
-- type: entity
- id: SpawnSpellbook
- name: spawn spellbook
- parent: BaseSpellbook
- components:
- - type: Spellbook
- spells:
- ActionSpawnMagicarpSpell: -1
-
-- type: entity
- id: ForceWallSpellbook
- name: force wall spellbook
- parent: BaseSpellbook
- components:
- - type: Sprite
- sprite: Objects/Magic/spellbooks.rsi
- layers:
- - state: bookforcewall
- - type: Spellbook
- spells:
- ActionForceWall: -1
-
-- type: entity
- id: BlinkBook
- name: blink spellbook
- parent: BaseSpellbook
- components:
- - type: Sprite
- sprite: Objects/Magic/spellbooks.rsi
- layers:
- - state: spellbook
- - type: Spellbook
- spells:
- ActionBlink: -1
-
-- type: entity
- id: SmiteBook
- name: smite spellbook
- parent: BaseSpellbook
- components:
- - type: Sprite
- sprite: Objects/Magic/spellbooks.rsi
- layers:
- - state: spellbook
- - type: Spellbook
- spells:
- ActionSmite: -1
-
-- type: entity
- id: KnockSpellbook
- name: knock spellbook
- parent: BaseSpellbook
- components:
- - type: Sprite
- sprite: Objects/Magic/spellbooks.rsi
- layers:
- - state: bookknock
- - type: Spellbook
- spells:
- ActionKnock: -1
-
-- type: entity
- id: FireballSpellbook
- name: fireball spellbook
- parent: BaseSpellbook
- components:
- - type: Sprite
- sprite: Objects/Magic/spellbooks.rsi
- layers:
- - state: bookfireball
- - type: Spellbook
- spells:
- ActionFireball: -1
-
-- type: entity
- id: ScrollRunes
- name: scroll of runes
- parent: BaseSpellbook
- components:
- - type: Item
- size: Normal
- - type: Sprite
- sprite: Objects/Magic/magicactions.rsi
- layers:
- - state: spell_default
- - type: Spellbook
- spells:
- ActionFlashRune: -1
- ActionExplosionRune: -1
- ActionIgniteRune: -1
- ActionStunRune: -1
diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml
index 97e91869e9..752e67da33 100644
--- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml
+++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml
@@ -9,7 +9,7 @@
sprite: Objects/Materials/Sheets/glass.rsi
- type: Item
sprite: Objects/Materials/Sheets/glass.rsi
- size: Normal
+ size: Small
- type: StaticPrice
price: 0
- type: Tag
diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml
index 18590e98df..058adc9f16 100644
--- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml
+++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml
@@ -8,7 +8,7 @@
sprite: Objects/Materials/Sheets/other.rsi
- type: Item
sprite: Objects/Materials/Sheets/other.rsi
- size: Normal
+ size: Small
- type: Tag
tags:
- Sheet
diff --git a/Resources/Prototypes/Entities/Objects/Materials/ingots.yml b/Resources/Prototypes/Entities/Objects/Materials/ingots.yml
index 7e8e6a5b74..0ef99722e7 100644
--- a/Resources/Prototypes/Entities/Objects/Materials/ingots.yml
+++ b/Resources/Prototypes/Entities/Objects/Materials/ingots.yml
@@ -8,7 +8,7 @@
sprite: Objects/Materials/ingots.rsi
- type: Item
sprite: Objects/Materials/ingots.rsi
- size: Normal
+ size: Small
- type: StaticPrice
price: 0
- type: Tag
diff --git a/Resources/Prototypes/Entities/Objects/Materials/parts.yml b/Resources/Prototypes/Entities/Objects/Materials/parts.yml
index 0579a0d642..d893de9338 100644
--- a/Resources/Prototypes/Entities/Objects/Materials/parts.yml
+++ b/Resources/Prototypes/Entities/Objects/Materials/parts.yml
@@ -51,7 +51,7 @@
- state: rods_5
map: ["base"]
- type: Item
- size: Normal
+ size: Small
# heldPrefix: rods
- type: Construction
graph: MetalRod
@@ -127,10 +127,6 @@
- ItemMask
restitution: 0.3
friction: 0.2
- - type: Construction
- deconstructionTarget: null
- graph: StunprodGraph
- node: rod
- type: entity
parent: PartRodMetal
diff --git a/Resources/Prototypes/Entities/Objects/Misc/handcuffs.yml b/Resources/Prototypes/Entities/Objects/Misc/handcuffs.yml
index 636032cd3c..a37a682e2e 100644
--- a/Resources/Prototypes/Entities/Objects/Misc/handcuffs.yml
+++ b/Resources/Prototypes/Entities/Objects/Misc/handcuffs.yml
@@ -50,8 +50,9 @@
startBreakoutSound:
path: /Audio/Items/Handcuffs/rope_takeoff.ogg
- type: Construction
- graph: makeshifthandcuffs
- node: cuffscable
+ deconstructionTarget: cuffs
+ graph: StunprodGraph
+ node: cuffs
- type: Item
inhandVisuals:
left:
diff --git a/Resources/Prototypes/Entities/Objects/Misc/implanters.yml b/Resources/Prototypes/Entities/Objects/Misc/implanters.yml
index 4d0e877290..16b7538423 100644
--- a/Resources/Prototypes/Entities/Objects/Misc/implanters.yml
+++ b/Resources/Prototypes/Entities/Objects/Misc/implanters.yml
@@ -17,6 +17,7 @@
- Body # no chair microbomb
blacklist:
components:
+ - BorgChassis
- Guardian # no holoparasite macrobomb wombo combo
tags:
- Unimplantable
@@ -72,6 +73,7 @@
# go wild with sentient chairs with macrobombs
whitelist: null
blacklist: null
+ singleUse: false
- type: entity
id: BaseImplantOnlyImplanter
@@ -119,6 +121,9 @@
implantOnly:
True: {state: broken}
False: {state: implanter1}
+ - type: Implanter
+ implantTime: 2
+ drawTime: 2
#Fun implanters
diff --git a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml
index 91a6c60465..8d2b4d24d2 100644
--- a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml
+++ b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml
@@ -155,7 +155,7 @@
components:
- Hands # prevent mouse buying grenade penguin since its not telepathic
- type: Store
- preset: StorePresetUplink
+ preset: StorePresetUplinkNoDiscounts
balance:
Telecrystal: 0
- type: UserInterface
diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seedanalyzer.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seedanalyzer.yml
index b1920cf61a..7ca07f9e12 100644
--- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seedanalyzer.yml
+++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seedanalyzer.yml
@@ -19,7 +19,7 @@
path: "/Audio/Items/Medical/healthscanner.ogg"
- type: Tag
tags:
- - DiscreteHealthAnalyzer
+ - PlantAnalyzer
- type: Appearance
- type: entity
diff --git a/Resources/Prototypes/Entities/Objects/Tools/energydome.yml b/Resources/Prototypes/Entities/Objects/Tools/energydome.yml
new file mode 100644
index 0000000000..615bf2a9ae
--- /dev/null
+++ b/Resources/Prototypes/Entities/Objects/Tools/energydome.yml
@@ -0,0 +1,179 @@
+- type: entity
+ name: blood red personal shield generator
+ description: A personal shield generator that protects the wearer from lasers and bullets but prevents from using ranged weapons himself. Uses a power cell.
+ id: EnergyDomeGeneratorPersonalSyndie
+ parent: BaseItem
+ components:
+ - type: Item
+ size: Ginormous
+ - type: Clothing
+ quickEquip: false
+ slots:
+ - Belt
+ - type: Sprite
+ sprite: Objects/Tools/EnergyDome/syndie.rsi
+ layers:
+ - state: icon
+ - type: ContainerContainer
+ containers:
+ cell_slot: !type:ContainerSlot
+ - type: PowerCellSlot
+ cellSlotId: cell_slot
+ - type: ItemSlots
+ slots:
+ cell_slot:
+ name: power-cell-slot-component-slot-name-default
+ startingItem: PowerCellSmall
+ whitelist:
+ tags:
+ - PowerCell
+ - PowerCellSmall
+ - type: EnergyDomeGenerator
+ damageEnergyDraw: 5
+ domePrototype: EnergyDomeSmallRed
+ - type: PowerCellDraw
+ drawRate: 10
+ useRate: 0
+ - type: UseDelay
+ delay: 10.0
+
+- type: entity
+ name: BR-40c "Turtle"
+ description: A two-handed and heavy energy barrier with extremely low passive energy consumption. Can be tethered with a multitool.
+ id: EnergyDomeDirectionalTurtle
+ parent: BaseItem
+ components:
+ - type: Sprite
+ sprite: Objects/Tools/EnergyDome/reinhardt.rsi
+ layers:
+ - state: icon
+ - type: InteractionOutline
+ - type: MultiHandedItem
+ - type: Fixtures
+ fixtures:
+ fix1:
+ shape:
+ !type:PhysShapeAabb
+ bounds: "-0.25,-0.25,0.25,0.25"
+ density: 20
+ mask:
+ - ItemMask
+ restitution: 0.3
+ friction: 0.2
+ - type: Item
+ size: Ginormous
+ - type: HeldSpeedModifier
+ walkModifier: 0.7
+ sprintModifier: 0.7
+ - type: ContainerContainer
+ containers:
+ cell_slot: !type:ContainerSlot
+ - type: PowerCellSlot
+ cellSlotId: cell_slot
+ - type: ItemSlots
+ slots:
+ cell_slot:
+ name: power-cell-slot-component-slot-name-default
+ startingItem: PowerCellSmall
+ whitelist:
+ tags:
+ - PowerCell
+ - PowerCellSmall
+ - type: EnergyDomeGenerator
+ damageEnergyDraw: 7
+ domePrototype: EnergyDomeMediumBlue
+ canDeviceNetworkUse: true
+ - type: PowerCellDraw
+ drawRate: 2
+ useRate: 0
+ - type: UseDelay
+ delay: 10.0
+ - type: DeviceNetwork
+ deviceNetId: Wireless
+ receiveFrequencyId: BasicDevice
+ - type: WirelessNetworkConnection
+ range: 200
+ - type: DeviceLinkSink
+ ports:
+ - Toggle
+ - On
+ - Off
+
+- type: entity
+ id: EnergyDomeWiredTest
+ name: Static Dome
+ description: Test energy barrier powered by station wiring. I don't know how the hell to balance it.....
+ parent: BaseMachine
+ suffix: DO NOT MERGE
+ placement:
+ mode: SnapgridCenter
+ components:
+ - type: Transform
+ anchored: true
+ - type: Physics
+ bodyType: Static
+ - type: Fixtures
+ fixtures:
+ fix1:
+ shape:
+ !type:PhysShapeAabb
+ bounds: "-0.45,-0.45,0.45,0.45"
+ density: 190
+ mask:
+ - MachineMask
+ layer:
+ - MachineLayer
+ - type: Sprite
+ sprite: Structures/Power/Generation/Tesla/coil.rsi
+ snapCardinals: true
+ noRot: true
+ layers:
+ - state: coil
+ - type: ExaminableBattery
+ - type: Battery
+ maxCharge: 30000 #<- max supply
+ startingCharge: 10000
+ - type: PowerNetworkBattery
+ maxSupply: 30000
+ maxChargeRate: 1000 #<- passive charging frow power net
+ supplyRampTolerance: 500
+ supplyRampRate: 50
+ - type: BatteryCharger
+ voltage: Medium
+ - type: NodeContainer
+ examinable: true
+ nodes:
+ input:
+ !type:CableDeviceNode
+ nodeGroupID: MVPower
+ - type: BatterySelfRecharger
+ autoRecharge: false # true only when active
+ autoRechargeRate: -800 #<- discharge per second while active
+ - type: Damageable
+ damageContainer: Inorganic
+ damageModifierSet: Metallic
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTrigger
+ damage: 200
+ behaviors:
+ - !type:DoActsBehavior
+ acts: [ "Destruction" ]
+ - type: UseDelay
+ delay: 30.0
+ - type: DeviceNetwork
+ deviceNetId: Wireless
+ receiveFrequencyId: BasicDevice
+ - type: WirelessNetworkConnection
+ range: 200
+ - type: DeviceLinkSink
+ ports:
+ - Toggle
+ - On
+ - Off
+ - type: EnergyDomeGenerator
+ enabled: true
+ damageEnergyDraw: 100
+ domePrototype: EnergyDomeSlowing
+ canDeviceNetworkUse: true
\ No newline at end of file
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml
index ec62121c6b..133eadb047 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml
@@ -15,7 +15,8 @@
- type: CanPenetrate
penetrationLayer: MobLayer
- type: StaminaDamageOnCollide
- damage: 55
+ ignoreResistances: false
+ damage: 70
- type: TimedDespawn
lifetime: 0.25
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml
index ddb4b52396..8ed25153e2 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml
@@ -31,6 +31,7 @@
types:
Blunt: 3
- type: StaminaDamageOnCollide
+ ignoreResistances: false
damage: 35 # 3 hits to stun cuz revolver
- type: entity
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml
index 7720dd58da..fb4d422a0d 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml
@@ -26,7 +26,8 @@
types:
Blunt: 10
- type: StaminaDamageOnCollide
- damage: 40 # 3 hits to stun
+ ignoreResistances: false
+ damage: 70
- type: entity
id: PelletShotgun
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml
index e67c41c9bf..097d7703e8 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml
@@ -204,3 +204,34 @@
radius: 2.0
energy: 7.0
- type: BloodBoilProjectile
+
+- type: entity
+ id: ProjectileTeslaBall
+ name: teslaball
+ description: You better GITTAH WEIGH.
+ parent: BulletRocket
+ noSpawn: true
+ components:
+ - type: PointLight
+ color: "#B3CEFF"
+ radius: 2.0
+ energy: 5.0
+ - type: Projectile
+ damage:
+ types:
+ Caustic: 10
+ - type: Sprite
+ sprite: Structures/Power/Generation/Tesla/energy_miniball.rsi
+ layers:
+ - state: tesla_projectile
+ shader: unshaded
+ - type: Explosive
+ explosionType: Default
+ maxIntensity: 100
+ intensitySlope: 0.1
+ totalIntensity: 0.3
+ maxTileBreak: 0
+ - type: StunOnCollide
+ stunAmount: 2
+ knockdownAmount: 2
+ - type: TeslaProjectile
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
index 8eb5fb26bf..48568e0b00 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
@@ -121,6 +121,7 @@
soundHit:
path: /Audio/Weapons/Guns/Hits/snap.ogg
- type: StaminaDamageOnCollide
+ ignoreResistances: false
damage: 22 # 5 hits to stun sounds reasonable
- type: entity
@@ -1350,7 +1351,8 @@
bounds: "-0.15,-0.3,0.15,0.3"
hard: false
mask:
- - Opaque
+ - Impassable
+ - BulletImpassable
fly-by: *flybyfixture
- type: Ammo
muzzleFlash: null
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml
index d1df6e1912..cf3bf84414 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml
@@ -36,10 +36,10 @@
angle: 0
animation: WeaponArcThrust
- type: StaminaDamageOnHit
- damage: 30
+ damage: 40
sound: /Audio/Weapons/egloves.ogg
- type: StaminaDamageOnCollide
- damage: 30
+ damage: 40
sound: /Audio/Weapons/egloves.ogg
- type: UseDelay
- type: Item
@@ -72,6 +72,6 @@
containers:
cell_slot: !type:ContainerSlot {}
- type: Construction
- deconstructionTarget: rod
+ deconstructionTarget: cuffs
graph: StunprodGraph
node: stunprod
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml
index c68feff0b5..788e95e8e1 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml
@@ -50,3 +50,37 @@
# also limits the crew's use
- type: TimedDespawn
lifetime: 30
+
+- type: entity
+ parent: BaseItem
+ id: ThrowingCard
+ name: card
+ components:
+ - type: Sprite
+ sprite: Objects/Magic/card.rsi
+ layers:
+ - state: icon
+ - type: Appearance
+ - type: Fixtures
+ fixtures:
+ fix1:
+ shape: !type:PhysShapeCircle
+ radius: 0.2
+ density: 5
+ mask:
+ - ItemMask
+ restitution: 0.3
+ friction: 0.2
+ - type: EmbeddableProjectile
+ sound: /Audio/Weapons/star_hit.ogg
+ - type: DamageOtherOnHit
+ damage:
+ types:
+ Slash: 8
+ Piercing: 10
+ - type: StaminaDamageOnCollide
+ damage: 45
+ - type: StaminaDamageOnEmbed
+ damage: 10
+ - type: TimedDespawn
+ lifetime: 60
diff --git a/Resources/Prototypes/Magic/white.yml b/Resources/Prototypes/Magic/white.yml
new file mode 100644
index 0000000000..65726f9f55
--- /dev/null
+++ b/Resources/Prototypes/Magic/white.yml
@@ -0,0 +1,253 @@
+- type: entity
+ id: ActionElectricArcSpell
+ name: Electric arc
+ noSpawn: true
+ components:
+ - type: Magic
+ requiresClothes: true
+ - type: WorldTargetAction
+ useDelay: 60
+ itemIconStyle: BigAction
+ checkCanAccess: false
+ range: 10
+ sound: !type:SoundPathSpecifier
+ path: /Audio/White/Magic/Arc/cast.ogg
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: thunder
+ isChargeEnabled: true
+ chargingSound:
+ path: /Audio/White/Magic/Arc/charge.ogg
+ chargeProto: MagicFollowerArcEntity
+ maxChargedSound:
+ path: /Audio/White/Magic/Arc/max.ogg
+ isAltEnabled: true
+ event: !type:ArcSpellEvent
+ speech: "KUH, ABAH'RAH"
+ prototype: ProjectileTeslaBall
+ posData: !type:TargetCasterPos
+
+- type: entity
+ id: ActionForceSpell
+ name: Force
+ noSpawn: true
+ components:
+ - type: Magic
+ requiresClothes: true
+ - type: WorldTargetAction
+ useDelay: 60
+ itemIconStyle: BigAction
+ checkCanAccess: false
+ range: 10
+ sound: !type:SoundPathSpecifier
+ path: /Audio/White/Magic/Force/cast.ogg
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: push
+ isChargeEnabled: true
+ chargingSound:
+ path: /Audio/White/Magic/Force/charge.ogg
+ chargeProto: MagicFollowerForceEntity
+ maxChargedSound:
+ path: /Audio/White/Magic/Force/max.ogg
+ isAltEnabled: true
+ event: !type:ForceSpellEvent
+ speech: "EL DRITCH!"
+
+- type: entity
+ id: ActionFireballSpell
+ name: Fireball
+ noSpawn: true
+ components:
+ - type: Magic
+ requiresClothes: true
+ - type: WorldTargetAction
+ useDelay: 60
+ itemIconStyle: BigAction
+ checkCanAccess: false
+ range: 45
+ isChargeEnabled: true
+ chargeProto: MagicFollowerFireEntity
+ isAltEnabled: true
+ sound: !type:SoundPathSpecifier
+ path: /Audio/Magic/fireball.ogg
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: fireball
+ event: !type:FireballSpellEvent
+ prototype: ProjectileFireball
+ posData: !type:TargetCasterPos
+ speech: action-speech-spell-fireball
+
+- type: entity
+ id: ActionCardSpell
+ name: Cards
+ noSpawn: true
+ components:
+ - type: Magic
+ requiresClothes: true
+ - type: WorldTargetAction
+ useDelay: 60
+ itemIconStyle: BigAction
+ checkCanAccess: false
+ range: 45
+ isChargeEnabled: true
+ chargingSound:
+ path: /Audio/White/Magic/Cards/charge.ogg
+ chargeProto: MagicFollowerCardEntity
+ maxChargedSound:
+ path: /Audio/White/Magic/Cards/max.ogg
+ isAltEnabled: true
+ sound: !type:SoundPathSpecifier
+ path: /Audio/White/Magic/Cards/cast.ogg
+ icon:
+ sprite: Objects/Magic/card.rsi
+ state: icon
+ event: !type:CardsSpellEvent
+ prototype: ThrowingCard
+ posData: !type:TargetCasterPos
+ speech: "SHIZO NERO!"
+
+- type: entity
+ id: ActionForcewallSpell
+ name: Forcewall
+ noSpawn: true
+ components:
+ - type: Magic
+ requiresClothes: true
+ - type: WorldTargetAction
+ useDelay: 60
+ itemIconStyle: BigAction
+ checkCanAccess: false
+ range: 10
+ sound: !type:SoundPathSpecifier
+ path: /Audio/White/Magic/Force/cast.ogg
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: shield
+ isChargeEnabled: true
+ chargingSound:
+ path: /Audio/White/Magic/Force/charge.ogg
+ chargeProto: MagicFollowerForceEntity
+ maxChargedSound:
+ path: /Audio/White/Magic/Force/max.ogg
+ isAltEnabled: true
+ event: !type:ForceWallSpellEvent
+ speech: "TARCOL MINTI ZHERI!"
+ prototype: WallForce
+
+- type: entity
+ id: ActionBlinkSpell
+ name: Blink
+ noSpawn: true
+ components:
+ - type: InstantAction
+ useDelay: 60
+ itemIconStyle: BigAction
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: blink
+ event: !type:BlinkSpellEvent
+ speech: "SYCAR TYN!"
+
+- type: entity
+ id: ActionEtherealJauntSpell
+ name: Ethereal Jaunt
+ noSpawn: true
+ components:
+ - type: Magic
+ requiresClothes: true
+ - type: InstantAction
+ useDelay: 60
+ itemIconStyle: BigAction
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: jaunt
+ event: !type:EtherealJauntSpellEvent
+ speech: "SCYAR NILA!"
+
+- type: entity
+ id: ActionEmpSpell
+ name: Emp
+ noSpawn: true
+ components:
+ - type: Magic
+ requiresClothes: true
+ - type: InstantAction
+ useDelay: 60
+ itemIconStyle: BigAction
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: emp_new
+ event: !type:EmpSpellEvent
+ speech: "OCYAR TRINA!"
+
+- type: entity
+ id: ActionCluwneCurseSpell
+ name: Cluwne Curse
+ noSpawn: true
+ components:
+ - type: Magic
+ requiresClothes: true
+ - type: EntityTargetAction
+ canTargetSelf: false
+ range: 2
+ useDelay: 300
+ itemIconStyle: BigAction
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: cluwne
+ event: !type:CluwneCurseSpellEvent
+ speech: "CLUWNE FOR ME!"
+
+- type: entity
+ id: ActionBananaTouchSpell
+ name: Banana Touch
+ noSpawn: true
+ components:
+ - type: Magic
+ requiresClothes: true
+ - type: EntityTargetAction
+ canTargetSelf: false
+ range: 2
+ useDelay: 300
+ itemIconStyle: BigAction
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: clown
+ event: !type:BananaTouchSpellEvent
+ speech: "HONK FOR ME!"
+
+- type: entity
+ id: ActionMimeTouchSpell
+ name: Mime Touch
+ noSpawn: true
+ components:
+ - type: Magic
+ requiresClothes: true
+ - type: EntityTargetAction
+ canTargetSelf: false
+ range: 2
+ useDelay: 300
+ itemIconStyle: BigAction
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: mime_curse
+ event: !type:MimeTouchSpellEvent
+ speech: "SILENCE!"
+
+- type: entity
+ id: ActionInstantRecallSpell
+ name: Instant Recall
+ noSpawn: true
+ components:
+ - type: InstantRecall
+ - type: Magic
+ requiresClothes: true
+ - type: InstantAction
+ useDelay: 10
+ itemIconStyle: BigAction
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: summons
+ event: !type:InstantRecallSpellEvent
diff --git a/Resources/Prototypes/Reagents/cleaning.yml b/Resources/Prototypes/Reagents/cleaning.yml
index 5e2058958d..2c540970a6 100644
--- a/Resources/Prototypes/Reagents/cleaning.yml
+++ b/Resources/Prototypes/Reagents/cleaning.yml
@@ -36,6 +36,7 @@
meltingPoint: -11.0
tileReactions:
- !type:CleanTileReaction {}
+ - !type:CleanDecalsReaction {}
- !type:SpillTileReaction
paralyzeTime: 3
launchForwardsMultiplier: 4
diff --git a/Resources/Prototypes/Reagents/gases.yml b/Resources/Prototypes/Reagents/gases.yml
index 2c10d7c01c..da7212b5a0 100644
--- a/Resources/Prototypes/Reagents/gases.yml
+++ b/Resources/Prototypes/Reagents/gases.yml
@@ -248,6 +248,7 @@
- !type:OrganType
type: Slime
shouldHave: false
+ statusLifetime: 4
walkSpeedModifier: 0.65
sprintSpeedModifier: 0.65
- !type:GenericStatusEffect
@@ -361,7 +362,7 @@
conditions:
- !type:ReagentThreshold
reagent: BZ
- min: 1
+ min: 0.1
- !type:OrganType
type: Slime
type: Local
@@ -372,9 +373,10 @@
conditions:
- !type:ReagentThreshold
reagent: BZ
- min: 1
+ min: 0.5
- !type:OrganType
type: Slime
+ statusLifetime: 4
walkSpeedModifier: 0.65
sprintSpeedModifier: 0.65
- !type:GenericStatusEffect
@@ -388,6 +390,38 @@
component: ForcedSleeping
time: 3
type: Add
+ - !type:PopupMessage
+ conditions:
+ - !type:ReagentThreshold
+ reagent: BZ
+ min: 0.1
+ - !type:HasComponent
+ component: Changeling
+ type: Local
+ visualType: Medium
+ messages: [ "effect-sleepy" ]
+ probability: 0.1
+ - !type:MovespeedModifier
+ conditions:
+ - !type:ReagentThreshold
+ reagent: BZ
+ min: 0.5
+ - !type:HasComponent
+ component: Changeling
+ statusLifetime: 4
+ walkSpeedModifier: 0.65
+ sprintSpeedModifier: 0.65
+ - !type:GenericStatusEffect
+ conditions:
+ - !type:ReagentThreshold
+ reagent: BZ
+ min: 1
+ - !type:HasComponent
+ component: Changeling
+ key: ForcedSleep
+ component: ForcedSleeping
+ time: 3
+ type: Add
- type: reagent
id: Pluoxium
@@ -456,28 +490,28 @@
conditions:
- !type:ReagentThreshold
reagent: Nitrium
- min: 3
- statusLifetime: 0.25
+ min: 0.5
+ statusLifetime: 32
walkSpeedModifier: 1.5
sprintSpeedModifier: 1.5
- !type:GenericStatusEffect
conditions:
- !type:ReagentThreshold
- min: 6
+ min: 0.5
key: Stun
time: 1
type: Remove
- !type:GenericStatusEffect
conditions:
- !type:ReagentThreshold
- min: 6
+ min: 0.5
key: KnockedDown
- time: 5
+ time: 1
type: Remove
- !type:GenericStatusEffect
conditions:
- !type:ReagentThreshold
- min: 6
+ min: 0.5
key: ForcedSleep
component: ForcedSleeping
time: 15
@@ -486,12 +520,12 @@
conditions:
- !type:ReagentThreshold
reagent: Nitrium
- min: 9
+ min: 10
scaleByQuantity: true
ignoreResistances: true
damage:
types:
- Poison: 0.05
+ Poison: 0.5
- type: reagent
id: Healium
diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/makeshiftstunprod.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/makeshiftstunprod.yml
index 4b3e9cfbbc..0510657bc9 100644
--- a/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/makeshiftstunprod.yml
+++ b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/makeshiftstunprod.yml
@@ -28,4 +28,29 @@
# doAfter: 20
# - node: msstunprod
# entity: Stunprod
-#
+
+- type: constructionGraph
+ id: makeshiftstunprod
+ start: start
+ graph:
+ - node: start
+ edges:
+ - to: msstunprod
+ steps:
+ - material: MetalRod
+ amount: 1
+ - material: Cable
+ amount: 15
+ - tag: Igniter
+ name: Igniter
+ icon:
+ sprite: Objects/Devices/igniter.rsi
+ state: icon
+ - tag: CapacitorStockPart
+ name: Capacitor Stock Part
+ icon:
+ sprite: Objects/Misc/stock_parts.rsi
+ state: capacitor
+ doAfter: 20
+ - node: msstunprod
+ entity: Stunprod
diff --git a/Resources/Prototypes/Recipes/Crafting/improvised.yml b/Resources/Prototypes/Recipes/Crafting/improvised.yml
index 0e6e04341c..44dbc53868 100644
--- a/Resources/Prototypes/Recipes/Crafting/improvised.yml
+++ b/Resources/Prototypes/Recipes/Crafting/improvised.yml
@@ -35,16 +35,16 @@
icon: { sprite: Objects/Misc/cablecuffs.rsi, state: cuff }
objectType: Item
-#- type: construction
-# name: makeshift stunprod
-# id: makeshiftstunprod
-# graph: makeshiftstunprod
-# startNode: start
-# targetNode: msstunprod
-# category: construction-category-weapons
-# description: "Homemade stunprod."
-# icon: { sprite: Objects/Weapons/Melee/stunprod.rsi, state: stunprod_off }
-# objectType: Item
+- type: construction
+ name: makeshift stunprod
+ id: makeshiftstunprod
+ graph: makeshiftstunprod
+ startNode: start
+ targetNode: msstunprod
+ category: construction-category-weapons
+ description: "Homemade stunprod."
+ icon: { sprite: Objects/Weapons/Melee/stunprod.rsi, state: stunprod_off }
+ objectType: Item
- type: construction
name: muzzle
diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml b/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml
index c502ee5214..c66e787855 100644
--- a/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml
+++ b/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml
@@ -15,7 +15,6 @@
- type: startingGear
id: CargoTechGear
equipment:
- head: ClothingHeadHatCargosoft
jumpsuit: ClothingUniformJumpsuitCargo
back: ClothingBackpackCargoFilled
shoes: ClothingShoesColorBlack
diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
index 13c99c54fb..07acd406da 100644
--- a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
+++ b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
@@ -42,8 +42,6 @@
shoes: ClothingShoesColorBrown
id: QuartermasterPDA
ears: ClothingHeadsetQM
- belt: BoxFolderClipboard
- pocket1: AppraisalTool
underwearb: ClothingUnderwearBottomBoxersQM # White-Underwear
underweart: ClothingUnderwearTopBraQM # White-Underwear
underwearb: ClothingUnderwearBottomPantiesQM # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml b/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml
index 1f8de4db8a..ace3d3b9f8 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml
@@ -21,9 +21,7 @@
- type: startingGear
id: BartenderGear
equipment:
- head: ClothingHeadHatTophat
jumpsuit: ClothingUniformJumpsuitBartender
- outerClothing: ClothingOuterVest
back: ClothingBackpackFilled
shoes: ClothingShoesColorBlack
id: BartenderPDA
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml b/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml
index 6397f027e6..699b7aaabc 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml
@@ -23,7 +23,6 @@
id: BotanistPDA
ears: ClothingHeadsetService
outerClothing: ClothingOuterApronBotanist
- belt: ClothingBeltPlantFilled
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml
index b4a6b1e441..8e80466ae0 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml
@@ -25,14 +25,13 @@
jumpsuit: ClothingUniformJumpsuitChaplain
back: ClothingBackpackChaplainFilled
shoes: ClothingShoesColorBlack
+ belt: NullRod
id: ChaplainPDA
ears: ClothingHeadsetService
pocket1: ArmamentsBeacon
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
- inhand:
- - NullRod
innerClothingSkirt: ClothingUniformJumpskirtChaplain
satchel: ClothingBackpackSatchelChaplainFilled
duffelbag: ClothingBackpackDuffelChaplainFilled
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml
index acac73127c..84f45f4205 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml
@@ -22,14 +22,10 @@
id: ChefGear
equipment:
jumpsuit: ClothingUniformJumpsuitChef
- head: ClothingHeadHatChef
back: ClothingBackpackFilled
- mask: ClothingMaskItalianMoustache
shoes: ClothingShoesColorBlack
id: ChefPDA
ears: ClothingHeadsetService
- outerClothing: ClothingOuterApronChef
- belt: ClothingBeltChefFilled
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml b/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml
index db41876471..4d455317cf 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml
@@ -20,12 +20,9 @@
equipment:
jumpsuit: ClothingUniformJumpsuitJanitor
back: ClothingBackpackFilled
- shoes: ClothingShoesGaloshes
- head: ClothingHeadHatPurplesoft
+ shoes: ClothingShoesColorPurple
id: JanitorPDA
- gloves: ClothingHandsGlovesJanitor
ears: ClothingHeadsetService
- belt: ClothingBeltJanitorFilled
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml
index 574b5a2c7a..25cfdcfcd7 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml
@@ -18,8 +18,6 @@
shoes: ClothingShoesBootsLaceup
id: LibrarianPDA
ears: ClothingHeadsetService
- pocket1: d10Dice
- pocket2: HandLabeler # for making named bestsellers
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml
index 48c9773294..a31b053342 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml
@@ -24,11 +24,9 @@
jumpsuit: ClothingUniformJumpsuitMime
back: ClothingBackpackMimeFilled
head: ClothingHeadHatBeret
- belt: ClothingBeltSuspenders
gloves: ClothingHandsGlovesLatex
shoes: ClothingShoesColorWhite
pocket1: CrayonMime
- pocket2: Paper
mask: ClothingMaskMime
id: MimePDA
ears: ClothingHeadsetService
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml b/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml
index 94cd14bce5..e9b698cb38 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml
@@ -19,7 +19,6 @@
equipment:
jumpsuit: ClothingUniformJumpsuitMusician
back: ClothingBackpackMusicianFilled
- eyes: ClothingEyesGlassesSunglasses
shoes: ClothingShoesBootsLaceup
id: MusicianPDA
ears: ClothingHeadsetService
diff --git a/Resources/Prototypes/Roles/Jobs/Command/captain.yml b/Resources/Prototypes/Roles/Jobs/Command/captain.yml
index 1020cb4603..205183db64 100644
--- a/Resources/Prototypes/Roles/Jobs/Command/captain.yml
+++ b/Resources/Prototypes/Roles/Jobs/Command/captain.yml
@@ -39,10 +39,6 @@
jumpsuit: ClothingUniformJumpsuitCaptain
back: ClothingBackpackCaptainFilled
shoes: ClothingShoesBootsLaceup
- head: ClothingHeadHatCaptain
- eyes: ClothingEyesGlassesSunglasses
- gloves: ClothingHandsGlovesCaptain
- outerClothing: ClothingOuterArmorCaptainCarapace
id: CaptainPDA
ears: ClothingHeadsetAltCommand
underwearb: ClothingUnderwearBottomBoxersCap # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml
index e9e9405098..54e093d686 100644
--- a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml
+++ b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml
@@ -61,11 +61,8 @@
jumpsuit: ClothingUniformJumpsuitHoP
back: ClothingBackpackHOPFilled
shoes: ClothingShoesColorBrown
- head: ClothingHeadHatHopcap
id: HoPPDA
- gloves: ClothingHandsGlovesHop
ears: ClothingHeadsetAltCommand
- belt: BoxFolderClipboard
underwearb: ClothingUnderwearBottomBoxersHOP # White-Underwear
underweart: ClothingUnderwearTopBraHOP # White-Underwear
underwearb: ClothingUnderwearBottomPantiesHOP # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml b/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml
index 3984e76f9c..66125e86c1 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml
@@ -23,9 +23,7 @@
jumpsuit: ClothingUniformJumpsuitAtmos
back: ClothingBackpackAtmosphericsFilled
shoes: ClothingShoesColorWhite
- eyes: ClothingEyesGlassesMeson
id: AtmosPDA
- belt: ClothingBeltUtilityEngineering
ears: ClothingHeadsetEngineering
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml
index 018fec37f8..04ba3d74f2 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml
@@ -38,14 +38,11 @@
- type: startingGear
id: ChiefEngineerGear
equipment:
- head: ClothingHeadHatHardhatWhite
jumpsuit: ClothingUniformJumpsuitChiefEngineer
back: ClothingBackpackChiefEngineerFilled
shoes: ClothingShoesColorBrown
id: CEPDA
- eyes: ClothingEyesGlassesMeson
ears: ClothingHeadsetCE
- belt: ClothingBeltUtilityEngineering
underwearb: ClothingUnderwearBottomBoxersCE # White-Underwear
underweart: ClothingUnderwearTopBraCE # White-Underwear
underwearb: ClothingUnderwearBottomPantiesCE # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml
index 3ddc35b289..4ad649d04f 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml
@@ -29,15 +29,11 @@
- type: startingGear
id: SeniorEngineerGear
equipment:
- head: ClothingHeadHatBeretEngineering
jumpsuit: ClothingUniformJumpsuitSeniorEngineer
back: ClothingBackpackEngineeringFilled
shoes: ClothingShoesBootsMag
id: SeniorEngineerPDA
- eyes: ClothingEyesGlassesMeson
- belt: ClothingBeltUtilitySeniorEngineerFilled
ears: ClothingHeadsetEngineering
- gloves: ClothingHandsGlovesColorYellow
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml
index dd71be1821..9c07ead73b 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml
@@ -20,14 +20,10 @@
- type: startingGear
id: StationEngineerGear
equipment:
- head: ClothingHeadHatHardhatYellow
jumpsuit: ClothingUniformJumpsuitEngineering
back: ClothingBackpackEngineeringFilled
shoes: ClothingShoesBootsWork
- outerClothing: ClothingOuterVestHazard
id: EngineerPDA
- eyes: ClothingEyesGlassesMeson
- belt: ClothingBeltUtilityEngineering
ears: ClothingHeadsetEngineering
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml b/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml
index c88bf0ff74..eb5ad2dc58 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml
@@ -26,9 +26,8 @@
back: ClothingBackpackEngineeringFilled
shoes: ClothingShoesBootsWork
id: TechnicalAssistantPDA
- belt: ClothingBeltUtilityEngineering
ears: ClothingHeadsetEngineering
- pocket2: BookEngineersHandbook
+ pocket1: BookEngineersHandbook
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Justice/lawyer.yml b/Resources/Prototypes/Roles/Jobs/Justice/lawyer.yml
index abbe7b906e..084cacf0ea 100644
--- a/Resources/Prototypes/Roles/Jobs/Justice/lawyer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Justice/lawyer.yml
@@ -26,7 +26,6 @@
shoes: ClothingShoesBootsLaceup
id: LawyerPDA
ears: ClothingHeadsetSecurity
- pocket1: BookSpaceLaws
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml
index bfa0fd2a96..f09d3d6ea4 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml
@@ -21,12 +21,8 @@
jumpsuit: ClothingUniformJumpsuitChemistry
back: ClothingBackpackChemistryFilled
shoes: ClothingShoesColorWhite
- outerClothing: ClothingOuterCoatLabChem
id: ChemistryPDA
ears: ClothingHeadsetMedical
- belt: ChemBag
- pocket1: HandLabeler
- # the purple glasses?
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml
index df38550b93..ed37bd794f 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml
@@ -38,10 +38,8 @@
jumpsuit: ClothingUniformJumpsuitCMO
back: ClothingBackpackCMOFilled
shoes: ClothingShoesColorBrown
- outerClothing: ClothingOuterCoatLabCmo
id: CMOPDA
ears: ClothingHeadsetCMO
- belt: ClothingBeltMedicalFilled
underwearb: ClothingUnderwearBottomBoxersCMO # White-Underwear
underweart: ClothingUnderwearTopBraCMO # White-Underwear
underwearb: ClothingUnderwearBottomPantiesCMO # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml
index 16369adc94..9d45ebe085 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml
@@ -22,10 +22,8 @@
jumpsuit: ClothingUniformJumpsuitMedicalDoctor
back: ClothingBackpackMedicalFilled
shoes: ClothingShoesColorWhite
- outerClothing: ClothingOuterCoatLab
id: MedicalPDA
ears: ClothingHeadsetMedical
- belt: ClothingBeltMedicalFilled
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml
index bf68a5568e..33a9886660 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml
@@ -24,8 +24,7 @@
shoes: ClothingShoesColorWhite
id: MedicalInternPDA
ears: ClothingHeadsetMedical
- belt: ClothingBeltMedicalFilled
- pocket2: BookMedicalReferenceBook
+ pocket1: BookMedicalReferenceBook
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml
index 8aa7c77012..0c9a7561ba 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml
@@ -26,7 +26,6 @@
shoes: ClothingShoesColorBlue
id: ParamedicPDA
ears: ClothingHeadsetMedical
- belt: ClothingBeltMedicalEMTFilled
innerClothingSkirt: ClothingUniformJumpskirtParamedic
satchel: ClothingBackpackSatchelParamedicFilled
duffelbag: ClothingBackpackDuffelParamedicFilled
diff --git a/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml b/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml
index e4b144669f..e704df4330 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml
@@ -28,16 +28,11 @@
- type: startingGear
id: SeniorPhysicianGear
equipment:
- head: ClothingHeadHatBeretBrigmedic
jumpsuit: ClothingUniformJumpsuitSeniorPhysician
back: ClothingBackpackMedicalFilled
shoes: ClothingShoesColorBlack
- outerClothing: ClothingOuterCoatLabSeniorPhysician
id: SeniorPhysicianPDA
ears: ClothingHeadsetMedical
- belt: ClothingBeltSeniorPhysicianFilled
- mask: ClothingMaskSterile
- gloves: ClothingHandsGlovesLatex
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Science/research_assistant.yml b/Resources/Prototypes/Roles/Jobs/Science/research_assistant.yml
index f41a340e81..61e6743104 100644
--- a/Resources/Prototypes/Roles/Jobs/Science/research_assistant.yml
+++ b/Resources/Prototypes/Roles/Jobs/Science/research_assistant.yml
@@ -24,7 +24,7 @@
shoes: ClothingShoesColorWhite
id: ResearchAssistantPDA
ears: ClothingHeadsetScience
- pocket2: BookScientistsGuidebook
+ pocket1: BookScientistsGuidebook
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml
index 784c4724a8..acc82cbe07 100644
--- a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml
+++ b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml
@@ -35,7 +35,6 @@
jumpsuit: ClothingUniformJumpsuitResearchDirector
back: ClothingBackpackResearchDirectorFilled
shoes: ClothingShoesColorBrown
- outerClothing: ClothingOuterCoatRD
id: RnDPDA
ears: ClothingHeadsetRD
underwearb: ClothingUnderwearBottomBoxersRD # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Science/scientist.yml b/Resources/Prototypes/Roles/Jobs/Science/scientist.yml
index a5985b34c7..fa854bbfd0 100644
--- a/Resources/Prototypes/Roles/Jobs/Science/scientist.yml
+++ b/Resources/Prototypes/Roles/Jobs/Science/scientist.yml
@@ -20,7 +20,6 @@
jumpsuit: ClothingUniformJumpsuitScientist
back: ClothingBackpackScienceFilled
shoes: ClothingShoesColorWhite
- outerClothing: ClothingOuterCoatRnd
id: SciencePDA
ears: ClothingHeadsetScience
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml b/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml
index dab8bbd96e..2793e9d067 100644
--- a/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml
+++ b/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml
@@ -21,15 +21,11 @@
- type: startingGear
id: SeniorResearcherGear
equipment:
- head: ClothingHeadHatBeretRND
jumpsuit: ClothingUniformJumpsuitSeniorResearcher
back: ClothingBackpackScienceFilled
shoes: ClothingShoesColorBlack
- outerClothing: ClothingOuterCoatLabSeniorResearcher
id: SeniorResearcherPDA
ears: ClothingHeadsetScience
- gloves: ClothingHandsGlovesColorYellow
- belt: ClothingBeltUtilityFilled
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Security/detective.yml b/Resources/Prototypes/Roles/Jobs/Security/detective.yml
index 989c831634..a130e38263 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/detective.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/detective.yml
@@ -31,12 +31,8 @@
jumpsuit: ClothingUniformJumpsuitDetective
back: ClothingBackpackSecurityFilledDetective
shoes: ClothingShoesBootsCombatFilled
- eyes: ClothingEyesGlassesSecurity
- head: ClothingHeadHatFedoraBrown
- outerClothing: ClothingOuterVestDetective
id: DetectivePDA
ears: ClothingHeadsetSecurity
- belt: ClothingBeltHolsterFilled
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraSportsAlternative # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml
index 069afc42e3..a737a82680 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml
@@ -43,13 +43,8 @@
jumpsuit: ClothingUniformJumpsuitHoS
back: ClothingBackpackHOSFilled
shoes: ClothingShoesBootsCombatFilled
- outerClothing: ClothingOuterCoatHoSTrench
- eyes: ClothingEyesGlassesSecurity
- head: ClothingHeadHatBeretHoS
id: HoSPDA
- gloves: ClothingHandsGlovesCombat
ears: ClothingHeadsetAltSecurity
- belt: ClothingBeltSecurityFilled
pocket1: WeaponPistolMk58Nonlethal
underwearb: ClothingUnderwearBottomBoxersHOS # White-Underwear
underweart: ClothingUnderwearTopBraHOS # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml
index b98847d00c..2af7ac3f95 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml
@@ -30,10 +30,8 @@
jumpsuit: ClothingUniformJumpsuitColorRed
back: ClothingBackpackSecurityFilled
shoes: ClothingShoesBootsCombatFilled
- outerClothing: ClothingOuterArmorBasic
id: SecurityCadetPDA
ears: ClothingHeadsetSecurity
- pocket1: WeaponPistolMk58Nonlethal
pocket2: BookSecurity
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraSportsAlternative # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml
index e40fb8a849..1377ed022c 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml
@@ -29,13 +29,8 @@
jumpsuit: ClothingUniformJumpsuitSec
back: ClothingBackpackSecurityFilled
shoes: ClothingShoesBootsCombatFilled
- eyes: ClothingEyesGlassesSecurity
- head: ClothingHeadHelmetBasic
- outerClothing: ClothingOuterArmorBasic
id: SecurityPDA
ears: ClothingHeadsetSecurity
- belt: ClothingBeltSecurityFilled
- pocket1: WeaponPistolMk58Nonlethal
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraSportsAlternative # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml b/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml
index 7215662ebf..ce2067d117 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml
@@ -39,14 +39,8 @@
jumpsuit: ClothingUniformJumpsuitSeniorOfficer
back: ClothingBackpackSecurityFilled
shoes: ClothingShoesBootsCombatFilled
- eyes: ClothingEyesGlassesSecurity
- head: ClothingHeadHatBeretSecurity
- outerClothing: ClothingOuterArmorBasic
id: SeniorOfficerPDA
ears: ClothingHeadsetSecurity
- belt: ClothingBeltSeniorSecurityFilled
- pocket1: WeaponPistolMk58Nonlethal
- gloves: ClothingHandsGlovesCombat
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraWhite # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/Security/warden.yml b/Resources/Prototypes/Roles/Jobs/Security/warden.yml
index 64546fca80..6b7b45420b 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/warden.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/warden.yml
@@ -28,16 +28,11 @@
- type: startingGear
id: WardenGear
equipment:
- head: ClothingHeadHatWarden
jumpsuit: ClothingUniformJumpsuitWarden
back: ClothingBackpackSecurityFilled
shoes: ClothingShoesBootsCombatFilled
- eyes: ClothingEyesGlassesSecurity
- outerClothing: ClothingOuterCoatWarden
id: WardenPDA
ears: ClothingHeadsetSecurity
- belt: ClothingBeltSecurityFilled
- pocket1: WeaponPistolMk58Nonlethal
underwearb: ClothingUnderwearBottomBoxersWhite # White-Underwear
underweart: ClothingUnderwearTopBraSportsAlternative # White-Underwear
underwearb: ClothingUnderwearBottomPantiesWhite # White-Underwear
diff --git a/Resources/Prototypes/Roles/Jobs/departments.yml b/Resources/Prototypes/Roles/Jobs/departments.yml
index a0d181cf66..86b28b05b9 100644
--- a/Resources/Prototypes/Roles/Jobs/departments.yml
+++ b/Resources/Prototypes/Roles/Jobs/departments.yml
@@ -1,77 +1,20 @@
-- type: department
- id: Cargo
- description: department-Cargo-description
- color: "#A46106"
- roles:
- - CargoTechnician
- - Quartermaster
- - SalvageSpecialist
-
-- type: department
- id: Civilian
- description: department-Civilian-description
- color: "#9FED58"
- weight: -10
- roles:
- - Bartender
- - Borg
- - Botanist
- - Boxer
- - Chaplain
- - Chef
- - Clown
- - HeadOfPersonnel
- - Janitor
- - Librarian
- - Mime
- - Musician
- - Passenger
- - Reporter
- - Visitor
- - Zookeeper
- - ServiceWorker
-
- type: department
id: Command
description: department-Command-description
color: "#334E6D"
roles:
- - Captain
- CentralCommandOfficial
- - ChiefEngineer
- - ChiefMedicalOfficer
+ - Captain
- HeadOfPersonnel
- HeadOfSecurity
+ - ChiefEngineer
+ - ChiefMedicalOfficer
- ResearchDirector
- Quartermaster
- Inspector
primary: false
weight: 100
-- type: department
- id: Engineering
- description: department-Engineering-description
- color: "#EFB341"
- roles:
- - AtmosphericTechnician
- - ChiefEngineer
- - SeniorEngineer
- - StationEngineer
- - TechnicalAssistant
-
-- type: department
- id: Medical
- description: department-Medical-description
- color: "#52B4E9"
- roles:
- - Chemist
- - ChiefMedicalOfficer
- - MedicalDoctor
- - MedicalIntern
- - Psychologist
- - Paramedic
- - SeniorPhysician
-
- type: department
id: Security
description: department-Security-description
@@ -79,11 +22,68 @@
weight: 20
roles:
- HeadOfSecurity
- - SecurityCadet
- - SecurityOfficer
- - SeniorOfficer
- - Detective
- Warden
+ - SeniorOfficer
+ - SecurityOfficer
+ - Detective
+ - SecurityCadet
+
+- type: department
+ id: Cargo
+ description: department-Cargo-description
+ color: "#A46106"
+ roles:
+ - Quartermaster
+ - CargoTechnician
+ - SalvageSpecialist
+
+- type: department
+ id: Civilian
+ description: department-Civilian-description
+ color: "#9FED58"
+ weight: -10
+ roles:
+ - HeadOfPersonnel
+ - Borg
+ - Bartender
+ - Janitor
+ - Botanist
+ - Chaplain
+ - Chef
+ - Clown
+ - Mime
+ - Boxer
+ - ServiceWorker
+ - Librarian
+ - Musician
+ - Reporter
+ - Visitor
+ - Zookeeper
+ - Passenger
+
+- type: department
+ id: Engineering
+ description: department-Engineering-description
+ color: "#EFB341"
+ roles:
+ - ChiefEngineer
+ - SeniorEngineer
+ - AtmosphericTechnician
+ - StationEngineer
+ - TechnicalAssistant
+
+- type: department
+ id: Medical
+ description: department-Medical-description
+ color: "#52B4E9"
+ roles:
+ - ChiefMedicalOfficer
+ - SeniorPhysician
+ - MedicalDoctor
+ - Paramedic
+ - Chemist
+ - MedicalIntern
+ - Psychologist
- type: department
id: Science
diff --git a/Resources/Prototypes/Store/presets.yml b/Resources/Prototypes/Store/presets.yml
index 3f18fb70d3..a70e4fb533 100644
--- a/Resources/Prototypes/Store/presets.yml
+++ b/Resources/Prototypes/Store/presets.yml
@@ -24,6 +24,24 @@
maxItems: 10
salesCategory: UplinkSales
+- type: storePreset
+ id: StorePresetUplinkNoDiscounts
+ storeName: Uplink
+ categories:
+ - UplinkWeapons
+ - UplinkAmmo
+ - UplinkExplosives
+ - UplinkMisc
+ - UplinkBundles
+ - UplinkTools
+ - UplinkUtility
+ - UplinkImplants
+ - UplinkJob
+ - UplinkArmor
+ - UplinkPointless
+ currencyWhitelist:
+ - Telecrystal
+
- type: storePreset
id: StorePresetChangeling
storeName: Evolution Shop
diff --git a/Resources/Prototypes/White/Catalog/uplink.yml b/Resources/Prototypes/White/Catalog/uplink.yml
index 9bb495ac41..56b9b07841 100644
--- a/Resources/Prototypes/White/Catalog/uplink.yml
+++ b/Resources/Prototypes/White/Catalog/uplink.yml
@@ -214,3 +214,13 @@
Telecrystal: 6
categories:
- UplinkImplants
+
+- type: listing
+ id: UplinkImplanterSyndi
+ name: Имплантер
+ description: Продвинутый имплантер, позволяющий быстро вкалывать и вытаскивать импланты.
+ productEntity: ImplanterSyndi
+ cost:
+ Telecrystal: 1
+ categories:
+ - UplinkImplants
diff --git a/Resources/Prototypes/White/Entities/Clothing/Head/chaplain_helmets.yml b/Resources/Prototypes/White/Entities/Clothing/Head/chaplain_helmets.yml
index 3b2e96c123..1627735e3e 100644
--- a/Resources/Prototypes/White/Entities/Clothing/Head/chaplain_helmets.yml
+++ b/Resources/Prototypes/White/Entities/Clothing/Head/chaplain_helmets.yml
@@ -11,8 +11,8 @@
- type: Armor
modifiers:
coefficients:
- Blunt: 0.8
- Slash: 0.8
+ Blunt: 0.85
+ Slash: 0.85
Piercing: 0.95
- type: Tag
tags:
diff --git a/Resources/Prototypes/White/Entities/Clothing/OuterClothing/chaplain_armor.yml b/Resources/Prototypes/White/Entities/Clothing/OuterClothing/chaplain_armor.yml
index e9d6d946ed..4267448a7d 100644
--- a/Resources/Prototypes/White/Entities/Clothing/OuterClothing/chaplain_armor.yml
+++ b/Resources/Prototypes/White/Entities/Clothing/OuterClothing/chaplain_armor.yml
@@ -11,8 +11,8 @@
- type: Armor
modifiers:
coefficients:
- Blunt: 0.4
- Slash: 0.4
+ Blunt: 0.5
+ Slash: 0.5
Piercing: 0.9
Heat: 0.5
- type: ClothingSpeedModifier
diff --git a/Resources/Prototypes/White/Entities/Clothing/nigger.yml b/Resources/Prototypes/White/Entities/Clothing/nigger.yml
new file mode 100644
index 0000000000..a4724eb870
--- /dev/null
+++ b/Resources/Prototypes/White/Entities/Clothing/nigger.yml
@@ -0,0 +1,35 @@
+- type: entity
+ parent: ClothingHeadHatWizard
+ id: ClothingHeadHatRealWizardBlue
+ components:
+ - type: WizardClothes
+
+- type: entity
+ parent: ClothingOuterWizard
+ id: ClothingOuterRealWizardBlue
+ components:
+ - type: WizardClothes
+
+- type: entity
+ parent: ClothingHeadHatRedwizard
+ id: ClothingHeadHatRealWizardRed
+ components:
+ - type: WizardClothes
+
+- type: entity
+ parent: ClothingOuterWizardRed
+ id: ClothingOuterRealWizardRed
+ components:
+ - type: WizardClothes
+
+- type: entity
+ parent: ClothingHeadHatVioletwizard
+ id: ClothingHeadHatRealWizardViolet
+ components:
+ - type: WizardClothes
+
+- type: entity
+ parent: ClothingOuterWizardViolet
+ id: ClothingOuterRealWizardViolet
+ components:
+ - type: WizardClothes
diff --git a/Resources/Prototypes/White/Entities/Objects/Misc/implanters.yml b/Resources/Prototypes/White/Entities/Objects/Misc/implanters.yml
index 8bbbcf60e7..a6e577d4d8 100644
--- a/Resources/Prototypes/White/Entities/Objects/Misc/implanters.yml
+++ b/Resources/Prototypes/White/Entities/Objects/Misc/implanters.yml
@@ -21,3 +21,16 @@
components:
- type: Implanter
implant: MindslaveImplant
+
+- type: entity
+ id: ImplanterSyndi
+ parent: Implanter
+ description: A compact disposable syringe exclusively designed for the injection and extraction of subdermal implants.
+ components:
+ - type: Item
+ sprite: Objects/Specific/Medical/syndi_implanter.rsi
+ - type: Sprite
+ sprite: Objects/Specific/Medical/syndi_implanter.rsi
+ - type: Implanter
+ drawTime: 2
+ implantTime: 2
diff --git a/Resources/Prototypes/White/Entities/Objects/Weapons/chaplain_weapons.yml b/Resources/Prototypes/White/Entities/Objects/Weapons/chaplain_weapons.yml
index f4571b4081..5eed41f0ea 100644
--- a/Resources/Prototypes/White/Entities/Objects/Weapons/chaplain_weapons.yml
+++ b/Resources/Prototypes/White/Entities/Objects/Weapons/chaplain_weapons.yml
@@ -177,7 +177,7 @@
ignoreResistances: true
damage:
types:
- Slash: 27
+ Slash: 24
- type: Clothing
sprite: White/Objects/Weapons/Chaplain/scythe.rsi
slots:
@@ -335,7 +335,7 @@
- type: IncreaseDamageOnWield
damage:
types:
- Blunt: 10
+ Blunt: 8
- type: UseDelay
- type: DisarmMalus
- type: MeleeBlock
@@ -393,7 +393,7 @@
- type: IncreaseDamageOnWield
damage:
types:
- Piercing: 10
+ Piercing: 9
- type: UseDelay
- type: DisarmMalus
@@ -433,13 +433,12 @@
state: icon
- type: MeleeWeapon
wideAnimationRotation: -135
- attackRate: 0.75
canHeavyAttack: false
damage:
types:
Blunt: 0
- type: StaminaDamageOnHit
- damage: 60
+ damage: 40
- type: Item
size: Normal
sprite: White/Objects/Weapons/Chaplain/hypertool.rsi
diff --git a/Resources/Prototypes/White/Entities/Objects/Weapons/snatcherprod.yml b/Resources/Prototypes/White/Entities/Objects/Weapons/snatcherprod.yml
index d46c3040fb..4d634c31eb 100644
--- a/Resources/Prototypes/White/Entities/Objects/Weapons/snatcherprod.yml
+++ b/Resources/Prototypes/White/Entities/Objects/Weapons/snatcherprod.yml
@@ -35,10 +35,10 @@
angle: 0
animation: WeaponArcThrust
- type: StaminaDamageOnHit
- damage: 30
+ damage: 40
sound: /Audio/Weapons/egloves.ogg
- type: StaminaDamageOnCollide
- damage: 30
+ damage: 40
sound: /Audio/Weapons/egloves.ogg
- type: UseDelay
- type: Item
@@ -72,7 +72,7 @@
- type: Stunprod
hasHeldPrefix: false
- type: Construction
- deconstructionTarget: rod
+ deconstructionTarget: cuffs
graph: StunprodGraph
node: snatcherprod
@@ -88,6 +88,6 @@
- type: Item
size: Normal
- type: Construction
- deconstructionTarget: rod
+ deconstructionTarget: cuffs
graph: StunprodGraph
node: unfinished
diff --git a/Resources/Prototypes/White/Objects/Scrolls/magic.yml b/Resources/Prototypes/White/Objects/Scrolls/magic.yml
new file mode 100644
index 0000000000..171f566025
--- /dev/null
+++ b/Resources/Prototypes/White/Objects/Scrolls/magic.yml
@@ -0,0 +1,119 @@
+- type: entity
+ id: MagicFollowerEntity
+ name: magic
+ components:
+ - type: Physics
+ bodyType: Dynamic
+ fixedRotation: false
+ - type: Sprite
+ sprite: Structures/Specific/Anomalies/Cores/bluespace_core.rsi
+ noRot: true
+ layers:
+ - state: core
+ - state: pulse
+ map: ["decay"]
+ - type: Appearance
+ - type: GenericVisualizer
+ visuals:
+ enum.AnomalyCoreVisuals.Decaying:
+ decay:
+ True: { visible: true }
+ False: { visible: false }
+ - type: PointLight
+ radius: 1.5
+ energy: 3.5
+ color: "#00ccff"
+ castShadows: false
+
+- type: entity
+ id: MagicFollowerArcEntity
+ name: magic
+ components:
+ - type: Physics
+ bodyType: Dynamic
+ fixedRotation: false
+ - type: Sprite
+ sprite: Structures/Specific/Anomalies/Cores/electric_core.rsi
+ noRot: true
+ layers:
+ - state: core
+ - state: pulse
+ map: ["decay"]
+ - type: Appearance
+ - type: GenericVisualizer
+ visuals:
+ enum.AnomalyCoreVisuals.Decaying:
+ decay:
+ True: { visible: true }
+ False: { visible: false }
+ - type: PointLight
+ radius: 1.5
+ energy: 3.5
+ color: "#ccf404"
+ castShadows: false
+
+- type: entity
+ id: MagicFollowerForceEntity
+ name: magic
+ components:
+ - type: Physics
+ bodyType: Dynamic
+ fixedRotation: false
+ - type: Sprite
+ sprite: Structures/Specific/Anomalies/Cores/bluespace_core.rsi
+ noRot: true
+ layers:
+ - state: core
+ - state: pulse
+ map: ["decay"]
+ - type: Appearance
+ - type: GenericVisualizer
+ visuals:
+ enum.AnomalyCoreVisuals.Decaying:
+ decay:
+ True: { visible: true }
+ False: { visible: false }
+ - type: PointLight
+ radius: 1.5
+ energy: 3.5
+ color: "#00ccff"
+ castShadows: false
+
+- type: entity
+ id: MagicFollowerFireEntity
+ name: magic
+ components:
+ - type: Physics
+ bodyType: Dynamic
+ fixedRotation: false
+ - type: Sprite
+ sprite: Structures/Specific/Anomalies/Cores/pyro_core.rsi
+ noRot: true
+ layers:
+ - state: core
+ - state: pulse
+ map: ["decay"]
+ - type: Appearance
+ - type: GenericVisualizer
+ visuals:
+ enum.AnomalyCoreVisuals.Decaying:
+ decay:
+ True: { visible: true }
+ False: { visible: false }
+ - type: PointLight
+ radius: 1.5
+ energy: 3.5
+ color: "#ce5a25"
+ castShadows: false
+
+- type: entity
+ id: MagicFollowerCardEntity
+ name: magic
+ components:
+ - type: Physics
+ bodyType: Dynamic
+ fixedRotation: false
+ - type: Sprite
+ sprite: Objects/Magic/card.rsi
+ layers:
+ - state: icon
diff --git a/Resources/Prototypes/White/Objects/Scrolls/scrolls.yml b/Resources/Prototypes/White/Objects/Scrolls/scrolls.yml
new file mode 100644
index 0000000000..f95198ccfa
--- /dev/null
+++ b/Resources/Prototypes/White/Objects/Scrolls/scrolls.yml
@@ -0,0 +1,133 @@
+- type: entity
+ id: BaseScroll
+ parent: BaseItem
+ name: "Magic Scroll"
+ description: "A relic of arcane lore, this ancient parchment bears witness to countless mystical incantations and forgotten spells."
+ noSpawn: true
+ components:
+ - type: Sprite
+ sprite: White/Misc/scrolls.rsi
+ layers:
+ - state: scroll
+ - type: Scroll
+ useSound:
+ path: /Audio/White/Items/scroll/use.ogg
+ afterUseSound:
+ path: /Audio/White/Items/scroll/after_use.ogg
+
+- type: entity
+ id: ScrollFireball
+ parent: BaseScroll
+ name: "Fireball scroll"
+ components:
+ - type: Scroll
+ actionId: ActionFireballSpell
+ learnPopup: fireball
+
+- type: entity
+ id: ScrollForcewall
+ parent: BaseScroll
+ name: "Forcewall scroll"
+ components:
+ - type: Scroll
+ actionId: ActionForcewallSpell
+ learnPopup: forcewall
+
+- type: entity
+ id: ScrollKnock
+ parent: BaseScroll
+ name: "Knock scroll"
+ components:
+ - type: Scroll
+ actionId: ActionKnock
+ learnPopup: knock-knock
+
+- type: entity
+ id: ScrollArc
+ parent: BaseScroll
+ name: "Electric Arc scroll"
+ components:
+ - type: Scroll
+ actionId: ActionElectricArcSpell
+ learnPopup: lightning
+
+- type: entity
+ id: ScrollForce
+ parent: BaseScroll
+ name: "Force scroll"
+ components:
+ - type: Scroll
+ actionId: ActionForceSpell
+ learnPopup: force
+
+- type: entity
+ id: ScrollCards
+ parent: BaseScroll
+ name: "Cards scroll"
+ components:
+ - type: Scroll
+ actionId: ActionCardSpell
+ learnPopup: cards
+
+- type: entity
+ id: ScrollBlink
+ parent: BaseScroll
+ name: "Blink scroll"
+ components:
+ - type: Scroll
+ actionId: ActionBlinkSpell
+ learnPopup: blink
+
+- type: entity
+ id: ScrollEtherealJaunt
+ parent: BaseScroll
+ name: "Ethereal Jaunt scroll"
+ components:
+ - type: Scroll
+ actionId: ActionEtherealJauntSpell
+ learnPopup: jaunt
+
+- type: entity
+ id: ScrollEmp
+ parent: BaseScroll
+ name: "Emp scroll"
+ components:
+ - type: Scroll
+ actionId: ActionEmpSpell
+ learnPopup: emp
+
+- type: entity
+ id: ScrollCluwneCurse
+ parent: BaseScroll
+ name: "Cluwne curse scroll"
+ components:
+ - type: Scroll
+ actionId: ActionCluwneCurseSpell
+ learnPopup: curse
+
+- type: entity
+ id: ScrollBananaTouch
+ parent: BaseScroll
+ name: "Banana touch scroll"
+ components:
+ - type: Scroll
+ actionId: ActionBananaTouchSpell
+ learnPopup: banana
+
+- type: entity
+ id: ScrollMimeTouch
+ parent: BaseScroll
+ name: "Mime touch scroll"
+ components:
+ - type: Scroll
+ actionId: ActionMimeTouchSpell
+ learnPopup: silence
+
+- type: entity
+ id: ScrollInstantRecall
+ parent: BaseScroll
+ name: "Instant recall scroll"
+ components:
+ - type: Scroll
+ actionId: ActionInstantRecallSpell
+ learnPopup: recall
diff --git a/Resources/Prototypes/White/Recipes/hidden_crafts.yml b/Resources/Prototypes/White/Recipes/hidden_crafts.yml
index 709c9ce972..86512ef60f 100644
--- a/Resources/Prototypes/White/Recipes/hidden_crafts.yml
+++ b/Resources/Prototypes/White/Recipes/hidden_crafts.yml
@@ -68,15 +68,14 @@
- type: constructionGraph
id: StunprodGraph
- start: rod
+ start: cuffs
graph:
- - node: rod
- entity: PartRodMetal1
+ - node: cuffs
edges:
- to: unfinished
steps:
- - material: Cable
- amount: 15
+ - material: MetalRod
+ amount: 1
doAfter: 1
- node: unfinished
entity: ProdUnfinished
@@ -84,10 +83,14 @@
- to: Igniter
steps:
- tag: Igniter
- - to: rod
+ - to: cuffs
steps:
- tool: Cutting
doAfter: 5
+ completed:
+ - !type:SpawnPrototype
+ prototype: PartRodMetal1
+ - !type:DeleteEntity
- node: Igniter
edges:
- to: snatcherprod
@@ -95,38 +98,49 @@
- material: Telecrystal
- to: stunprod
steps:
- - tag: PowerCell
- - to: rod
+ - tag: CapacitorStockPart
+ - to: cuffs
steps:
- tool: Cutting
doAfter: 5
completed:
+ - !type:SpawnPrototype
+ prototype: PartRodMetal1
- !type:SpawnPrototype
prototype: Igniter
+ - !type:DeleteEntity
- node: snatcherprod
entity: Snatcherprod
edges:
- - to: rod
+ - to: cuffs
steps:
- tool: Cutting
doAfter: 5
completed:
- !type:SpawnPrototype
prototype: Telecrystal1
+ - !type:SpawnPrototype
+ prototype: PartRodMetal1
- !type:SpawnPrototype
prototype: Igniter
- !type:EmptyAllContainers
+ - !type:DeleteEntity
- node: stunprod
entity: Stunprod
edges:
- - to: rod
+ - to: cuffs
steps:
- tool: Cutting
doAfter: 5
completed:
+ - !type:SpawnPrototype
+ prototype: CapacitorStockPart
+ - !type:SpawnPrototype
+ prototype: PartRodMetal1
- !type:SpawnPrototype
prototype: Igniter
- !type:EmptyAllContainers
+ - !type:DeleteEntity
- type: constructionGraph
id: ChainsawGraph
diff --git a/Resources/Textures/Effects/EnergyDome/energydome_big.rsi/big.png b/Resources/Textures/Effects/EnergyDome/energydome_big.rsi/big.png
new file mode 100644
index 0000000000..eb8e2a5bf5
Binary files /dev/null and b/Resources/Textures/Effects/EnergyDome/energydome_big.rsi/big.png differ
diff --git a/Resources/Textures/Effects/EnergyDome/energydome_big.rsi/meta.json b/Resources/Textures/Effects/EnergyDome/energydome_big.rsi/meta.json
new file mode 100644
index 0000000000..a8ac036154
--- /dev/null
+++ b/Resources/Textures/Effects/EnergyDome/energydome_big.rsi/meta.json
@@ -0,0 +1,26 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Created by TheShuEd (github) for Space Station 14",
+ "size": {
+ "x": 192,
+ "y": 192
+ },
+ "states": [
+ {
+ "name": "big",
+ "delays": [
+ [
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2
+ ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/Effects/EnergyDome/energydome_directed.rsi/meta.json b/Resources/Textures/Effects/EnergyDome/energydome_directed.rsi/meta.json
new file mode 100644
index 0000000000..7097ca861e
--- /dev/null
+++ b/Resources/Textures/Effects/EnergyDome/energydome_directed.rsi/meta.json
@@ -0,0 +1,26 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Created by TheShuEd (github) for Space Station 14",
+ "size": {
+ "x": 96,
+ "y": 64
+ },
+ "states": [
+ {
+ "name": "small",
+ "delays": [
+ [
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2
+ ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/Effects/EnergyDome/energydome_directed.rsi/small.png b/Resources/Textures/Effects/EnergyDome/energydome_directed.rsi/small.png
new file mode 100644
index 0000000000..cabd6d68cc
Binary files /dev/null and b/Resources/Textures/Effects/EnergyDome/energydome_directed.rsi/small.png differ
diff --git a/Resources/Textures/Effects/EnergyDome/energydome_medium.rsi/medium.png b/Resources/Textures/Effects/EnergyDome/energydome_medium.rsi/medium.png
new file mode 100644
index 0000000000..823012cea3
Binary files /dev/null and b/Resources/Textures/Effects/EnergyDome/energydome_medium.rsi/medium.png differ
diff --git a/Resources/Textures/Effects/EnergyDome/energydome_medium.rsi/meta.json b/Resources/Textures/Effects/EnergyDome/energydome_medium.rsi/meta.json
new file mode 100644
index 0000000000..fc29522c65
--- /dev/null
+++ b/Resources/Textures/Effects/EnergyDome/energydome_medium.rsi/meta.json
@@ -0,0 +1,26 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Created by TheShuEd (github) for Space Station 14",
+ "size": {
+ "x": 128,
+ "y": 128
+ },
+ "states": [
+ {
+ "name": "medium",
+ "delays": [
+ [
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2
+ ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/Effects/EnergyDome/energydome_slowdown_big.rsi/big.png b/Resources/Textures/Effects/EnergyDome/energydome_slowdown_big.rsi/big.png
new file mode 100644
index 0000000000..9e403c300a
Binary files /dev/null and b/Resources/Textures/Effects/EnergyDome/energydome_slowdown_big.rsi/big.png differ
diff --git a/Resources/Textures/Effects/EnergyDome/energydome_slowdown_big.rsi/meta.json b/Resources/Textures/Effects/EnergyDome/energydome_slowdown_big.rsi/meta.json
new file mode 100644
index 0000000000..a8ac036154
--- /dev/null
+++ b/Resources/Textures/Effects/EnergyDome/energydome_slowdown_big.rsi/meta.json
@@ -0,0 +1,26 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Created by TheShuEd (github) for Space Station 14",
+ "size": {
+ "x": 192,
+ "y": 192
+ },
+ "states": [
+ {
+ "name": "big",
+ "delays": [
+ [
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2
+ ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/Effects/EnergyDome/energydome_small.rsi/meta.json b/Resources/Textures/Effects/EnergyDome/energydome_small.rsi/meta.json
new file mode 100644
index 0000000000..c0c836ef1e
--- /dev/null
+++ b/Resources/Textures/Effects/EnergyDome/energydome_small.rsi/meta.json
@@ -0,0 +1,27 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Created by TheShuEd (github) for Space Station 14",
+ "size": {
+ "x": 64,
+ "y": 64
+ },
+ "states": [
+ {
+ "name": "small",
+ "delays": [
+ [
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2
+ ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/Effects/EnergyDome/energydome_small.rsi/small.png b/Resources/Textures/Effects/EnergyDome/energydome_small.rsi/small.png
new file mode 100644
index 0000000000..96cfa6029d
Binary files /dev/null and b/Resources/Textures/Effects/EnergyDome/energydome_small.rsi/small.png differ
diff --git a/Resources/Textures/Objects/Magic/card.rsi/icon.png b/Resources/Textures/Objects/Magic/card.rsi/icon.png
new file mode 100644
index 0000000000..d56463103d
Binary files /dev/null and b/Resources/Textures/Objects/Magic/card.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Magic/card.rsi/meta.json b/Resources/Textures/Objects/Magic/card.rsi/meta.json
new file mode 100644
index 0000000000..b24d676f83
--- /dev/null
+++ b/Resources/Textures/Objects/Magic/card.rsi/meta.json
@@ -0,0 +1,14 @@
+{
+ "version": 1,
+ "license": null,
+ "copyright": null,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Resources/Textures/Objects/Magic/magicactions.rsi/clown.png b/Resources/Textures/Objects/Magic/magicactions.rsi/clown.png
new file mode 100644
index 0000000000..8a902c6fdb
Binary files /dev/null and b/Resources/Textures/Objects/Magic/magicactions.rsi/clown.png differ
diff --git a/Resources/Textures/Objects/Magic/magicactions.rsi/cluwne.png b/Resources/Textures/Objects/Magic/magicactions.rsi/cluwne.png
new file mode 100644
index 0000000000..dd62ff1e91
Binary files /dev/null and b/Resources/Textures/Objects/Magic/magicactions.rsi/cluwne.png differ
diff --git a/Resources/Textures/Objects/Magic/magicactions.rsi/emp_new.png b/Resources/Textures/Objects/Magic/magicactions.rsi/emp_new.png
new file mode 100644
index 0000000000..6e3bcf3d8b
Binary files /dev/null and b/Resources/Textures/Objects/Magic/magicactions.rsi/emp_new.png differ
diff --git a/Resources/Textures/Objects/Magic/magicactions.rsi/jaunt.png b/Resources/Textures/Objects/Magic/magicactions.rsi/jaunt.png
new file mode 100644
index 0000000000..a9209a4b21
Binary files /dev/null and b/Resources/Textures/Objects/Magic/magicactions.rsi/jaunt.png differ
diff --git a/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json b/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json
index 9bf76bbe77..a6b494771c 100644
--- a/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json
+++ b/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json
@@ -27,6 +27,30 @@
},
{
"name": "gib"
- }
+ },
+ {
+ "name": "push"
+ },
+ {
+ "name": "thunder"
+ },
+ {
+ "name": "clown"
+ },
+ {
+ "name": "cluwne"
+ },
+ {
+ "name": "emp_new"
+ },
+ {
+ "name": "jaunt"
+ },
+ {
+ "name": "mime_curse"
+ },
+ {
+ "name": "summons"
+ }
]
-}
\ No newline at end of file
+}
diff --git a/Resources/Textures/Objects/Magic/magicactions.rsi/mime_curse.png b/Resources/Textures/Objects/Magic/magicactions.rsi/mime_curse.png
new file mode 100644
index 0000000000..59f0306cb2
Binary files /dev/null and b/Resources/Textures/Objects/Magic/magicactions.rsi/mime_curse.png differ
diff --git a/Resources/Textures/Objects/Magic/magicactions.rsi/push.png b/Resources/Textures/Objects/Magic/magicactions.rsi/push.png
new file mode 100644
index 0000000000..7f78a8c4b3
Binary files /dev/null and b/Resources/Textures/Objects/Magic/magicactions.rsi/push.png differ
diff --git a/Resources/Textures/Objects/Magic/magicactions.rsi/summons.png b/Resources/Textures/Objects/Magic/magicactions.rsi/summons.png
new file mode 100644
index 0000000000..0e44c2f17f
Binary files /dev/null and b/Resources/Textures/Objects/Magic/magicactions.rsi/summons.png differ
diff --git a/Resources/Textures/Objects/Magic/magicactions.rsi/thunder.png b/Resources/Textures/Objects/Magic/magicactions.rsi/thunder.png
new file mode 100644
index 0000000000..5ced92857f
Binary files /dev/null and b/Resources/Textures/Objects/Magic/magicactions.rsi/thunder.png differ
diff --git a/Resources/Textures/Objects/Tools/EnergyDome/reinhardt.rsi/icon.png b/Resources/Textures/Objects/Tools/EnergyDome/reinhardt.rsi/icon.png
new file mode 100644
index 0000000000..24e7549af4
Binary files /dev/null and b/Resources/Textures/Objects/Tools/EnergyDome/reinhardt.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Tools/EnergyDome/reinhardt.rsi/inhand-left.png b/Resources/Textures/Objects/Tools/EnergyDome/reinhardt.rsi/inhand-left.png
new file mode 100644
index 0000000000..9a8a439994
Binary files /dev/null and b/Resources/Textures/Objects/Tools/EnergyDome/reinhardt.rsi/inhand-left.png differ
diff --git a/Resources/Textures/Objects/Tools/EnergyDome/reinhardt.rsi/inhand-right.png b/Resources/Textures/Objects/Tools/EnergyDome/reinhardt.rsi/inhand-right.png
new file mode 100644
index 0000000000..9a8a439994
Binary files /dev/null and b/Resources/Textures/Objects/Tools/EnergyDome/reinhardt.rsi/inhand-right.png differ
diff --git a/Resources/Textures/Objects/Tools/EnergyDome/reinhardt.rsi/meta.json b/Resources/Textures/Objects/Tools/EnergyDome/reinhardt.rsi/meta.json
new file mode 100644
index 0000000000..cc4ea1dab9
--- /dev/null
+++ b/Resources/Textures/Objects/Tools/EnergyDome/reinhardt.rsi/meta.json
@@ -0,0 +1,22 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Created by TheShuEd (github) for Space Station 14",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Objects/Tools/EnergyDome/syndie.rsi/equipped-BELT.png b/Resources/Textures/Objects/Tools/EnergyDome/syndie.rsi/equipped-BELT.png
new file mode 100644
index 0000000000..5df8249cd2
Binary files /dev/null and b/Resources/Textures/Objects/Tools/EnergyDome/syndie.rsi/equipped-BELT.png differ
diff --git a/Resources/Textures/Objects/Tools/EnergyDome/syndie.rsi/icon.png b/Resources/Textures/Objects/Tools/EnergyDome/syndie.rsi/icon.png
new file mode 100644
index 0000000000..4824044f0b
Binary files /dev/null and b/Resources/Textures/Objects/Tools/EnergyDome/syndie.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Tools/EnergyDome/syndie.rsi/inhand-left.png b/Resources/Textures/Objects/Tools/EnergyDome/syndie.rsi/inhand-left.png
new file mode 100644
index 0000000000..74dbff9699
Binary files /dev/null and b/Resources/Textures/Objects/Tools/EnergyDome/syndie.rsi/inhand-left.png differ
diff --git a/Resources/Textures/Objects/Tools/EnergyDome/syndie.rsi/inhand-right.png b/Resources/Textures/Objects/Tools/EnergyDome/syndie.rsi/inhand-right.png
new file mode 100644
index 0000000000..8dda54bcc0
Binary files /dev/null and b/Resources/Textures/Objects/Tools/EnergyDome/syndie.rsi/inhand-right.png differ
diff --git a/Resources/Textures/Objects/Tools/EnergyDome/syndie.rsi/meta.json b/Resources/Textures/Objects/Tools/EnergyDome/syndie.rsi/meta.json
new file mode 100644
index 0000000000..52a03b1a90
--- /dev/null
+++ b/Resources/Textures/Objects/Tools/EnergyDome/syndie.rsi/meta.json
@@ -0,0 +1,26 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Created by TheShuEd (github) for Space Station 14",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-BELT",
+ "directions": 4
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/White/Charge/charge.rsi/flux.png b/Resources/Textures/White/Charge/charge.rsi/flux.png
new file mode 100644
index 0000000000..ab138701ab
Binary files /dev/null and b/Resources/Textures/White/Charge/charge.rsi/flux.png differ
diff --git a/Resources/Textures/White/Charge/charge.rsi/meta.json b/Resources/Textures/White/Charge/charge.rsi/meta.json
new file mode 100644
index 0000000000..c514308bf4
--- /dev/null
+++ b/Resources/Textures/White/Charge/charge.rsi/meta.json
@@ -0,0 +1,30 @@
+{
+ "version": 1,
+ "license": null,
+ "copyright": null,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "flux",
+ "delays": [
+ [
+ 0.1,
+ 0.1,
+ 1.5,
+ 0.1,
+ 0.1,
+ 1.5,
+ 0.1,
+ 0.1,
+ 1.5,
+ 0.1,
+ 0.1,
+ 1.5
+ ]
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Resources/Textures/White/Misc/scrolls.rsi/meta.json b/Resources/Textures/White/Misc/scrolls.rsi/meta.json
new file mode 100644
index 0000000000..6eacf06a14
--- /dev/null
+++ b/Resources/Textures/White/Misc/scrolls.rsi/meta.json
@@ -0,0 +1,14 @@
+{
+ "version": 1,
+ "license": null,
+ "copyright": null,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "scroll"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Resources/Textures/White/Misc/scrolls.rsi/scroll.png b/Resources/Textures/White/Misc/scrolls.rsi/scroll.png
new file mode 100644
index 0000000000..2f00a23401
Binary files /dev/null and b/Resources/Textures/White/Misc/scrolls.rsi/scroll.png differ