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