diff --git a/Content.Client/Medical/CrewMonitoring/CrewMonitoringWindow.xaml.cs b/Content.Client/Medical/CrewMonitoring/CrewMonitoringWindow.xaml.cs
index 39326c8a99..863412e553 100644
--- a/Content.Client/Medical/CrewMonitoring/CrewMonitoringWindow.xaml.cs
+++ b/Content.Client/Medical/CrewMonitoring/CrewMonitoringWindow.xaml.cs
@@ -210,9 +210,9 @@ public sealed partial class CrewMonitoringWindow : FancyWindow
specifier = new SpriteSpecifier.Rsi(new ResPath("Interface/Alerts/human_crew_monitoring.rsi"), "dead");
}
- else if (sensor.TotalDamage != null)
+ else if (sensor.DamagePercentage != null)
{
- var index = MathF.Round(4f * (sensor.TotalDamage.Value / 100f));
+ var index = MathF.Round(4f * sensor.DamagePercentage.Value);
if (index >= 5)
specifier = new SpriteSpecifier.Rsi(new ResPath("Interface/Alerts/human_crew_monitoring.rsi"), "critical");
diff --git a/Content.Client/Options/UI/Tabs/MiscTab.xaml b/Content.Client/Options/UI/Tabs/MiscTab.xaml
index 5564d7b226..0c6ec38042 100644
--- a/Content.Client/Options/UI/Tabs/MiscTab.xaml
+++ b/Content.Client/Options/UI/Tabs/MiscTab.xaml
@@ -49,6 +49,7 @@
+
diff --git a/Content.Client/Options/UI/Tabs/MiscTab.xaml.cs b/Content.Client/Options/UI/Tabs/MiscTab.xaml.cs
index 476e7289ea..0eff811fa4 100644
--- a/Content.Client/Options/UI/Tabs/MiscTab.xaml.cs
+++ b/Content.Client/Options/UI/Tabs/MiscTab.xaml.cs
@@ -3,11 +3,14 @@ using Content.Client.UserInterface.Screens;
using Content.Shared.CCVar;
using Content.Shared.HUD;
using Robust.Client.AutoGenerated;
+using Robust.Client.Player;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared;
using Robust.Shared.Configuration;
+using Robust.Shared.Network;
+using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using Range = Robust.Client.UserInterface.Controls.Range;
@@ -16,6 +19,7 @@ namespace Content.Client.Options.UI.Tabs
[GenerateTypedNameReferences]
public sealed partial class MiscTab : Control
{
+ [Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
@@ -55,8 +59,11 @@ namespace Content.Client.Options.UI.Tabs
UpdateApplyButton();
};
+ ShowOocPatronColor.Visible = _playerManager.LocalSession?.Channel.UserData.PatronTier is { } patron;
+
HudThemeOption.OnItemSelected += OnHudThemeChanged;
DiscordRich.OnToggled += OnCheckBoxToggled;
+ ShowOocPatronColor.OnToggled += OnCheckBoxToggled;
ShowLoocAboveHeadCheckBox.OnToggled += OnCheckBoxToggled;
ShowHeldItemCheckBox.OnToggled += OnCheckBoxToggled;
ShowCombatModeIndicatorsCheckBox.OnToggled += OnCheckBoxToggled;
@@ -73,6 +80,7 @@ namespace Content.Client.Options.UI.Tabs
HudThemeOption.SelectId(_hudThemeIdToIndex.GetValueOrDefault(_cfg.GetCVar(CVars.InterfaceTheme), 0));
DiscordRich.Pressed = _cfg.GetCVar(CVars.DiscordEnabled);
+ ShowOocPatronColor.Pressed = _cfg.GetCVar(CCVars.ShowOocPatronColor);
ShowLoocAboveHeadCheckBox.Pressed = _cfg.GetCVar(CCVars.LoocAboveHeadShow);
ShowHeldItemCheckBox.Pressed = _cfg.GetCVar(CCVars.HudHeldItemShow);
ShowCombatModeIndicatorsCheckBox.Pressed = _cfg.GetCVar(CCVars.CombatModeIndicatorsPointShow);
@@ -130,6 +138,7 @@ namespace Content.Client.Options.UI.Tabs
_cfg.SetCVar(CCVars.HudHeldItemShow, ShowHeldItemCheckBox.Pressed);
_cfg.SetCVar(CCVars.CombatModeIndicatorsPointShow, ShowCombatModeIndicatorsCheckBox.Pressed);
_cfg.SetCVar(CCVars.OpaqueStorageWindow, OpaqueStorageWindowCheckBox.Pressed);
+ _cfg.SetCVar(CCVars.ShowOocPatronColor, ShowOocPatronColor.Pressed);
_cfg.SetCVar(CCVars.LoocAboveHeadShow, ShowLoocAboveHeadCheckBox.Pressed);
_cfg.SetCVar(CCVars.ChatEnableFancyBubbles, FancySpeechBubblesCheckBox.Pressed);
_cfg.SetCVar(CCVars.ChatFancyNameBackground, FancyNameBackgroundsCheckBox.Pressed);
@@ -158,6 +167,7 @@ namespace Content.Client.Options.UI.Tabs
var isShowHeldItemSame = ShowHeldItemCheckBox.Pressed == _cfg.GetCVar(CCVars.HudHeldItemShow);
var isCombatModeIndicatorsSame = ShowCombatModeIndicatorsCheckBox.Pressed == _cfg.GetCVar(CCVars.CombatModeIndicatorsPointShow);
var isOpaqueStorageWindow = OpaqueStorageWindowCheckBox.Pressed == _cfg.GetCVar(CCVars.OpaqueStorageWindow);
+ var isOocPatronColorShowSame = ShowOocPatronColor.Pressed == _cfg.GetCVar(CCVars.ShowOocPatronColor);
var isLoocShowSame = ShowLoocAboveHeadCheckBox.Pressed == _cfg.GetCVar(CCVars.LoocAboveHeadShow);
var isFancyChatSame = FancySpeechBubblesCheckBox.Pressed == _cfg.GetCVar(CCVars.ChatEnableFancyBubbles);
var isFancyBackgroundSame = FancyNameBackgroundsCheckBox.Pressed == _cfg.GetCVar(CCVars.ChatFancyNameBackground);
@@ -175,6 +185,7 @@ namespace Content.Client.Options.UI.Tabs
isShowHeldItemSame &&
isCombatModeIndicatorsSame &&
isOpaqueStorageWindow &&
+ isOocPatronColorShowSame &&
isLoocShowSame &&
isFancyChatSame &&
isFancyBackgroundSame &&
diff --git a/Content.Client/Overlays/EntityHealthBarOverlay.cs b/Content.Client/Overlays/EntityHealthBarOverlay.cs
index 9e562b5dd3..c1c0ae93ec 100644
--- a/Content.Client/Overlays/EntityHealthBarOverlay.cs
+++ b/Content.Client/Overlays/EntityHealthBarOverlay.cs
@@ -19,7 +19,6 @@ namespace Content.Client.Overlays;
///
public sealed class EntityHealthBarOverlay : Overlay
{
- [Dependency] private readonly IPrototypeManager _prototype = default!;
private readonly IEntityManager _entManager;
private readonly SharedTransformSystem _transform;
private readonly MobStateSystem _mobStateSystem;
@@ -27,17 +26,14 @@ public sealed class EntityHealthBarOverlay : Overlay
private readonly ProgressColorSystem _progressColor;
public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowFOV;
public HashSet DamageContainers = new();
- private readonly ShaderInstance _shader;
public EntityHealthBarOverlay(IEntityManager entManager)
{
- IoCManager.InjectDependencies(this);
_entManager = entManager;
_transform = _entManager.System();
_mobStateSystem = _entManager.System();
_mobThresholdSystem = _entManager.System();
_progressColor = _entManager.System();
- _shader = _prototype.Index("unshaded").Instance();
}
protected override void Draw(in OverlayDrawArgs args)
@@ -50,8 +46,6 @@ public sealed class EntityHealthBarOverlay : Overlay
var scaleMatrix = Matrix3.CreateScale(new Vector2(scale, scale));
var rotationMatrix = Matrix3.CreateRotation(-rotation);
- handle.UseShader(_shader);
-
var query = _entManager.AllEntityQueryEnumerator();
while (query.MoveNext(out var uid,
out var mobThresholdsComponent,
@@ -122,7 +116,6 @@ public sealed class EntityHealthBarOverlay : Overlay
handle.DrawRect(pixelDarken, Black.WithAlpha(128));
}
- handle.UseShader(null);
handle.SetTransform(Matrix3.Identity);
}
diff --git a/Content.Client/StatusIcon/StatusIconOverlay.cs b/Content.Client/StatusIcon/StatusIconOverlay.cs
index 156212c55d..56107cbc02 100644
--- a/Content.Client/StatusIcon/StatusIconOverlay.cs
+++ b/Content.Client/StatusIcon/StatusIconOverlay.cs
@@ -3,9 +3,9 @@ using Content.Shared.StatusIcon.Components;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Shared.Enums;
-using System.Numerics;
using Robust.Shared.Prototypes;
using Robust.Shared.Timing;
+using System.Numerics;
namespace Content.Client.StatusIcon;
@@ -18,7 +18,7 @@ public sealed class StatusIconOverlay : Overlay
private readonly SpriteSystem _sprite;
private readonly TransformSystem _transform;
private readonly StatusIconSystem _statusIcon;
- private readonly ShaderInstance _shader;
+ private readonly ShaderInstance _unshadedShader;
public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowFOV;
@@ -29,7 +29,7 @@ public sealed class StatusIconOverlay : Overlay
_sprite = _entity.System();
_transform = _entity.System();
_statusIcon = _entity.System();
- _shader = _prototype.Index("unshaded").Instance();
+ _unshadedShader = _prototype.Index("unshaded").Instance();
}
protected override void Draw(in OverlayDrawArgs args)
@@ -42,8 +42,6 @@ public sealed class StatusIconOverlay : Overlay
var scaleMatrix = Matrix3.CreateScale(new Vector2(1, 1));
var rotationMatrix = Matrix3.CreateRotation(-eyeRot);
- handle.UseShader(_shader);
-
var query = _entity.AllEntityQueryEnumerator();
while (query.MoveNext(out var uid, out var comp, out var sprite, out var xform, out var meta))
{
@@ -111,11 +109,16 @@ public sealed class StatusIconOverlay : Overlay
}
+ if (proto.IsShaded)
+ handle.UseShader(null);
+ else
+ handle.UseShader(_unshadedShader);
+
var position = new Vector2(xOffset, yOffset);
handle.DrawTexture(texture, position);
}
- }
- handle.UseShader(null);
+ handle.UseShader(null);
+ }
}
}
diff --git a/Content.Server/Chat/Managers/ChatManager.cs b/Content.Server/Chat/Managers/ChatManager.cs
index d12bbfe53c..812aed80bd 100644
--- a/Content.Server/Chat/Managers/ChatManager.cs
+++ b/Content.Server/Chat/Managers/ChatManager.cs
@@ -244,8 +244,7 @@ namespace Content.Server.Chat.Managers
var prefs = _preferencesManager.GetPreferences(player.UserId);
colorOverride = prefs.AdminOOCColor;
}
- if (player.Channel.UserData.PatronTier is { } patron &&
- PatronOocColors.TryGetValue(patron, out var patronColor))
+ if ( _netConfigManager.GetClientCVar(player.Channel, CCVars.ShowOocPatronColor) && player.Channel.UserData.PatronTier is { } patron && PatronOocColors.TryGetValue(patron, out var patronColor))
{
wrappedMessage = Loc.GetString("chat-manager-send-ooc-patron-wrap-message", ("patronColor", patronColor),("playerName", player.Name), ("message", FormattedMessage.EscapeText(message)));
}
diff --git a/Content.Server/Damage/Components/DamagePopupComponent.cs b/Content.Server/Damage/Components/DamagePopupComponent.cs
index b1216069f5..37c5d57cf4 100644
--- a/Content.Server/Damage/Components/DamagePopupComponent.cs
+++ b/Content.Server/Damage/Components/DamagePopupComponent.cs
@@ -5,6 +5,11 @@ namespace Content.Server.Damage.Components;
[RegisterComponent, Access(typeof(DamagePopupSystem))]
public sealed partial class DamagePopupComponent : Component
{
+ ///
+ /// Bool that will be used to determine if the popup type can be changed with a left click.
+ ///
+ [DataField("allowTypeChange")] [ViewVariables(VVAccess.ReadWrite)]
+ public bool AllowTypeChange = false;
///
/// Enum that will be used to determine the type of damage popup displayed.
///
diff --git a/Content.Server/Damage/Systems/DamagePopupSystem.cs b/Content.Server/Damage/Systems/DamagePopupSystem.cs
index 12fd894ac6..3386c92129 100644
--- a/Content.Server/Damage/Systems/DamagePopupSystem.cs
+++ b/Content.Server/Damage/Systems/DamagePopupSystem.cs
@@ -1,7 +1,8 @@
+using System.Linq;
using Content.Server.Damage.Components;
using Content.Server.Popups;
using Content.Shared.Damage;
-using Robust.Shared.Player;
+using Content.Shared.Interaction;
namespace Content.Server.Damage.Systems;
@@ -13,6 +14,7 @@ public sealed class DamagePopupSystem : EntitySystem
{
base.Initialize();
SubscribeLocalEvent(OnDamageChange);
+ SubscribeLocalEvent(OnInteractHand);
}
private void OnDamageChange(EntityUid uid, DamagePopupComponent component, DamageChangedEvent args)
@@ -33,4 +35,20 @@ public sealed class DamagePopupSystem : EntitySystem
_popupSystem.PopupEntity(msg, uid);
}
}
+
+ private void OnInteractHand(EntityUid uid, DamagePopupComponent component, InteractHandEvent args)
+ {
+ if (component.AllowTypeChange)
+ {
+ if (component.Type == Enum.GetValues(typeof(DamagePopupType)).Cast().Last())
+ {
+ component.Type = Enum.GetValues(typeof(DamagePopupType)).Cast().First();
+ }
+ else
+ {
+ component.Type = (DamagePopupType) (int) component.Type + 1;
+ }
+ _popupSystem.PopupEntity("Target set to type: " + component.Type.ToString(), uid);
+ }
+ }
}
diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs
index 8a7ea438be..ba84546258 100644
--- a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs
+++ b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs
@@ -299,7 +299,12 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem
var canInsert = CanInsert(uid, component, args.Thrown);
var randDouble = _robustRandom.NextDouble();
- if (!canInsert || randDouble > 0.75)
+ if (!canInsert)
+ {
+ return;
+ }
+
+ if (randDouble > 0.75)
{
_audioSystem.PlayPvs(component.MissSound, uid);
diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.Spillable.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.Spillable.cs
index bd7c55e85e..7780e5d467 100644
--- a/Content.Server/Fluids/EntitySystems/PuddleSystem.Spillable.cs
+++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.Spillable.cs
@@ -143,6 +143,9 @@ public sealed partial class PuddleSystem
if (Openable.IsClosed(entity.Owner))
return;
+ if (!entity.Comp.SpillWhenThrown)
+ return;
+
if (args.User != null)
{
_adminLogger.Add(LogType.Landed,
diff --git a/Content.Server/GameTicking/Rules/VariationPass/Components/CutWireVariationPassComponent.cs b/Content.Server/GameTicking/Rules/VariationPass/Components/CutWireVariationPassComponent.cs
new file mode 100644
index 0000000000..dc9a582ec9
--- /dev/null
+++ b/Content.Server/GameTicking/Rules/VariationPass/Components/CutWireVariationPassComponent.cs
@@ -0,0 +1,29 @@
+using Content.Shared.Whitelist;
+
+namespace Content.Server.GameTicking.Rules.VariationPass.Components;
+
+///
+/// Handles cutting a random wire on random devices around the station.
+///
+[RegisterComponent]
+public sealed partial class CutWireVariationPassComponent : Component
+{
+ ///
+ /// Blacklist of hackable entities that should not be chosen to
+ /// have wires cut.
+ ///
+ [DataField]
+ public EntityWhitelist Blacklist = new();
+
+ ///
+ /// Chance for an individual wire to be cut.
+ ///
+ [DataField]
+ public float WireCutChance = 0.05f;
+
+ ///
+ /// Maximum number of wires that can be cut stationwide.
+ ///
+ [DataField]
+ public int MaxWiresCut = 10;
+}
diff --git a/Content.Server/GameTicking/Rules/VariationPass/CutWireVariationPassSystem.cs b/Content.Server/GameTicking/Rules/VariationPass/CutWireVariationPassSystem.cs
new file mode 100644
index 0000000000..fd94c74ac8
--- /dev/null
+++ b/Content.Server/GameTicking/Rules/VariationPass/CutWireVariationPassSystem.cs
@@ -0,0 +1,39 @@
+using Content.Server.GameTicking.Rules.VariationPass.Components;
+using Content.Server.Wires;
+using Robust.Shared.Random;
+
+namespace Content.Server.GameTicking.Rules.VariationPass;
+
+///
+/// Handles cutting a random wire on random devices around the station.
+/// This system identifies target devices and adds to them.
+/// The actual wire cutting is handled by .
+///
+public sealed class CutWireVariationPassSystem : VariationPassSystem
+{
+ protected override void ApplyVariation(Entity ent, ref StationVariationPassEvent args)
+ {
+ var wiresCut = 0;
+ var query = AllEntityQuery();
+ while (query.MoveNext(out var uid, out _, out var transform))
+ {
+ // Ignore if not part of the station
+ if (!IsMemberOfStation((uid, transform), ref args))
+ continue;
+
+ // Check against blacklist
+ if (ent.Comp.Blacklist.IsValid(uid))
+ continue;
+
+ if (Random.Prob(ent.Comp.WireCutChance))
+ {
+ EnsureComp(uid);
+ wiresCut++;
+
+ // Limit max wires cut
+ if (wiresCut >= ent.Comp.MaxWiresCut)
+ break;
+ }
+ }
+ }
+}
diff --git a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs
index 0b7cb9cf8f..54e8bcf8b7 100644
--- a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs
+++ b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs
@@ -249,7 +249,7 @@ public sealed class ZombieRuleSystem : GameRuleSystem
_playerManager.Sessions,
component.PatientZeroPrototypeId,
includeAllJobs: false,
- customExcludeCondition: player => HasComp(player) || HasComp(player)
+ customExcludeCondition: player => HasComp(player) || HasComp(player)
);
//And get all players, excluding ZombieImmune and roles with CanBeAntag = False - to fill any leftover initial infected slots
@@ -259,7 +259,7 @@ public sealed class ZombieRuleSystem : GameRuleSystem
acceptableAntags: Shared.Antag.AntagAcceptability.All,
includeAllJobs: false ,
ignorePreferences: true,
- customExcludeCondition: HasComp
+ customExcludeCondition: HasComp
);
//If there are no players to choose, abort
@@ -293,6 +293,7 @@ public sealed class ZombieRuleSystem : GameRuleSystem
//Add the role to the mind silently (to avoid repeating job assignment)
_roles.MindAddRole(mind, new InitialInfectedRoleComponent { PrototypeId = component.PatientZeroPrototypeId }, silent: true);
+ EnsureComp(entity);
//Add the zombie components and grace period
var pending = EnsureComp(entity);
diff --git a/Content.Server/Medical/HealthAnalyzerSystem.cs b/Content.Server/Medical/HealthAnalyzerSystem.cs
index 01d0d5c791..4988608327 100644
--- a/Content.Server/Medical/HealthAnalyzerSystem.cs
+++ b/Content.Server/Medical/HealthAnalyzerSystem.cs
@@ -49,6 +49,12 @@ public sealed class HealthAnalyzerSystem : EntitySystem
if (component.ScannedEntity is not {} patient)
continue;
+ if (Deleted(patient))
+ {
+ StopAnalyzingEntity((uid, component), patient);
+ continue;
+ }
+
component.NextUpdate = _timing.CurTime + component.UpdateInterval;
//Get distance between health analyzer and the scanned entity
diff --git a/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs b/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs
index 29e4ceebbe..9864badc62 100644
--- a/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs
+++ b/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs
@@ -33,6 +33,7 @@ public sealed class SuitSensorSystem : EntitySystem
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly StationSystem _stationSystem = default!;
[Dependency] private readonly SingletonDeviceNetServerSystem _singletonServerSystem = default!;
+ [Dependency] private readonly MobThresholdSystem _mobThresholdSystem = default!;
public override void Initialize()
{
@@ -344,6 +345,11 @@ public sealed class SuitSensorSystem : EntitySystem
if (TryComp(sensor.User.Value, out var damageable))
totalDamage = damageable.TotalDamage.Int();
+ // Get mob total damage crit threshold
+ int? totalDamageThreshold = null;
+ if (_mobThresholdSystem.TryGetThresholdForState(sensor.User.Value, Shared.Mobs.MobState.Critical, out var critThreshold))
+ totalDamageThreshold = critThreshold.Value.Int();
+
// finally, form suit sensor status
var status = new SuitSensorStatus(GetNetEntity(uid), userName, userJob, userJobIcon, userJobDepartments);
switch (sensor.Mode)
@@ -354,10 +360,12 @@ public sealed class SuitSensorSystem : EntitySystem
case SuitSensorMode.SensorVitals:
status.IsAlive = isAlive;
status.TotalDamage = totalDamage;
+ status.TotalDamageThreshold = totalDamageThreshold;
break;
case SuitSensorMode.SensorCords:
status.IsAlive = isAlive;
status.TotalDamage = totalDamage;
+ status.TotalDamageThreshold = totalDamageThreshold;
EntityCoordinates coordinates;
var xformQuery = GetEntityQuery();
@@ -402,6 +410,8 @@ public sealed class SuitSensorSystem : EntitySystem
if (status.TotalDamage != null)
payload.Add(SuitSensorConstants.NET_TOTAL_DAMAGE, status.TotalDamage);
+ if (status.TotalDamageThreshold != null)
+ payload.Add(SuitSensorConstants.NET_TOTAL_DAMAGE_THRESHOLD, status.TotalDamageThreshold);
if (status.Coordinates != null)
payload.Add(SuitSensorConstants.NET_COORDINATES, status.Coordinates);
@@ -429,12 +439,14 @@ public sealed class SuitSensorSystem : EntitySystem
// try get total damage and cords (optionals)
payload.TryGetValue(SuitSensorConstants.NET_TOTAL_DAMAGE, out int? totalDamage);
+ payload.TryGetValue(SuitSensorConstants.NET_TOTAL_DAMAGE_THRESHOLD, out int? totalDamageThreshold);
payload.TryGetValue(SuitSensorConstants.NET_COORDINATES, out NetCoordinates? coords);
var status = new SuitSensorStatus(suitSensorUid, name, job, jobIcon, jobDepartments)
{
IsAlive = isAlive.Value,
TotalDamage = totalDamage,
+ TotalDamageThreshold = totalDamageThreshold,
Coordinates = coords,
};
return status;
diff --git a/Content.Server/Shuttles/Systems/ThrusterSystem.cs b/Content.Server/Shuttles/Systems/ThrusterSystem.cs
index 74c42ccbc5..be55cd9a62 100644
--- a/Content.Server/Shuttles/Systems/ThrusterSystem.cs
+++ b/Content.Server/Shuttles/Systems/ThrusterSystem.cs
@@ -264,6 +264,11 @@ public sealed class ThrusterSystem : EntitySystem
return;
}
+ if (TryComp(uid, out var apcPower))
+ {
+ apcPower.NeedsPower = true;
+ }
+
component.IsOn = true;
if (!EntityManager.TryGetComponent(xform.GridUid, out ShuttleComponent? shuttleComponent))
@@ -366,6 +371,11 @@ public sealed class ThrusterSystem : EntitySystem
if (!EntityManager.TryGetComponent(gridId, out ShuttleComponent? shuttleComponent))
return;
+ if (TryComp(uid, out var apcPower))
+ {
+ apcPower.NeedsPower = false;
+ }
+
// Logger.DebugS("thruster", $"Disabled thruster {uid}");
switch (component.Type)
diff --git a/Content.Server/Spawners/Components/TimedSpawnerComponent.cs b/Content.Server/Spawners/Components/TimedSpawnerComponent.cs
index abbfd37c6a..b60afbc88b 100644
--- a/Content.Server/Spawners/Components/TimedSpawnerComponent.cs
+++ b/Content.Server/Spawners/Components/TimedSpawnerComponent.cs
@@ -1,40 +1,54 @@
using System.Threading;
using Robust.Shared.Prototypes;
-using Robust.Shared.Random;
using Robust.Shared.Serialization;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
-namespace Content.Server.Spawners.Components
+namespace Content.Server.Spawners.Components;
+
+///
+/// Spawns entities at a set interval.
+/// Can configure the set of entities, spawn timing, spawn chance,
+/// and min/max number of entities to spawn.
+///
+[RegisterComponent]
+public sealed partial class TimedSpawnerComponent : Component, ISerializationHooks
{
- [RegisterComponent]
- public sealed partial class TimedSpawnerComponent : Component, ISerializationHooks
+ ///
+ /// List of entities that can be spawned by this component. One will be randomly
+ /// chosen for each entity spawned. When multiple entities are spawned at once,
+ /// each will be randomly chosen separately.
+ ///
+ [DataField]
+ public List Prototypes = [];
+
+ ///
+ /// Chance of an entity being spawned at the end of each interval.
+ ///
+ [DataField]
+ public float Chance = 1.0f;
+
+ ///
+ /// Length of the interval between spawn attempts.
+ ///
+ [DataField]
+ public int IntervalSeconds = 60;
+
+ ///
+ /// The minimum number of entities that can be spawned when an interval elapses.
+ ///
+ [DataField]
+ public int MinimumEntitiesSpawned = 1;
+
+ ///
+ /// The maximum number of entities that can be spawned when an interval elapses.
+ ///
+ [DataField]
+ public int MaximumEntitiesSpawned = 1;
+
+ public CancellationTokenSource? TokenSource;
+
+ void ISerializationHooks.AfterDeserialization()
{
- [ViewVariables(VVAccess.ReadWrite)]
- [DataField("prototypes", customTypeSerializer:typeof(PrototypeIdListSerializer))]
- public List Prototypes { get; set; } = new();
-
- [ViewVariables(VVAccess.ReadWrite)]
- [DataField("chance")]
- public float Chance { get; set; } = 1.0f;
-
- [ViewVariables(VVAccess.ReadWrite)]
- [DataField("intervalSeconds")]
- public int IntervalSeconds { get; set; } = 60;
-
- [ViewVariables(VVAccess.ReadWrite)]
- [DataField("MinimumEntitiesSpawned")]
- public int MinimumEntitiesSpawned { get; set; } = 1;
-
- [ViewVariables(VVAccess.ReadWrite)]
- [DataField("MaximumEntitiesSpawned")]
- public int MaximumEntitiesSpawned { get; set; } = 1;
-
- public CancellationTokenSource? TokenSource;
-
- void ISerializationHooks.AfterDeserialization()
- {
- if (MinimumEntitiesSpawned > MaximumEntitiesSpawned)
- throw new ArgumentException("MaximumEntitiesSpawned can't be lower than MinimumEntitiesSpawned!");
- }
+ if (MinimumEntitiesSpawned > MaximumEntitiesSpawned)
+ throw new ArgumentException("MaximumEntitiesSpawned can't be lower than MinimumEntitiesSpawned!");
}
}
diff --git a/Content.Server/StationEvents/Events/IonStormRule.cs b/Content.Server/StationEvents/Events/IonStormRule.cs
index e73c9a1813..cd3cd63ae8 100644
--- a/Content.Server/StationEvents/Events/IonStormRule.cs
+++ b/Content.Server/StationEvents/Events/IonStormRule.cs
@@ -1,3 +1,4 @@
+using System.Linq;
using Content.Server.GameTicking.Rules.Components;
using Content.Server.Silicons.Laws;
using Content.Server.Station.Components;
@@ -143,6 +144,24 @@ public sealed class IonStormRule : StationEventSystem
});
}
+ // sets all unobfuscated laws' indentifier in order from highest to lowest priority
+ // This could technically override the Obfuscation from the code above, but it seems unlikely enough to basically never happen
+ int orderDeduction = -1;
+
+ for (int i = 0; i < laws.Laws.Count; i++)
+ {
+ string notNullIdentifier = laws.Laws[i].LawIdentifierOverride ?? (i - orderDeduction).ToString();
+
+ if (notNullIdentifier.Any(char.IsSymbol))
+ {
+ orderDeduction += 1;
+ }
+ else
+ {
+ laws.Laws[i].LawIdentifierOverride = (i - orderDeduction).ToString();
+ }
+ }
+
_adminLogger.Add(LogType.Mind, LogImpact.High, $"{ToPrettyString(ent):silicon} had its laws changed by an ion storm to {laws.LoggingString()}");
// laws unique to this silicon, dont use station laws anymore
diff --git a/Content.Server/Wires/CutWireOnMapInitComponent.cs b/Content.Server/Wires/CutWireOnMapInitComponent.cs
new file mode 100644
index 0000000000..4a4345e053
--- /dev/null
+++ b/Content.Server/Wires/CutWireOnMapInitComponent.cs
@@ -0,0 +1,10 @@
+namespace Content.Server.Wires;
+
+///
+/// Picks a random wire on the entity's and cuts it.
+/// Runs at MapInit and removes itself afterwards.
+///
+[RegisterComponent]
+public sealed partial class CutWireOnMapInitComponent : Component
+{
+}
diff --git a/Content.Server/Wires/CutWireOnMapInitSystem.cs b/Content.Server/Wires/CutWireOnMapInitSystem.cs
new file mode 100644
index 0000000000..1de1d78630
--- /dev/null
+++ b/Content.Server/Wires/CutWireOnMapInitSystem.cs
@@ -0,0 +1,34 @@
+using Robust.Shared.Random;
+
+namespace Content.Server.Wires;
+
+///
+/// Handles cutting a random wire on devices that have .
+///
+public sealed partial class CutWireOnMapInitSystem : EntitySystem
+{
+ [Dependency] private readonly IRobustRandom _random = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnMapInit, after: [typeof(WiresSystem)]);
+ }
+
+ private void OnMapInit(Entity entity, ref MapInitEvent args)
+ {
+ if (TryComp(entity, out var panel) && panel.WiresList.Count > 0)
+ {
+ // Pick a random wire
+ var targetWire = _random.Pick(panel.WiresList);
+
+ // Cut the wire
+ if (targetWire.Action == null || targetWire.Action.Cut(EntityUid.Invalid, targetWire))
+ targetWire.IsCut = true;
+ }
+
+ // Our work here is done
+ RemCompDeferred(entity, entity.Comp);
+ }
+}
diff --git a/Content.Shared/Alert/AlertsSystem.cs b/Content.Shared/Alert/AlertsSystem.cs
index d8737a717a..5b888e30c4 100644
--- a/Content.Shared/Alert/AlertsSystem.cs
+++ b/Content.Shared/Alert/AlertsSystem.cs
@@ -80,6 +80,10 @@ public abstract class AlertsSystem : EntitySystem
/// if true, the cooldown will be visibly shown over the alert icon
public void ShowAlert(EntityUid euid, AlertType alertType, short? severity = null, (TimeSpan, TimeSpan)? cooldown = null, bool autoRemove = false, bool showCooldown = true )
{
+ // This should be handled as part of networking.
+ if (_timing.ApplyingState)
+ return;
+
if (!TryComp(euid, out AlertsComponent? alertsComponent))
return;
@@ -148,6 +152,9 @@ public abstract class AlertsSystem : EntitySystem
///
public void ClearAlert(EntityUid euid, AlertType alertType)
{
+ if (_timing.ApplyingState)
+ return;
+
if (!EntityManager.TryGetComponent(euid, out AlertsComponent? alertsComponent))
return;
diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs
index 34a416f536..1300a3dc98 100644
--- a/Content.Shared/CCVar/CCVars.cs
+++ b/Content.Shared/CCVar/CCVars.cs
@@ -543,8 +543,8 @@ namespace Content.Shared.CCVar
* Console
*/
- public static readonly CVarDef
- ConsoleLoginLocal = CVarDef.Create("console.loginlocal", true, CVar.ARCHIVE | CVar.SERVERONLY);
+ public static readonly CVarDef ConsoleLoginLocal =
+ CVarDef.Create("console.loginlocal", true, CVar.ARCHIVE | CVar.SERVERONLY);
///
/// Automatically log in the given user as host, equivalent to the promotehost command.
@@ -726,7 +726,7 @@ namespace Content.Shared.CCVar
public static readonly CVarDef CombatModeIndicatorsPointShow =
CVarDef.Create("hud.combat_mode_indicators_point_show", true, CVar.ARCHIVE | CVar.CLIENTONLY);
-
+
public static readonly CVarDef LoocAboveHeadShow =
CVarDef.Create("hud.show_looc_above_head", true, CVar.ARCHIVE | CVar.CLIENTONLY);
@@ -836,6 +836,7 @@ namespace Content.Shared.CCVar
///
/// Should the ban details in admin channel include PII? (IP, HWID, etc)
+ ///
public static readonly CVarDef AdminShowPIIOnBan =
CVarDef.Create("admin.show_pii_onban", false, CVar.SERVERONLY);
@@ -1224,6 +1225,9 @@ namespace Content.Shared.CCVar
///
public static readonly CVarDef OocEnableDuringRound =
CVarDef.Create("ooc.enable_during_round", false, CVar.NOTIFY | CVar.REPLICATED | CVar.SERVER);
+
+ public static readonly CVarDef ShowOocPatronColor =
+ CVarDef.Create("ooc.show_ooc_patron_color", true, CVar.ARCHIVE | CVar.REPLICATED | CVar.CLIENT);
/*
* LOOC
diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs
index f189db005b..85df04d20a 100644
--- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs
+++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs
@@ -91,7 +91,7 @@ public abstract class ClothingSystem : EntitySystem
private void ToggleVisualLayer(EntityUid equipee, HumanoidVisualLayers layer, string tag)
{
- InventorySystem.InventorySlotEnumerator enumerator = _invSystem.GetSlotEnumerator(equipee);
+ InventorySystem.InventorySlotEnumerator enumerator = _invSystem.GetSlotEnumerator(equipee, SlotFlags.HEAD ^ SlotFlags.MASK);
bool shouldLayerShow = true;
while (enumerator.NextItem(out EntityUid item))
@@ -164,7 +164,7 @@ public abstract class ClothingSystem : EntitySystem
{
if (args.Handled || args.Cancelled || args.Target is not { } target)
return;
- args.Handled = _invSystem.TryEquip(args.User, target, ent, args.Slot, clothing: ent.Comp, predicted: true, checkDoafter: false);
+ args.Handled = _invSystem.TryEquip(args.User, target, ent, args.Slot, clothing: ent.Comp, predicted: true, checkDoafter: false);
}
private void OnUnequipDoAfter(Entity ent, ref ClothingUnequipDoAfterEvent args)
diff --git a/Content.Shared/Communications/SharedCommunicationsConsoleComponent.cs b/Content.Shared/Communications/SharedCommunicationsConsoleComponent.cs
index d48b99837f..604b067a84 100644
--- a/Content.Shared/Communications/SharedCommunicationsConsoleComponent.cs
+++ b/Content.Shared/Communications/SharedCommunicationsConsoleComponent.cs
@@ -11,7 +11,7 @@ namespace Content.Shared.Communications
public sealed class CommunicationsConsoleInterfaceState : BoundUserInterfaceState
{
public readonly bool CanAnnounce;
- public readonly bool CanBroadcast;
+ public readonly bool CanBroadcast = true;
public readonly bool CanCall;
public readonly TimeSpan? ExpectedCountdownEnd;
public readonly bool CountdownStarted;
diff --git a/Content.Shared/Fluids/Components/SpillableComponent.cs b/Content.Shared/Fluids/Components/SpillableComponent.cs
index 428d91f2de..51bb73a11f 100644
--- a/Content.Shared/Fluids/Components/SpillableComponent.cs
+++ b/Content.Shared/Fluids/Components/SpillableComponent.cs
@@ -29,4 +29,10 @@ public sealed partial class SpillableComponent : Component
///
[DataField]
public FixedPoint2 MaxMeleeSpillAmount = FixedPoint2.New(20);
+
+ ///
+ /// Should this item be spilled when thrown?
+ ///
+ [DataField]
+ public bool SpillWhenThrown = true;
}
diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs
index e4864b1f7f..8d49ce31f0 100644
--- a/Content.Shared/Interaction/SharedInteractionSystem.cs
+++ b/Content.Shared/Interaction/SharedInteractionSystem.cs
@@ -682,7 +682,7 @@ namespace Content.Shared.Interaction
if (!inRange && popup && _gameTiming.IsFirstTimePredicted)
{
var message = Loc.GetString("interaction-system-user-interaction-cannot-reach");
- _popupSystem.PopupEntity(message, origin, origin);
+ _popupSystem.PopupClient(message, origin, origin);
}
return inRange;
diff --git a/Content.Shared/Lock/LockSystem.cs b/Content.Shared/Lock/LockSystem.cs
index e6d1e1694e..392a9bcc98 100644
--- a/Content.Shared/Lock/LockSystem.cs
+++ b/Content.Shared/Lock/LockSystem.cs
@@ -278,7 +278,7 @@ public sealed class LockSystem : EntitySystem
//CrystallPunk Lock System Adapt End
}
-private void OnEmagged(EntityUid uid, LockComponent component, ref GotEmaggedEvent args)
+ private void OnEmagged(EntityUid uid, LockComponent component, ref GotEmaggedEvent args)
{
if (!component.Locked || !component.BreakOnEmag)
return;
diff --git a/Content.Shared/Medical/SuitSensor/SharedSuitSensor.cs b/Content.Shared/Medical/SuitSensor/SharedSuitSensor.cs
index 07e0eca33b..e3ca466b08 100644
--- a/Content.Shared/Medical/SuitSensor/SharedSuitSensor.cs
+++ b/Content.Shared/Medical/SuitSensor/SharedSuitSensor.cs
@@ -23,6 +23,8 @@ public sealed class SuitSensorStatus
public List JobDepartments;
public bool IsAlive;
public int? TotalDamage;
+ public int? TotalDamageThreshold;
+ public float? DamagePercentage => TotalDamageThreshold == null || TotalDamage == null ? null : TotalDamage / TotalDamageThreshold;
public NetCoordinates? Coordinates;
}
@@ -58,6 +60,7 @@ public static class SuitSensorConstants
public const string NET_JOB_DEPARTMENTS = "jobDepartments";
public const string NET_IS_ALIVE = "alive";
public const string NET_TOTAL_DAMAGE = "vitals";
+ public const string NET_TOTAL_DAMAGE_THRESHOLD = "vitalsThreshold";
public const string NET_COORDINATES = "coords";
public const string NET_SUIT_SENSOR_UID = "uid";
diff --git a/Content.Shared/StatusIcon/StatusIconPrototype.cs b/Content.Shared/StatusIcon/StatusIconPrototype.cs
index 428ca95082..145b443051 100644
--- a/Content.Shared/StatusIcon/StatusIconPrototype.cs
+++ b/Content.Shared/StatusIcon/StatusIconPrototype.cs
@@ -46,6 +46,12 @@ public partial class StatusIconData : IComparable
///
[DataField]
public int Offset = 0;
+
+ ///
+ /// Sets if the icon should be rendered with or without the effect of lighting.
+ ///
+ [DataField]
+ public bool IsShaded = false;
}
///
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 0ca98f46df..f959311aa4 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -1,157 +1,4 @@
Entries:
-- author: ERORR404V1
- changes:
- - message: Added mime hardsuit
- type: Add
- id: 5796
- time: '2024-01-26T14:43:50.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24198
-- author: icekot8
- changes:
- - message: Correct display of syndicate jaws of life in hand
- type: Add
- id: 5797
- time: '2024-01-27T02:27:14.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24583
-- author: Agoichi
- changes:
- - message: Detective cabinet now have security holoprojector in interests of investigation
- type: Tweak
- - message: Security lockers have chance to spawn security holoprojector (0.5)
- type: Tweak
- id: 5798
- time: '2024-01-27T02:29:40.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24582
-- author: TheShuEd
- changes:
- - message: Flesh and Rock anomalies have been reworked to place entities more dynamically
- when spawning.
- type: Tweak
- id: 5799
- time: '2024-01-27T02:52:07.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24449
-- author: PJB3005
- changes:
- - message: PACMAN-type portable generators now show power statistics for the network
- they're connected to.
- type: Add
- - message: JRPACMAN has been buffed from 5 kW to 8 kW.
- type: Tweak
- id: 5800
- time: '2024-01-27T02:53:44.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24604
-- author: Blackern5000
- changes:
- - message: Shotgun slugs can now be printed in the security techfab.
- type: Add
- - message: Shotgun slugs now fire a single strong projectile when fired.
- type: Tweak
- id: 5801
- time: '2024-01-27T02:56:57.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24196
-- author: I-JustUser-I
- changes:
- - message: Zombie Outbreak event now has a minimum limit of 15 players.
- type: Tweak
- id: 5802
- time: '2024-01-27T03:53:09.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24577
-- author: mirrorcult
- changes:
- - message: Navmap now defaults to showing departments
- type: Tweak
- id: 5803
- time: '2024-01-27T12:08:50.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24613
-- author: Tayrtahn
- changes:
- - message: Vending machines can now be repaired with a welder.
- type: Tweak
- id: 5804
- time: '2024-01-27T12:12:53.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24603
-- author: graevy
- changes:
- - message: Added hallway screen prototypes and comms console text broadcasts.
- type: Add
- id: 5805
- time: '2024-01-27T13:51:25.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24189
-- author: mirrorcult
- changes:
- - message: Lights are now shaded with the same color that they glow.
- type: Tweak
- id: 5806
- time: '2024-01-27T17:43:45.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24612
-- author: Boaz1111
- changes:
- - message: The PKA shuttle gun now breaks rocks in one hit.
- type: Tweak
- id: 5807
- time: '2024-01-27T17:47:35.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24627
-- author: FungiFellow
- changes:
- - message: Ion Storms are twice as likely to occur.
- type: Tweak
- id: 5808
- time: '2024-01-27T23:14:09.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24633
-- author: PJB3005
- changes:
- - message: Security barriers need 5 seconds to lock and unlock.
- type: Tweak
- id: 5809
- time: '2024-01-28T00:28:02.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24637
-- author: themias
- changes:
- - message: Added cowboy hats and boots to autodrobe, secdrobe, and maints
- type: Add
- - message: Added cowboy accent
- type: Add
- id: 5810
- time: '2024-01-28T03:23:16.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24299
-- author: shampunj
- changes:
- - message: A new game preset! Can only be selected by admins. All at once.
- type: Add
- id: 5811
- time: '2024-01-28T10:41:36.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23171
-- author: Doctor-Cpu
- changes:
- - message: 3kliksphilips name.
- type: Fix
- id: 5812
- time: '2024-01-28T10:46:32.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24657
-- author: mirrorcult
- changes:
- - message: Speech sounds are now quieter
- type: Tweak
- id: 5813
- time: '2024-01-28T10:49:55.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24579
-- author: TheShuEd
- changes:
- - message: The fire anomaly is now heavier in content.
- type: Tweak
- - message: Artifacts no longer block projectiles.
- type: Tweak
- id: 5814
- time: '2024-01-29T01:30:55.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24666
-- author: Krunk
- changes:
- - message: Health analysis interfaces now also display a subject's temperature in
- Kelvin.
- type: Add
- id: 5815
- time: '2024-01-29T01:32:54.0000000+00:00'
- url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24643
- author: Ubaser
changes:
- message: Detectives now work as independent agents, separate from security, and
@@ -3810,3 +3657,160 @@
id: 6295
time: '2024-04-03T05:31:57.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/26662
+- author: deltanedas
+ changes:
+ - message: Disabled scooping foam due to a reagent duplication bug.
+ type: Fix
+ id: 6296
+ time: '2024-04-03T13:41:23.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26686
+- author: Aserovich
+ changes:
+ - message: New lobby art!
+ type: Add
+ id: 6297
+ time: '2024-04-04T05:28:30.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26505
+- author: Beck Thompson
+ changes:
+ - message: Items thrown at disposals now have to be insertable to display the miss
+ message.
+ type: Fix
+ id: 6298
+ time: '2024-04-04T06:25:47.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26716
+- author: Tayrtahn
+ changes:
+ - message: Some devices may have broken wiring at the start of each round.
+ type: Add
+ id: 6299
+ time: '2024-04-04T06:28:09.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26695
+- author: lzk228
+ changes:
+ - message: Turning off thrusters and gyroscopes now stop consume power.
+ type: Fix
+ id: 6300
+ time: '2024-04-04T06:28:33.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26690
+- author: Aexxie
+ changes:
+ - message: Added the option to disable your OOC Patron name color.
+ type: Add
+ id: 6301
+ time: '2024-04-04T07:20:06.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26653
+- author: DinoWattz
+ changes:
+ - message: Fixed pocket slots being able to hide character snout markings.
+ type: Fix
+ id: 6302
+ time: '2024-04-04T08:35:44.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26708
+- author: VasilisThePikachu
+ changes:
+ - message: Mop buckets and Janitorial Trolleys will not spill their contents as
+ soon as they are pushed.
+ type: Fix
+ - message: Mop buckets are no longer solid. So you can now walk through them.
+ type: Fix
+ id: 6303
+ time: '2024-04-04T08:39:55.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26706
+- author: ZeroDayDaemon
+ changes:
+ - message: Lowered the number of ducks in the duck crate and reduced the price of
+ it.
+ type: Tweak
+ id: 6304
+ time: '2024-04-04T19:30:13.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26729
+- author: PrPleGoo
+ changes:
+ - message: The medical HUD's brightness now scales with lighting again.
+ type: Tweak
+ - message: Most HUD icon's brightness now scale with lighting.
+ type: Tweak
+ id: 6305
+ time: '2024-04-04T23:05:01.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26726
+- author: Daemon
+ changes:
+ - message: Practice projectiles have been given standardized minimal damage.
+ type: Tweak
+ - message: The practice laser gun now works with shooting targets.
+ type: Tweak
+ id: 6306
+ time: '2024-04-05T03:15:02.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26731
+- author: Daemon
+ changes:
+ - message: Shooting targets can now have their popup type changed with a left click
+ to show total damage, damage of a single hit, both, or just a notice that it
+ was hit.
+ type: Tweak
+ id: 6307
+ time: '2024-04-05T07:19:41.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26734
+- author: Vermidia
+ changes:
+ - message: Baseball bats now require a knife to craft
+ type: Tweak
+ id: 6308
+ time: '2024-04-05T15:41:35.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26742
+- author: deltanedas
+ changes:
+ - message: Making fultons now requires cloth and they are faster to make.
+ type: Tweak
+ id: 6309
+ time: '2024-04-05T15:42:12.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26747
+- author: superjj18
+ changes:
+ - message: Broadcasting works again!
+ type: Fix
+ id: 6310
+ time: '2024-04-05T17:29:22.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26750
+- author: Golinth
+ changes:
+ - message: Fixed mindshield icons being glow in the dark
+ type: Fix
+ id: 6311
+ time: '2024-04-05T20:35:32.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26754
+- author: Blackern5000
+ changes:
+ - message: Added sap
+ type: Add
+ - message: Added syrup, it can be made by boiling sap.
+ type: Add
+ - message: Dionae now bleed sap instead of water
+ type: Tweak
+ id: 6312
+ time: '2024-04-05T21:06:12.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/25748
+- author: osjarw
+ changes:
+ - message: Thin firelocks are now constructable/deconstructable
+ type: Fix
+ id: 6313
+ time: '2024-04-06T01:55:31.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26745
+- author: BITTERLYNX
+ changes:
+ - message: Rodents are more visually pleasing to burn
+ type: Fix
+ - message: mothroach and hammy also more visually pleasing to burn
+ type: Fix
+ id: 6314
+ time: '2024-04-06T04:41:23.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26758
+- author: Plykiya
+ changes:
+ - message: You can now carefully walk over glass shards and D4.
+ type: Tweak
+ id: 6315
+ time: '2024-04-06T04:49:14.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/26763
diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl
index 67d09c9012..86ba4462cf 100644
--- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl
+++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl
@@ -42,6 +42,7 @@ ui-options-volume-percent = { TOSTRING($volume, "P0") }
ui-options-show-held-item = Show held item next to cursor
ui-options-show-combat-mode-indicators = Show combat mode indicators with cursor
ui-options-opaque-storage-window = Opaque storage window
+ui-options-show-ooc-patron-color = Show OOC Patreon color
ui-options-show-looc-on-head = Show LOOC chat above characters head
ui-options-fancy-speech = Show names in speech bubbles
ui-options-fancy-name-background = Add background to speech bubble names
diff --git a/Resources/Locale/en-US/reagents/meta/biological.ftl b/Resources/Locale/en-US/reagents/meta/biological.ftl
index a320bbdcb3..d8f0f6c413 100644
--- a/Resources/Locale/en-US/reagents/meta/biological.ftl
+++ b/Resources/Locale/en-US/reagents/meta/biological.ftl
@@ -7,6 +7,9 @@ reagent-desc-insect-blood = Okay, this is really gross. It almost looks.. alive?
reagent-name-slime = slime
reagent-desc-slime = You thought this was gradient blood at first, but you were mistaken.
+reagent-name-sap = sap
+reagent-desc-sap = Sticky, sweet tree blood.
+
reagent-name-hemocyanin-blood = blue blood
reagent-desc-hemocyanin-blood = Contains copper as opposed to iron which gives it a distinct blue color.
diff --git a/Resources/Locale/en-US/reagents/meta/consumable/food/condiments.ftl b/Resources/Locale/en-US/reagents/meta/consumable/food/condiments.ftl
index 38cd16b01c..809fbafffd 100644
--- a/Resources/Locale/en-US/reagents/meta/consumable/food/condiments.ftl
+++ b/Resources/Locale/en-US/reagents/meta/consumable/food/condiments.ftl
@@ -39,3 +39,6 @@ reagent-desc-soysauce = A salty soy-based flavoring.
reagent-name-table-salt = table salt
reagent-desc-table-salt = Commonly known as salt, Sodium Chloride is often used to season food or kill borers instantly.
+
+reagent-name-syrup = syrup
+reagent-desc-syrup = Delicious syrup made from tree sap, somehow stickier than glue.
diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml b/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml
index 922e2951b6..f44cb61f73 100644
--- a/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml
+++ b/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml
@@ -54,7 +54,7 @@
sprite: Mobs/Animals/duck.rsi
state: icon-0
product: CrateNPCDuck
- cost: 6000
+ cost: 4000
category: cargoproduct-category-name-livestock
group: market
diff --git a/Resources/Prototypes/Catalog/Fills/Crates/npc.yml b/Resources/Prototypes/Catalog/Fills/Crates/npc.yml
index 538eee9a1b..10c715bb99 100644
--- a/Resources/Prototypes/Catalog/Fills/Crates/npc.yml
+++ b/Resources/Prototypes/Catalog/Fills/Crates/npc.yml
@@ -75,10 +75,10 @@
- type: StorageFill
contents:
- id: MobDuckMallard
- amount: 2
- - id: MobDuckWhite
- amount: 2
+ amount: 1
- id: MobDuckBrown
+ amount: 1
+ - id: MobDuckWhite
amount: 2
- type: entity
diff --git a/Resources/Prototypes/Entities/Effects/chemistry_effects.yml b/Resources/Prototypes/Entities/Effects/chemistry_effects.yml
index 5b7ee46946..5ad61c6689 100644
--- a/Resources/Prototypes/Entities/Effects/chemistry_effects.yml
+++ b/Resources/Prototypes/Entities/Effects/chemistry_effects.yml
@@ -77,8 +77,9 @@
animationState: foam-dissolve
- type: Slippery
- type: StepTrigger
- - type: ScoopableSolution
- solution: solutionArea
+ # disabled until foam reagent duplication is fixed
+ #- type: ScoopableSolution
+ # solution: solutionArea
- type: entity
id: MetalFoam
@@ -134,7 +135,7 @@
- type: RCDDeconstructable
cost: 2
delay: 2
- fx: EffectRCDDeconstruct2
+ fx: EffectRCDDeconstruct2
- type: Clickable
- type: InteractionOutline
- type: Sprite
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml
index de9a3db19e..bb017b538a 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml
@@ -415,7 +415,6 @@
makeSentient: true
allowSpeech: true
allowMovement: true
- whitelistRequired: false
name: ghost-role-information-mothroach-name
description: ghost-role-information-mothroach-description
- type: Fixtures
@@ -526,6 +525,13 @@
damage: 60
behaviors:
- !type:GibBehavior { }
+ - type: FireVisuals
+ sprite: Mobs/Effects/onfire.rsi
+ normalState: Mouse_burning
+
+
+# Note that the mallard duck is actually a male drake mallard, with the brown duck being the female variant of the same species, however ss14 lacks sex specific textures
+# The white duck is more akin to a pekin or call duck.
- type: entity
name: mallard duck #Quack
@@ -744,9 +750,8 @@
Quantity: 30
- type: Udder
reagentId: Milk
- targetSolution: udder
- quantity: 25
- updateRate: 30
+ quantityPerUpdate: 25
+ growthDelay: 30
- type: Butcherable
spawned:
- id: FoodMeat
@@ -1592,6 +1597,9 @@
- type: BadFood
- type: NonSpreaderZombie
- type: PreventSpiller
+ - type: FireVisuals
+ sprite: Mobs/Effects/onfire.rsi
+ normalState: Mouse_burning
- type: entity
parent: MobMouse
@@ -3057,10 +3065,13 @@
- type: Bloodstream
bloodMaxVolume: 60
- type: CanEscapeInventory
- BaseResistTime: 3
+ baseResistTime: 3
- type: MobPrice
price: 60
- type: NonSpreaderZombie
+ - type: FireVisuals
+ sprite: Mobs/Effects/onfire.rsi
+ normalState: Mouse_burning
- type: entity
name: pig
@@ -3164,7 +3175,7 @@
- type: InventorySlots
- type: Strippable
- type: Bloodstream
- bloodReagent: Water
+ bloodReagent: Sap
bloodMaxVolume: 60
- type: UserInterface
interfaces:
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/human.yml b/Resources/Prototypes/Entities/Mobs/NPCs/human.yml
index 50515133b0..2133694342 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/human.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/human.yml
@@ -48,7 +48,7 @@
task: SimpleHumanoidHostileCompound
- type: entity
- name: syndicate footsoldier
+ name: syndicate footsoldier
parent: BaseMobHuman
id: MobSyndicateFootsoldier
components:
@@ -75,7 +75,7 @@
save: false # mobs are currently not saveable.
id: SalvageHumanCorpse
name: unidentified corpse
- description: I think he's dead.
+ description: I think they're dead.
components:
- type: RandomHumanoidAppearance
randomizeName: false
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml
index afcb2bac47..1fcd074b8e 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml
@@ -284,6 +284,9 @@
- type: GuideHelp
guides:
- MinorAntagonists
+ - type: FireVisuals
+ sprite: Mobs/Effects/onfire.rsi
+ normalState: Mouse_burning
- type: weightedRandomEntity
id: RatKingLoot
diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml
index 7f726e2f2c..dbdaa9c7e3 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml
@@ -24,14 +24,14 @@
damageOverlayGroups:
Brute:
sprite: Mobs/Effects/brute_damage.rsi
- color: "#75b1f0"
+ color: "#cd7314"
- type: Butcherable
butcheringType: Spike
spawned:
- id: FoodMeatPlant
amount: 5
- type: Bloodstream
- bloodReagent: Water
+ bloodReagent: Sap
- type: Reactive
groups:
Flammable: [ Touch ]
diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml
index 8e52630ac8..223ac6376c 100644
--- a/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml
+++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml
@@ -392,10 +392,10 @@
- type: SolutionContainerManager
solutions:
food:
- maxVol: 30
+ maxVol: 25
reagents:
- ReagentId: Nutriment
- Quantity: 25
+ Quantity: 20
- type: entity
id: FoodSnackMREBrownie
diff --git a/Resources/Prototypes/Entities/Objects/Fun/dice.yml b/Resources/Prototypes/Entities/Objects/Fun/dice.yml
index 81a9c173c7..852a1c2699 100644
--- a/Resources/Prototypes/Entities/Objects/Fun/dice.yml
+++ b/Resources/Prototypes/Entities/Objects/Fun/dice.yml
@@ -120,7 +120,6 @@
- ItemMask
- type: StepTrigger
intersectRatio: 0.2
- requiredTriggeredSpeed: 0
- type: TriggerOnStepTrigger
- type: ShoesRequiredStepTrigger
- type: Slippery
diff --git a/Resources/Prototypes/Entities/Objects/Materials/shards.yml b/Resources/Prototypes/Entities/Objects/Materials/shards.yml
index f94f0a7e0e..621a3b1c38 100644
--- a/Resources/Prototypes/Entities/Objects/Materials/shards.yml
+++ b/Resources/Prototypes/Entities/Objects/Materials/shards.yml
@@ -63,7 +63,6 @@
acts: [ "Destruction" ]
- type: StepTrigger
intersectRatio: 0.2
- requiredTriggeredSpeed: 0
- type: ShoesRequiredStepTrigger
- type: Slippery
slipSound:
diff --git a/Resources/Prototypes/Entities/Objects/Specific/Security/target.yml b/Resources/Prototypes/Entities/Objects/Specific/Security/target.yml
index adbb7cde40..a17c892169 100644
--- a/Resources/Prototypes/Entities/Objects/Specific/Security/target.yml
+++ b/Resources/Prototypes/Entities/Objects/Specific/Security/target.yml
@@ -9,6 +9,7 @@
noRot: true
- type: Repairable
- type: DamagePopup
+ allowTypeChange: true
damagePopupType: Combined
- type: Fixtures
fixtures:
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml
index c4736ad356..529e883638 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml
@@ -228,7 +228,7 @@
name: practice laser rifle
parent: WeaponLaserCarbine
id: WeaponLaserCarbinePractice
- description: This modified laser rifle fires harmless beams in the 40-watt range, for target practice.
+ description: This modified laser rifle fires nearly harmless beams in the 40-watt range, for target practice.
components:
- type: HitscanBatteryAmmoProvider
proto: RedLaserPractice
@@ -488,7 +488,7 @@
name: practice disabler
parent: WeaponDisabler
id: WeaponDisablerPractice
- description: A self-defense weapon that exhausts organic targets, weakening them until they collapse. This one has been undertuned for cadets.
+ description: A self-defense weapon that exhausts organic targets, weakening them until they collapse. This one has been undertuned for cadets making it mostly harmless.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Battery/practice_disabler.rsi
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/hitscan.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/hitscan.yml
index 99c4a7bdf2..3f37d308db 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/hitscan.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/hitscan.yml
@@ -35,7 +35,7 @@
id: RedLaserPractice
damage:
types:
- Heat: 0
+ Heat: 1
muzzleFlash:
sprite: Objects/Weapons/Guns/Projectiles/projectiles.rsi
state: muzzle_laser
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
index a28d527535..91fdaa6481 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
@@ -102,7 +102,7 @@
- type: Projectile
damage:
types:
- Blunt: 2
+ Blunt: 1
- type: entity
id: BaseBulletRubber
@@ -288,7 +288,7 @@
fly-by: *flybyfixture
- type: Ammo
- type: StaminaDamageOnCollide
- damage: 5
+ damage: 1
- type: Projectile
impactEffect: BulletImpactEffectDisabler
damage:
@@ -641,7 +641,7 @@
shader: unshaded
- type: AnomalousParticle
particleType: Sigma
-
+
- type: entity
parent: AnomalousParticleSigma
id: AnomalousParticleSigmaStrong
@@ -650,7 +650,7 @@
components:
- type: AnomalousParticle
particleType: Sigma
-
+
# Launcher projectiles (grenade / rocket)
- type: entity
id: BulletRocket
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml
index 8ba643a115..834d35a529 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml
@@ -40,6 +40,21 @@
tags:
- BaseballBat
+- type: entity
+ name: incomplete baseball bat
+ parent: BaseItem
+ id: IncompleteBaseBallBat
+ description: A few planks of wood stuck together.
+ components:
+ - type: Sprite
+ sprite: Objects/Weapons/Melee/incomplete_bat.rsi
+ state: icon
+ - type: Item
+ size: Normal
+ - type: Construction
+ graph: WoodenBat
+ node: incompleteBat
+
- type: entity
name: knockback stick
parent: BaseBallBat
diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml
index a678ab7443..1ba867773b 100644
--- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml
+++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml
@@ -151,7 +151,7 @@
- type: entity
id: FirelockEdge
- parent: BaseFirelock
+ parent: Firelock
name: firelock
components:
- type: Sprite
@@ -181,3 +181,6 @@
canCollide: false
- type: StaticPrice
price: 100
+ - type: Construction
+ graph: Firelock
+ node: FirelockEdge
diff --git a/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml b/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml
index 25047bb575..43dc63445c 100644
--- a/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml
+++ b/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml
@@ -114,7 +114,9 @@
node: mailing_unit
- type: DisposalUnit
autoEngageEnabled: false
- mobsCanEnter: false
+ whitelist:
+ components:
+ - Item
- type: MailingUnit
- type: DeviceNetwork
deviceNetId: Wired
diff --git a/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml b/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml
index bdbff1b504..2591b3f340 100644
--- a/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml
+++ b/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml
@@ -23,6 +23,7 @@
- type: Spillable
solution: bucket
spillDelay: 3.0
+ spillWhenThrown: false
- type: DrainableSolution
solution: bucket
- type: RefillableSolution
@@ -61,6 +62,7 @@
priority: 3 # Higher than drinking priority
- type: Drink
solution: bucket
+ - type: Appearance
- type: SolutionContainerVisuals
maxFillLevels: 3
fillBaseName: mopbucket_water-
@@ -82,6 +84,15 @@
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
+ - type: Fixtures
+ fixtures:
+ fix1:
+ shape:
+ !type:PhysShapeAabb
+ bounds: "-0.45,-0.45,0.45,0.45"
+ density: 60
+ mask:
+ - MachineMask
- type: entity
name: mop bucket
@@ -207,6 +218,7 @@
- type: Spillable
solution: bucket
spillDelay: 3.0
+ spillWhenThrown: false
- type: SolutionContainerManager
solutions:
bucket:
diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml
index 21ad1310de..29ede4fc90 100644
--- a/Resources/Prototypes/GameRules/roundstart.yml
+++ b/Resources/Prototypes/GameRules/roundstart.yml
@@ -142,6 +142,7 @@
- id: BasicTrashVariationPass
- id: SolidWallRustingVariationPass
- id: ReinforcedWallRustingVariationPass
+ - id: CutWireVariationPass
- id: BasicPuddleMessVariationPass
prob: 0.99
orGroup: puddleMess
diff --git a/Resources/Prototypes/GameRules/variation.yml b/Resources/Prototypes/GameRules/variation.yml
index 8721003c83..7424fc2854 100644
--- a/Resources/Prototypes/GameRules/variation.yml
+++ b/Resources/Prototypes/GameRules/variation.yml
@@ -119,3 +119,15 @@
tilesPerSpillAverage: 150
tilesPerSpillStdDev: 10
randomPuddleSolutionFill: RandomFillTrashPuddleBloodbath
+
+- type: entity
+ id: CutWireVariationPass
+ parent: BaseVariationPass
+ noSpawn: true
+ components:
+ - type: CutWireVariationPass
+ wireCutChance: 0.01
+ maxWiresCut: 20
+ blacklist:
+ components:
+ - ParticleAcceleratorControlBox
diff --git a/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml b/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml
index 8fbfd3cd64..4cc2810792 100644
--- a/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml
+++ b/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml
@@ -164,3 +164,27 @@
# eating salt on its own kinda sucks, kids
- !type:SatiateThirst
factor: -0.5
+
+- type: reagent
+ id: Syrup
+ name: reagent-name-syrup
+ group: Foods
+ desc: reagent-desc-syrup
+ flavor: sweet
+ color: "#fb7125"
+ recognizable: true
+ physicalDesc: reagent-physical-desc-sticky
+ slippery: false
+ viscosity: 0.55 #Start using syrup to attach your remote recievers to your microwaves!
+ tileReactions:
+ - !type:SpillTileReaction
+ metabolisms:
+ Food:
+ # 12 diona blood for 1 unit of syrup, this stuff better be worthwhile.
+ effects:
+ - !type:SatiateHunger
+ factor: 6.0 #Stronger than cookedramen
+ footstepSound:
+ collection: FootstepBlood
+ params:
+ volume: 6
diff --git a/Resources/Prototypes/Reagents/biological.yml b/Resources/Prototypes/Reagents/biological.yml
index c24c073f03..0c53ae10fd 100644
--- a/Resources/Prototypes/Reagents/biological.yml
+++ b/Resources/Prototypes/Reagents/biological.yml
@@ -82,6 +82,32 @@
params:
volume: 6
+- type: reagent
+ id: Sap
+ name: reagent-name-sap
+ group: Biological
+ desc: reagent-desc-sap
+ flavor: sweet
+ color: "#cd7314"
+ recognizable: true
+ physicalDesc: reagent-physical-desc-sticky
+ slippery: false
+ viscosity: 0.10
+ tileReactions:
+ - !type:SpillTileReaction
+ metabolisms:
+ Food:
+ # Sweet!
+ effects:
+ - !type:SatiateHunger
+ factor: 1
+ - !type:SatiateThirst
+ factor: 1
+ footstepSound:
+ collection: FootstepBlood
+ params:
+ volume: 6
+
- type: reagent
parent: Blood
id: CopperBlood
diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/structures/firelock.yml b/Resources/Prototypes/Recipes/Construction/Graphs/structures/firelock.yml
index 0dbf26794d..0d7bdddd2f 100644
--- a/Resources/Prototypes/Recipes/Construction/Graphs/structures/firelock.yml
+++ b/Resources/Prototypes/Recipes/Construction/Graphs/structures/firelock.yml
@@ -103,6 +103,14 @@
- tool: Anchoring
doAfter: 1
+ - to: FirelockEdge
+ conditions:
+ - !type:EntityAnchored
+ anchored: true
+ steps:
+ - tool: Welding
+ doAfter: 0.5
+
- to: FirelockGlassFrame
conditions:
- !type:EntityAnchored
@@ -160,3 +168,14 @@
steps:
- tool: Anchoring
doAfter: 1
+
+ - node: FirelockEdge
+ entity: FirelockEdge
+ edges:
+ - to: frame4
+ conditions:
+ - !type:DoorWelded
+ welded: true
+ steps:
+ - tool: Anchoring
+ doAfter: 0.25
diff --git a/Resources/Prototypes/Recipes/Construction/structures.yml b/Resources/Prototypes/Recipes/Construction/structures.yml
index bea97beaaa..a1f370cc1b 100644
--- a/Resources/Prototypes/Recipes/Construction/structures.yml
+++ b/Resources/Prototypes/Recipes/Construction/structures.yml
@@ -795,6 +795,23 @@
conditions:
- !type:TileNotBlocked
+- type: construction
+ name: Thin firelock
+ id: FirelockEdge
+ graph: Firelock
+ startNode: start
+ targetNode: FirelockEdge
+ category: construction-category-structures
+ description: This is a firelock - it locks an area when a fire alarm in the area is triggered. Don't get squished!
+ icon:
+ sprite: Structures/Doors/edge_door_hazard.rsi
+ state: closed
+ placementMode: SnapgridCenter
+ objectType: Structure
+ canBuildInImpassable: false
+ conditions:
+ - !type:TileNotBlocked
+
- type: construction
name: shutter
id: Shutters
diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/bat.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/bat.yml
index 56530f443e..cecd031f97 100644
--- a/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/bat.yml
+++ b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/bat.yml
@@ -1,13 +1,31 @@
-- type: constructionGraph
+- type: constructionGraph
id: WoodenBat
start: start
graph:
- node: start
edges:
- - to: bat
+ - to: incompleteBat
steps:
- material: WoodPlank
amount: 5
doAfter: 4
+
+ - node: incompleteBat
+ entity: IncompleteBaseBallBat
+ edges:
+ - to: start
+ completed:
+ - !type:SpawnPrototype
+ prototype: MaterialWoodPlank1
+ amount: 5
+ - !type:DeleteEntity {}
+ steps:
+ - tool: Prying
+ doAfter: 1
+ - to: bat
+ steps:
+ - tool: Slicing
+ doAfter: 4
+
- node: bat
entity: BaseBallBat
diff --git a/Resources/Prototypes/Recipes/Lathes/salvage.yml b/Resources/Prototypes/Recipes/Lathes/salvage.yml
index 57ae75b617..9b3cb08643 100644
--- a/Resources/Prototypes/Recipes/Lathes/salvage.yml
+++ b/Resources/Prototypes/Recipes/Lathes/salvage.yml
@@ -1,11 +1,10 @@
- type: latheRecipe
id: Fulton
result: Fulton1
- completetime: 5
+ completetime: 1
materials:
Steel: 200
- # TODO: Need better sources of cloth as otherwise these will never get made.
- # Cloth: 200
+ Cloth: 100
- type: latheRecipe
id: FultonBeacon
diff --git a/Resources/Prototypes/Recipes/Reactions/biological.yml b/Resources/Prototypes/Recipes/Reactions/biological.yml
index 4e94b8d85b..604211466f 100644
--- a/Resources/Prototypes/Recipes/Reactions/biological.yml
+++ b/Resources/Prototypes/Recipes/Reactions/biological.yml
@@ -25,6 +25,19 @@
Water: 4
Nitrogen: 1
+
+- type: reaction
+ id: SapBloodBreakdown
+ source: true
+ requiredMixerCategories:
+ - Centrifuge
+ reactants:
+ Sap:
+ amount: 10
+ products:
+ Water: 9
+ Sugar: 1
+
- type: reaction
id: CopperBloodBreakdown
source: true
diff --git a/Resources/Prototypes/Recipes/Reactions/single_reagent.yml b/Resources/Prototypes/Recipes/Reactions/single_reagent.yml
index 160353219b..46fe35415f 100644
--- a/Resources/Prototypes/Recipes/Reactions/single_reagent.yml
+++ b/Resources/Prototypes/Recipes/Reactions/single_reagent.yml
@@ -20,6 +20,19 @@
products:
EggCooked: 0.5
+- type: reaction
+ id: SapBoiling
+ impact: Low
+ minTemp: 377
+ reactants:
+ Sap:
+ amount: 1.2
+ effects:
+ - !type:CreateGas
+ gas: WaterVapor
+ products:
+ Syrup: 0.1 #12:1 sap to syruop
+
# Holy - TODO: make it so only the chaplain can use the bible to start these reactions, not anyone with a bible
- type: reaction
diff --git a/Resources/Prototypes/Research/experimental.yml b/Resources/Prototypes/Research/experimental.yml
index 5fbf0e640b..1b1a738322 100644
--- a/Resources/Prototypes/Research/experimental.yml
+++ b/Resources/Prototypes/Research/experimental.yml
@@ -4,8 +4,8 @@
id: BasicRobotics
name: research-technology-basic-robotics
icon:
- sprite: Mobs/Silicon/drone.rsi
- state: drone
+ sprite: Structures/Machines/exosuit_fabricator.rsi
+ state: fab-idle
discipline: Experimental
tier: 1
cost: 5000
diff --git a/Resources/Prototypes/StatusEffects/health.yml b/Resources/Prototypes/StatusEffects/health.yml
index 12c16e57f0..562dbb336d 100644
--- a/Resources/Prototypes/StatusEffects/health.yml
+++ b/Resources/Prototypes/StatusEffects/health.yml
@@ -1,32 +1,35 @@
- type: statusIcon
- id: HealthIconFine
+ id: HealthIcon
+ abstract: true
priority: 1
+ locationPreference: Right
+ isShaded: true
+
+- type: statusIcon
+ parent: HealthIcon
+ id: HealthIconFine
icon:
sprite: /Textures/Interface/Misc/health_icons.rsi
state: Fine
- locationPreference: Right
- type: statusIcon
id: HealthIconCritical
- priority: 1
+ parent: HealthIcon
icon:
sprite: /Textures/Interface/Misc/health_icons.rsi
state: Critical
- locationPreference: Right
- type: statusIcon
id: HealthIconDead
- priority: 1
+ parent: HealthIcon
icon:
sprite: /Textures/Interface/Misc/health_icons.rsi
state: Dead
- locationPreference: Right
- type: statusIcon
id: HealthIconRotting
- priority: 1
+ parent: HealthIcon
icon:
sprite: /Textures/Interface/Misc/health_icons.rsi
state: Rotting
- locationPreference: Right
diff --git a/Resources/Prototypes/StatusEffects/hunger.yml b/Resources/Prototypes/StatusEffects/hunger.yml
index 6436665713..9af246e06e 100644
--- a/Resources/Prototypes/StatusEffects/hunger.yml
+++ b/Resources/Prototypes/StatusEffects/hunger.yml
@@ -1,49 +1,57 @@
#Hunger
- type: statusIcon
- id: HungerIconOverfed
+ id: HungerIcon
+ abstract: true
priority: 5
+ locationPreference: Right
+ isShaded: true
+
+- type: statusIcon
+ id: HungerIconOverfed
+ parent: HungerIcon
icon:
sprite: /Textures/Interface/Misc/food_icons.rsi
state: overfed
- locationPreference: Right
- type: statusIcon
id: HungerIconPeckish
- priority: 5
+ parent: HungerIcon
icon:
sprite: /Textures/Interface/Misc/food_icons.rsi
state: peckish
- locationPreference: Right
- type: statusIcon
id: HungerIconStarving
- priority: 5
+ parent: HungerIcon
icon:
sprite: /Textures/Interface/Misc/food_icons.rsi
state: starving
- locationPreference: Right
#Thirst
- type: statusIcon
- id: ThirstIconOverhydrated
+ id: ThirstIcon
+ abstract: true
priority: 5
+ locationPreference: Left
+ isShaded: true
+
+- type: statusIcon
+ id: ThirstIconOverhydrated
+ parent: ThirstIcon
icon:
sprite: /Textures/Interface/Misc/food_icons.rsi
state: overhydrated
- locationPreference: Left
- type: statusIcon
id: ThirstIconThirsty
- priority: 5
+ parent: ThirstIcon
icon:
sprite: /Textures/Interface/Misc/food_icons.rsi
state: thirsty
- locationPreference: Left
- type: statusIcon
id: ThirstIconParched
- priority: 5
+ parent: ThirstIcon
icon:
sprite: /Textures/Interface/Misc/food_icons.rsi
state: parched
- locationPreference: Left
diff --git a/Resources/Prototypes/StatusEffects/job.yml b/Resources/Prototypes/StatusEffects/job.yml
index 0811877ab5..aec3f5e69d 100644
--- a/Resources/Prototypes/StatusEffects/job.yml
+++ b/Resources/Prototypes/StatusEffects/job.yml
@@ -3,6 +3,7 @@
abstract: true
priority: 1
locationPreference: Right
+ isShaded: true
- type: statusIcon
parent: JobIcon
diff --git a/Resources/Prototypes/StatusEffects/security.yml b/Resources/Prototypes/StatusEffects/security.yml
index 51d087104d..ca25f746f2 100644
--- a/Resources/Prototypes/StatusEffects/security.yml
+++ b/Resources/Prototypes/StatusEffects/security.yml
@@ -4,6 +4,7 @@
priority: 2
offset: 1
locationPreference: Right
+ isShaded: true
- type: statusIcon
parent: SecurityIcon
diff --git a/Resources/Prototypes/StatusIcon/antag.yml b/Resources/Prototypes/StatusIcon/antag.yml
index 87576f93b7..da530a86d8 100644
--- a/Resources/Prototypes/StatusIcon/antag.yml
+++ b/Resources/Prototypes/StatusIcon/antag.yml
@@ -31,6 +31,7 @@
priority: 1
locationPreference: Right
layer: Mod
+ isShaded: true
icon:
sprite: /Textures/Interface/Misc/job_icons.rsi
state: MindShield
diff --git a/Resources/Prototypes/lobbyscreens.yml b/Resources/Prototypes/lobbyscreens.yml
index 7b72f6d413..f1c2b0c78b 100644
--- a/Resources/Prototypes/lobbyscreens.yml
+++ b/Resources/Prototypes/lobbyscreens.yml
@@ -40,4 +40,4 @@
#
#- type: lobbyBackground
# id: Behonker
-# background: /Textures/LobbyScreens/behonker.webp
\ No newline at end of file
+# background: /Textures/LobbyScreens/behonker.webp
diff --git a/Resources/Textures/Decals/bricktile.rsi/white_box.png b/Resources/Textures/Decals/bricktile.rsi/white_box.png
index d4454f0676..e8c0fa9a8a 100644
Binary files a/Resources/Textures/Decals/bricktile.rsi/white_box.png and b/Resources/Textures/Decals/bricktile.rsi/white_box.png differ
diff --git a/Resources/Textures/LobbyScreens/attributions.yml b/Resources/Textures/LobbyScreens/attributions.yml
index f27d0b3b2c..3b81fc68fd 100644
--- a/Resources/Textures/LobbyScreens/attributions.yml
+++ b/Resources/Textures/LobbyScreens/attributions.yml
@@ -37,3 +37,8 @@
license: "CC-BY-NC-SA-3.0"
copyright: "InCrah on twitter / @in_crah"
source: "https://twitter.com/in_crah"
+
+- files: ["terminalstation.webp"]
+ license: "CC-BY-SA-3.0"
+ copyright: "aserovich on discord"
+ source: "https://github.com/space-wizards/space-station-14"
diff --git a/Resources/Textures/LobbyScreens/terminalstation.webp b/Resources/Textures/LobbyScreens/terminalstation.webp
new file mode 100644
index 0000000000..ae7cab269d
Binary files /dev/null and b/Resources/Textures/LobbyScreens/terminalstation.webp differ
diff --git a/Resources/Textures/LobbyScreens/terminalstation.webp.yml b/Resources/Textures/LobbyScreens/terminalstation.webp.yml
new file mode 100644
index 0000000000..5c43e23305
--- /dev/null
+++ b/Resources/Textures/LobbyScreens/terminalstation.webp.yml
@@ -0,0 +1,2 @@
+sample:
+ filter: true
diff --git a/Resources/Textures/Mobs/Effects/onfire.rsi/Mouse_burning.png b/Resources/Textures/Mobs/Effects/onfire.rsi/Mouse_burning.png
new file mode 100644
index 0000000000..d5461a89c0
Binary files /dev/null and b/Resources/Textures/Mobs/Effects/onfire.rsi/Mouse_burning.png differ
diff --git a/Resources/Textures/Mobs/Effects/onfire.rsi/meta.json b/Resources/Textures/Mobs/Effects/onfire.rsi/meta.json
index 5bd235bf90..005128d9be 100644
--- a/Resources/Textures/Mobs/Effects/onfire.rsi/meta.json
+++ b/Resources/Textures/Mobs/Effects/onfire.rsi/meta.json
@@ -1 +1,51 @@
-{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/tgstation/tgstation at 0d9c9a8233dfc3fc55edc538955a761a6328bee0", "states": [{"name": "Generic_mob_burning", "directions": 4, "delays": [[0.1, 0.1, 0.1, 0.1, 0.1], [0.1, 0.1, 0.1, 0.1, 0.1], [0.1, 0.1, 0.1, 0.1, 0.1], [0.1, 0.1, 0.1, 0.1, 0.1]]}, {"name": "Monkey_burning", "directions": 4, "delays": [[0.1, 0.1, 0.1, 0.1], [0.1, 0.1, 0.1, 0.1], [0.1, 0.1, 0.1, 0.1], [0.1, 0.1, 0.1, 0.1]]}, {"name": "Standing", "directions": 4, "delays": [[0.1, 0.1, 0.1, 0.1], [0.1, 0.1, 0.1, 0.1], [0.1, 0.1, 0.1, 0.1], [0.1, 0.1, 0.1, 0.1]]}]}
\ No newline at end of file
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from https://github.com/tgstation/tgstation at 0d9c9a8233dfc3fc55edc538955a761a6328bee0",
+ "states": [
+ {
+ "name": "Generic_mob_burning",
+ "directions": 4,
+ "delays": [
+ [ 0.1, 0.1, 0.1, 0.1, 0.1 ],
+ [ 0.1, 0.1, 0.1, 0.1, 0.1 ],
+ [ 0.1, 0.1, 0.1, 0.1, 0.1 ],
+ [ 0.1, 0.1, 0.1, 0.1, 0.1 ]
+ ]
+ },
+ {
+ "name": "Monkey_burning",
+ "directions": 4,
+ "delays": [
+ [ 0.1, 0.1, 0.1, 0.1 ],
+ [ 0.1, 0.1, 0.1, 0.1 ],
+ [ 0.1, 0.1, 0.1, 0.1 ],
+ [ 0.1, 0.1, 0.1, 0.1 ]
+ ]
+ },
+ {
+ "name": "Standing",
+ "directions": 4,
+ "delays": [
+ [ 0.1, 0.1, 0.1, 0.1 ],
+ [ 0.1, 0.1, 0.1, 0.1 ],
+ [ 0.1, 0.1, 0.1, 0.1 ],
+ [ 0.1, 0.1, 0.1, 0.1 ]
+ ]
+ },
+ {
+ "name": "Mouse_burning",
+ "directions": 4,
+ "delays": [
+ [ 0.1, 0.1, 0.1, 0.1, 0.1 ],
+ [ 0.1, 0.1, 0.1, 0.1, 0.1 ],
+ [ 0.1, 0.1, 0.1, 0.1, 0.1 ],
+ [ 0.1, 0.1, 0.1, 0.1, 0.1 ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/Objects/Weapons/Melee/incomplete_bat.rsi/icon.png b/Resources/Textures/Objects/Weapons/Melee/incomplete_bat.rsi/icon.png
new file mode 100644
index 0000000000..6955b10e5d
Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Melee/incomplete_bat.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Weapons/Melee/incomplete_bat.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/incomplete_bat.rsi/meta.json
new file mode 100644
index 0000000000..c7c06adfc8
--- /dev/null
+++ b/Resources/Textures/Objects/Weapons/Melee/incomplete_bat.rsi/meta.json
@@ -0,0 +1,14 @@
+{
+ "version": 1,
+ "license": "CC-BY-NC-SA-3.0",
+ "copyright": "Taken from goonstation and modified by Swept at commit https://github.com/goonstation/goonstation/pull/3555/commits/b24eb6260647c0fcfe858268a26b6160bc50017a, modified into incomplete version by Vermidia",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ }
+ ]
+}
diff --git a/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/display.png b/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/display.png
index e86c457962..d9edabb6a0 100644
Binary files a/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/display.png and b/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/display.png differ
diff --git a/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/icon.png b/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/icon.png
index d21713efdd..a60dc10b12 100644
Binary files a/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/icon.png and b/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/icon.png differ
diff --git a/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/meta.json b/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/meta.json
index c3bd5aeaa4..d7f967e739 100644
--- a/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/meta.json
+++ b/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC0-1.0",
- "copyright": "Created by EmoGarbage",
+ "copyright": "Created by EmoGarbage, icon & unshaded changed by lzk228",
"size": {
"x": 32,
"y": 32
@@ -14,11 +14,12 @@
"name": "icon"
},
{
- "name": "printing",
+ "name": "printing",
"delays": [[0.25, 0.25, 0.25, 0.25]]
},
{
- "name": "unshaded"
+ "name": "unshaded",
+ "delays": [[2, 1, 1, 1]]
}
]
}
diff --git a/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/unshaded.png b/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/unshaded.png
index bfb67b28f3..4788c7df1b 100644
Binary files a/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/unshaded.png and b/Resources/Textures/Structures/Machines/tech_disk_printer.rsi/unshaded.png differ