diff --git a/Content.Client/RCD/RCDConstructionGhostSystem.cs b/Content.Client/RCD/RCDConstructionGhostSystem.cs
index 792916b892..3959384396 100644
--- a/Content.Client/RCD/RCDConstructionGhostSystem.cs
+++ b/Content.Client/RCD/RCDConstructionGhostSystem.cs
@@ -56,7 +56,7 @@ public sealed class RCDConstructionGhostSystem : EntitySystem
}
// If the placer has not changed, exit
- _rcdSystem.UpdateCachedPrototype(heldEntity.Value, rcd);
+ _rcdSystem.UpdateCachedPrototype(rcd);
if (heldEntity == placerEntity && rcd.CachedPrototype.Prototype == placerProto)
return;
diff --git a/Content.Client/RCD/RCDMenu.xaml b/Content.Client/RCD/RCDMenu.xaml
index b3d5367a5f..3c201e404e 100644
--- a/Content.Client/RCD/RCDMenu.xaml
+++ b/Content.Client/RCD/RCDMenu.xaml
@@ -1,47 +1,19 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/Content.Client/RCD/RCDMenu.xaml.cs b/Content.Client/RCD/RCDMenu.xaml.cs
index 51ec66ea44..689c904384 100644
--- a/Content.Client/RCD/RCDMenu.xaml.cs
+++ b/Content.Client/RCD/RCDMenu.xaml.cs
@@ -1,3 +1,4 @@
+using System.Linq;
using Content.Client.UserInterface.Controls;
using Content.Shared.Popups;
using Content.Shared.RCD;
@@ -10,6 +11,10 @@ using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
using System.Numerics;
+using Robust.Client.Graphics;
+using Robust.Shared.Graphics.RSI;
+using Robust.Shared.Serialization.Manager.Exceptions;
+using Robust.Shared.Utility;
namespace Content.Client.RCD;
@@ -40,13 +45,12 @@ public sealed partial class RCDMenu : RadialMenu
// Find the main radial container
var main = FindControl("Main");
- if (main == null)
- return;
-
// Populate secondary radial containers
if (!_entManager.TryGetComponent(owner, out var rcd))
return;
+ SetupCategories(main, rcd); // WD
+
foreach (var protoId in rcd.AvailablePrototypes)
{
if (!_protoManager.TryIndex(protoId, out var proto))
@@ -55,12 +59,9 @@ public sealed partial class RCDMenu : RadialMenu
if (proto.Mode == RcdMode.Invalid)
continue;
- var parent = FindControl(proto.Category);
+ var parent = Children.First(c => c.Name == proto.Category.Id);
- if (parent == null)
- continue;
-
- var tooltip = Loc.GetString(proto.SetName);
+ var tooltip = Loc.GetString(proto.Name);
if ((proto.Mode == RcdMode.ConstructTile || proto.Mode == RcdMode.ConstructObject) &&
proto.Prototype != null && _protoManager.TryIndex(proto.Prototype, out var entProto))
@@ -80,17 +81,16 @@ public sealed partial class RCDMenu : RadialMenu
if (proto.Sprite != null)
{
- var tex = new TextureRect()
+ var tex = new TextureRect
{
VerticalAlignment = VAlignment.Center,
HorizontalAlignment = HAlignment.Center,
- Texture = _spriteSystem.Frame0(proto.Sprite),
+ Texture = GetSprite(proto.Sprite),
TextureScale = new Vector2(2f, 2f),
};
button.AddChild(tex);
}
-
parent.AddChild(button);
// Ensure that the button that transitions the menu to the associated category layer
@@ -119,6 +119,50 @@ public sealed partial class RCDMenu : RadialMenu
SendRCDSystemMessageAction += bui.SendRCDSystemMessage;
}
+ private void SetupCategories(RadialContainer main, RCDComponent rcd)
+ {
+ foreach (var categoryId in rcd.CategoryPrototypes)
+ {
+ if (!_protoManager.TryIndex(categoryId, out var category))
+ continue;
+
+ var button = new RadialMenuTextureButton
+ {
+ StyleClasses = { "RadialMenuButton" },
+ SetSize = new Vector2(64f, 64f),
+ ToolTip = Loc.GetString(category.TooltipBase + categoryId), // rcd-component- + WindowsAndGrilles = rcd-component-WindowsAndGrilles
+ TargetLayer = categoryId,
+ Visible = false,
+ };
+
+ var texture = new TextureRect
+ {
+ VerticalAlignment = VAlignment.Center,
+ HorizontalAlignment = HAlignment.Center,
+ TextureScale = new Vector2(2, 2),
+ Texture = GetSprite(category.SpritePath)
+ };
+
+ button.AddChild(texture);
+ main.AddChild(button);
+
+ var container = new RadialContainer
+ {
+ Name = categoryId,
+ VerticalExpand = true,
+ HorizontalExpand = true,
+ Radius = 64
+ };
+
+ AddChild(container);
+ }
+ }
+
+ private Texture GetSprite(SpriteSpecifier specifier)
+ {
+ return _spriteSystem.Frame0(specifier);
+ }
+
private void AddRCDMenuButtonOnClickActions(Control control)
{
var radialContainer = control as RadialContainer;
@@ -140,11 +184,11 @@ public sealed partial class RCDMenu : RadialMenu
if (_playerManager.LocalSession?.AttachedEntity != null &&
_protoManager.TryIndex(castChild.ProtoId, out var proto))
{
- var msg = Loc.GetString("rcd-component-change-mode", ("mode", Loc.GetString(proto.SetName)));
+ var msg = Loc.GetString("rcd-component-change-mode", ("mode", Loc.GetString(proto.Name)));
if (proto.Mode == RcdMode.ConstructTile || proto.Mode == RcdMode.ConstructObject)
{
- var name = Loc.GetString(proto.SetName);
+ var name = Loc.GetString(proto.Name);
if (proto.Prototype != null &&
_protoManager.TryIndex(proto.Prototype, out var entProto))
diff --git a/Content.Client/UserInterface/Controls/RadialContainer.cs b/Content.Client/UserInterface/Controls/RadialContainer.cs
index be263d1277..25a9a0dbb5 100644
--- a/Content.Client/UserInterface/Controls/RadialContainer.cs
+++ b/Content.Client/UserInterface/Controls/RadialContainer.cs
@@ -70,9 +70,15 @@ public class RadialContainer : LayoutContainer
protected override void Draw(DrawingHandleScreen handle)
{
+ const float baseRadius = 15f; // WD
+ const float radiusIncrement = 12f; // WD
+
var children = ReserveSpaceForHiddenChildren ? Children : Children.Where(x => x.Visible);
var childCount = children.Count();
+ // Add padding from the center at higher child counts so they don't overlap.
+ Radius = baseRadius + (childCount * radiusIncrement);
+
// Determine the size of the arc, accounting for clockwise and anti-clockwise arrangements
var arc = AngularRange.Y - AngularRange.X;
arc = (arc < 0) ? MathF.Tau + arc : arc;
diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs
index 8f5f8804f9..277f351a6f 100644
--- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs
+++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs
@@ -217,7 +217,6 @@ namespace Content.Server.GameTicking
var readyPlayers = new List();
var readyPlayerProfiles = new Dictionary();
- var autoDeAdmin = _cfg.GetCVar(CCVars.AdminDeadminOnJoin);
var stalinBunkerEnabled = _configurationManager.GetCVar(WhiteCVars.StalinEnabled);
foreach (var (userId, status) in _playerGameStatuses)
@@ -225,11 +224,17 @@ namespace Content.Server.GameTicking
if (LobbyEnabled && status != PlayerGameStatus.ReadyToPlay) continue;
if (!_playerManager.TryGetSessionById(userId, out var session)) continue;
+ #if FULL_RELEASE // dont deadmin me in debug
+
+ var autoDeAdmin = _cfg.GetCVar(CCVars.AdminDeadminOnJoin);
+
if (autoDeAdmin && _adminManager.IsAdmin(session))
{
_adminManager.DeAdmin(session);
}
+ #endif
+
if (stalinBunkerEnabled)
{
await _stalinManager.RefreshUsersData();
diff --git a/Content.Server/_White/Mood/MoodComponent.cs b/Content.Server/_White/Mood/MoodComponent.cs
index d5db126d9c..6836739799 100644
--- a/Content.Server/_White/Mood/MoodComponent.cs
+++ b/Content.Server/_White/Mood/MoodComponent.cs
@@ -8,13 +8,13 @@ namespace Content.Server._White.Mood;
[RegisterComponent]
public sealed partial class MoodComponent : Component
{
- [DataField("currentMoodLevel"), ViewVariables(VVAccess.ReadOnly)]
+ [DataField, ViewVariables(VVAccess.ReadOnly)]
public float CurrentMoodLevel;
- [DataField("currentMoodThreshold"), ViewVariables(VVAccess.ReadOnly)]
+ [DataField, ViewVariables(VVAccess.ReadOnly)]
public MoodThreshold CurrentMoodThreshold;
- [DataField("lastThreshold"), ViewVariables(VVAccess.ReadOnly)]
+ [DataField, ViewVariables(VVAccess.ReadOnly)]
public MoodThreshold LastThreshold;
[ViewVariables(VVAccess.ReadOnly)]
@@ -23,22 +23,22 @@ public sealed partial class MoodComponent : Component
[ViewVariables(VVAccess.ReadOnly)]
public readonly Dictionary UncategorisedEffects = new();
- [DataField("slowdownSpeedModifier"), ViewVariables(VVAccess.ReadWrite)]
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
public float SlowdownSpeedModifier = 0.75f;
- [DataField("increaseSpeedModifier"), ViewVariables(VVAccess.ReadWrite)]
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
public float IncreaseSpeedModifier = 1.15f;
- [DataField("increaseCritThreshold"), ViewVariables(VVAccess.ReadWrite)]
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
public float IncreaseCritThreshold = 1.2f;
- [DataField("decreaseCritThreshold"), ViewVariables(VVAccess.ReadWrite)]
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
public float DecreaseCritThreshold = 0.9f;
[ViewVariables(VVAccess.ReadOnly)]
public FixedPoint2 CritThresholdBeforeModify;
- [DataField("moodThresholds", customTypeSerializer: typeof(DictionarySerializer))]
+ [DataField(customTypeSerializer: typeof(DictionarySerializer))]
public Dictionary MoodThresholds = new()
{
{ MoodThreshold.VeryVeryGood, 10.0f },
@@ -53,7 +53,7 @@ public sealed partial class MoodComponent : Component
{ MoodThreshold.Dead, 0.0f }
};
- [DataField("moodThresholdsAlerts", customTypeSerializer: typeof(DictionarySerializer))]
+ [DataField(customTypeSerializer: typeof(DictionarySerializer))]
public Dictionary MoodThresholdsAlerts = new()
{
{ MoodThreshold.Dead, AlertType.MoodDead },
@@ -69,7 +69,7 @@ public sealed partial class MoodComponent : Component
{ MoodThreshold.Insane, AlertType.Insane }
};
- [DataField("moodChangeValues", customTypeSerializer: typeof(DictionarySerializer))]
+ [DataField(customTypeSerializer: typeof(DictionarySerializer))]
public Dictionary MoodChangeValues = new()
{
{ MoodChangeLevel.None , 0.0f },
@@ -80,7 +80,7 @@ public sealed partial class MoodComponent : Component
{ MoodChangeLevel.Large , 2f }
};
- [DataField("healthMoodEffectsThresholds", customTypeSerializer: typeof(DictionarySerializer))]
+ [DataField(customTypeSerializer: typeof(DictionarySerializer))]
public Dictionary HealthMoodEffectsThresholds = new()
{
{ "HealthHeavyDamage", 80f },
diff --git a/Content.Server/_White/Mood/MoodSystem.cs b/Content.Server/_White/Mood/MoodSystem.cs
index 1beab5742c..55124cdc75 100644
--- a/Content.Server/_White/Mood/MoodSystem.cs
+++ b/Content.Server/_White/Mood/MoodSystem.cs
@@ -108,8 +108,8 @@ public sealed class MoodSystem : EntitySystem
if (!component.MoodChangeValues.TryGetValue(oldPrototype.MoodChange, out var oldValue))
return;
- amount += (oldPrototype.PositiveEffect ? -oldValue : oldValue) +
- (prototype.PositiveEffect ? value : -value);
+ amount += (oldPrototype.Positive ? -oldValue : oldValue) +
+ (prototype.Positive ? value : -value);
component.CategorisedEffects[prototype.Category] = prototype.ID;
}
@@ -117,7 +117,7 @@ public sealed class MoodSystem : EntitySystem
else
{
component.CategorisedEffects.Add(prototype.Category, prototype.ID);
- amount += prototype.PositiveEffect ? value : -value;
+ amount += prototype.Positive ? value : -value;
}
if (prototype.Timeout != 0)
@@ -132,7 +132,7 @@ public sealed class MoodSystem : EntitySystem
if (component.UncategorisedEffects.TryGetValue(prototype.ID, out _))
return;
- var effectValue = prototype.PositiveEffect ? value : -value;
+ var effectValue = prototype.Positive ? value : -value;
component.UncategorisedEffects.Add(prototype.ID, effectValue);
amount += effectValue;
@@ -173,7 +173,7 @@ public sealed class MoodSystem : EntitySystem
if (!comp.MoodChangeValues.TryGetValue(currentProto.MoodChange, out var value))
return;
- amount += currentProto.PositiveEffect ? -value : value;
+ amount += currentProto.Positive ? -value : value;
comp.CategorisedEffects.Remove(category);
}
@@ -205,7 +205,7 @@ public sealed class MoodSystem : EntitySystem
if (!component.MoodChangeValues.TryGetValue(prototype.MoodChange, out var value))
return;
- amount += prototype.PositiveEffect ? value : -value;
+ amount += prototype.Positive ? value : -value;
}
foreach (var (_, value) in component.UncategorisedEffects)
@@ -438,7 +438,7 @@ public sealed partial class ShowMoodEffects : IAlertClick
{
var chatManager = IoCManager.Resolve();
- var color = proto.PositiveEffect ? "#008000" : "#BA0000";
+ var color = proto.Positive ? "#008000" : "#BA0000";
var msg = $"[font size=10][color={color}]{proto.Description}[/color][/font]";
chatManager.ChatMessageToOne(ChatChannel.Emotes, msg, msg, EntityUid.Invalid, false,
diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs
index e4a3ff0cfe..e80c083e60 100644
--- a/Content.Shared/CCVar/CCVars.cs
+++ b/Content.Shared/CCVar/CCVars.cs
@@ -838,7 +838,7 @@ namespace Content.Shared.CCVar
/// de-admin them.
///
public static readonly CVarDef AdminDeadminOnJoin =
- CVarDef.Create("admin.deadmin_on_join", false, CVar.SERVERONLY);
+ CVarDef.Create("admin.deadmin_on_join", true, CVar.SERVERONLY);
///
/// Overrides the name the client sees in ahelps. Set empty to disable.
@@ -851,7 +851,7 @@ namespace Content.Shared.CCVar
/// If 0, appearing as a new player is disabled.
///
public static readonly CVarDef NewPlayerThreshold =
- CVarDef.Create("admin.new_player_threshold", 0, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+ CVarDef.Create("admin.new_player_threshold", 4320, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
///
/// How long an admin client can go without any input before being considered AFK.
@@ -1346,7 +1346,7 @@ namespace Content.Shared.CCVar
///
/// Config for when the restart vote should be allowed to be called based on percentage of ghosts.
- ///
+ ///
public static readonly CVarDef VoteRestartGhostPercentage =
CVarDef.Create("vote.restart_ghost_percentage", 75, CVar.SERVERONLY);
@@ -1441,7 +1441,7 @@ namespace Content.Shared.CCVar
/// Whether the arrivals terminal should be on a planet map.
///
public static readonly CVarDef ArrivalsPlanet =
- CVarDef.Create("shuttle.arrivals_planet", true, CVar.SERVERONLY);
+ CVarDef.Create("shuttle.arrivals_planet", false, CVar.SERVERONLY);
///
/// Whether the arrivals shuttle is enabled.
@@ -1459,7 +1459,7 @@ namespace Content.Shared.CCVar
/// Cooldown between arrivals departures. This should be longer than the FTL time or it will double cycle.
///
public static readonly CVarDef ArrivalsCooldown =
- CVarDef.Create("shuttle.arrivals_cooldown", 50f, CVar.SERVERONLY);
+ CVarDef.Create("shuttle.arrivals_cooldown", 10f, CVar.SERVERONLY);
///
/// Are players allowed to return on the arrivals shuttle.
diff --git a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs
index cd47e5dbac..a31eb2b805 100644
--- a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs
+++ b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs
@@ -114,7 +114,7 @@ public sealed class HungerSystem : EntitySystem
return;
//WD start
- if (_net.IsServer)
+ if (_net.IsServer && component.CurrentThreshold != HungerThreshold.Overfed)
{
var ev = new MoodEffectEvent("Hunger" + component.CurrentThreshold);
RaiseLocalEvent(uid, ev);
diff --git a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs
index 36a8391000..d3ebec8b59 100644
--- a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs
+++ b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs
@@ -112,10 +112,13 @@ public sealed class ThirstSystem : EntitySystem
_alerts.ClearAlertCategory(uid, AlertCategory.Thirst);
}
- //WD start
- var ev = new MoodEffectEvent("Thirst" + component.CurrentThirstThreshold);
- RaiseLocalEvent(uid, ev);
- //WD end
+ // WD start
+ if (component.CurrentThirstThreshold != ThirstThreshold.OverHydrated)
+ {
+ var ev = new MoodEffectEvent("Thirst" + component.CurrentThirstThreshold);
+ RaiseLocalEvent(uid, ev);
+ }
+ // WD end
switch (component.CurrentThirstThreshold)
{
diff --git a/Content.Shared/RCD/Components/RCDAmmoComponent.cs b/Content.Shared/RCD/Components/RCDAmmoComponent.cs
index 4135b606e2..2f6ecfd0fd 100644
--- a/Content.Shared/RCD/Components/RCDAmmoComponent.cs
+++ b/Content.Shared/RCD/Components/RCDAmmoComponent.cs
@@ -13,4 +13,8 @@ public sealed partial class RCDAmmoComponent : Component
///
[DataField("charges"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public int Charges = 30;
+
+ [DataField] public bool CanBeExamined = true; // WD
+
+ [DataField] public float ChargeCountModifier = 1; // WD
}
diff --git a/Content.Shared/RCD/Components/RCDComponent.cs b/Content.Shared/RCD/Components/RCDComponent.cs
index 39bb6fd3e9..05e31dbd20 100644
--- a/Content.Shared/RCD/Components/RCDComponent.cs
+++ b/Content.Shared/RCD/Components/RCDComponent.cs
@@ -1,3 +1,4 @@
+using Content.Shared._White.RCD;
using Content.Shared.RCD.Systems;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
@@ -33,6 +34,12 @@ public sealed partial class RCDComponent : Component
[DataField, AutoNetworkedField]
public ProtoId ProtoId { get; set; } = "Invalid";
+ ///
+ /// The ProtoId of the currently selected RCD prototype
+ ///
+ [DataField(required: true), AutoNetworkedField]
+ public HashSet> CategoryPrototypes = default!;
+
///
/// A cached copy of currently selected RCD prototype
///
diff --git a/Content.Shared/RCD/RCDPrototype.cs b/Content.Shared/RCD/RCDPrototype.cs
index 1e80abfb72..e396dff109 100644
--- a/Content.Shared/RCD/RCDPrototype.cs
+++ b/Content.Shared/RCD/RCDPrototype.cs
@@ -1,3 +1,4 @@
+using Content.Shared._White.RCD;
using Content.Shared.Physics;
using Robust.Shared.Physics.Collision.Shapes;
using Robust.Shared.Prototypes;
@@ -23,14 +24,14 @@ public sealed class RCDPrototype : IPrototype
///
/// The name associated with the prototype
///
- [DataField("name"), ViewVariables(VVAccess.ReadOnly)]
- public string SetName { get; private set; } = "Unknown";
+ [DataField, ViewVariables(VVAccess.ReadOnly)]
+ public string Name { get; private set; } = "Unknown";
///
/// The name of the radial container that this prototype will be listed under on the RCD menu
///
[DataField, ViewVariables(VVAccess.ReadOnly)]
- public string Category { get; private set; } = "Undefined";
+ public ProtoId Category { get; private set; } = "WallsAndFlooring"; // WD
///
/// Texture path for this prototypes menu icon
@@ -42,7 +43,7 @@ public sealed class RCDPrototype : IPrototype
/// The entity prototype that will be constructed (mode dependent)
///
[DataField, ViewVariables(VVAccess.ReadOnly)]
- public string? Prototype { get; private set; } = string.Empty;
+ public ProtoId? Prototype { get; private set; } = null;
///
/// Number of charges consumed when the operation is completed
@@ -51,7 +52,7 @@ public sealed class RCDPrototype : IPrototype
public int Cost { get; private set; } = 1;
///
- /// The length of the operation
+ /// The length of the operation
///
[DataField, ViewVariables(VVAccess.ReadOnly)]
public float Delay { get; private set; } = 1f;
@@ -75,7 +76,7 @@ public sealed class RCDPrototype : IPrototype
public CollisionGroup CollisionMask { get; private set; } = CollisionGroup.None;
///
- /// Specifies a set of custom collision bounds for determining whether the entity prototype will fit into a target tile
+ /// Specifies a set of custom collision bounds for determining whether the entity prototype will fit into a target tile
///
///
/// Should be set assuming that the entity faces south.
@@ -106,7 +107,7 @@ public sealed class RCDPrototype : IPrototype
private Box2? _collisionBounds = null;
///
- /// The polygon shape associated with the prototype CollisionBounds (if set)
+ /// The polygon shape associated with the prototype CollisionBounds (if set)
///
[ViewVariables(VVAccess.ReadOnly)]
public PolygonShape? CollisionPolygon { get; private set; } = null;
diff --git a/Content.Shared/RCD/Systems/RCDAmmoSystem.cs b/Content.Shared/RCD/Systems/RCDAmmoSystem.cs
index 9cb3c26485..d814a6543d 100644
--- a/Content.Shared/RCD/Systems/RCDAmmoSystem.cs
+++ b/Content.Shared/RCD/Systems/RCDAmmoSystem.cs
@@ -4,6 +4,7 @@ using Content.Shared.Examine;
using Content.Shared.Interaction;
using Content.Shared.Popups;
using Content.Shared.RCD.Components;
+using Content.Shared.Stacks;
using Robust.Shared.Timing;
namespace Content.Shared.RCD.Systems;
@@ -13,20 +14,37 @@ public sealed class RCDAmmoSystem : EntitySystem
[Dependency] private readonly SharedChargesSystem _charges = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly SharedStackSystem _stack = default!;
public override void Initialize()
{
base.Initialize();
+ SubscribeLocalEvent(OnInit); // WD edit
+
SubscribeLocalEvent(OnExamine);
SubscribeLocalEvent(OnAfterInteract);
}
+ // WD edit start
+ private void OnInit(EntityUid uid, RCDAmmoComponent rcdAmmoComponent, ComponentInit _)
+ {
+ if (TryComp(uid, out var stackComponent))
+ rcdAmmoComponent.Charges = (int) (stackComponent.Count * rcdAmmoComponent.ChargeCountModifier);
+ else
+ rcdAmmoComponent.Charges = (int) (rcdAmmoComponent.Charges * rcdAmmoComponent.ChargeCountModifier);
+
+ }
+ // WD edit end
+
private void OnExamine(EntityUid uid, RCDAmmoComponent comp, ExaminedEvent args)
{
if (!args.IsInDetailsRange)
return;
+ if (!comp.CanBeExamined) // WD edit
+ return;
+
var examineMessage = Loc.GetString("rcd-ammo-component-on-examine", ("charges", comp.Charges));
args.PushText(examineMessage);
}
@@ -51,6 +69,15 @@ public sealed class RCDAmmoSystem : EntitySystem
}
_popup.PopupClient(Loc.GetString("rcd-ammo-component-after-interact-refilled"), target, user);
+
+ // WD edit start
+ if (TryComp(uid, out var stackComponent))
+ {
+ var spent = (int) (count / comp.ChargeCountModifier) == 0 ? 1 : (int) (count / comp.ChargeCountModifier);
+ _stack.SetCount(uid, stackComponent.Count - spent);
+ }
+ // WD edit end
+
_charges.AddCharges(target, count, charges);
comp.Charges -= count;
Dirty(uid, comp);
diff --git a/Content.Shared/RCD/Systems/RCDSystem.cs b/Content.Shared/RCD/Systems/RCDSystem.cs
index 974755f000..df1290d100 100644
--- a/Content.Shared/RCD/Systems/RCDSystem.cs
+++ b/Content.Shared/RCD/Systems/RCDSystem.cs
@@ -25,6 +25,7 @@ using Robust.Shared.Serialization;
using Robust.Shared.Timing;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
+using Content.Shared._White.ClothingGrant.Systems;
namespace Content.Shared.RCD.Systems;
@@ -75,7 +76,7 @@ public class RCDSystem : EntitySystem
if (component.AvailablePrototypes.Any())
{
component.ProtoId = component.AvailablePrototypes.First();
- UpdateCachedPrototype(uid, component);
+ UpdateCachedPrototype(component);
Dirty(uid, component);
return;
@@ -96,7 +97,7 @@ public class RCDSystem : EntitySystem
// Set the current RCD prototype to the one supplied
component.ProtoId = args.ProtoId;
- UpdateCachedPrototype(uid, component);
+ UpdateCachedPrototype(component);
Dirty(uid, component);
}
@@ -106,13 +107,14 @@ public class RCDSystem : EntitySystem
return;
// Update cached prototype if required
- UpdateCachedPrototype(uid, component);
+ UpdateCachedPrototype(component);
- var msg = Loc.GetString("rcd-component-examine-mode-details", ("mode", Loc.GetString(component.CachedPrototype.SetName)));
+ var msg = Loc.GetString("rcd-component-examine-mode-details", ("mode", Loc.GetString(component.CachedPrototype.Name)));
- if (component.CachedPrototype.Mode == RcdMode.ConstructTile || component.CachedPrototype.Mode == RcdMode.ConstructObject)
+ var mode = component.CachedPrototype.Mode;
+ if (mode == RcdMode.ConstructTile || mode == RcdMode.ConstructObject)
{
- var name = Loc.GetString(component.CachedPrototype.SetName);
+ var name = Loc.GetString(component.CachedPrototype.Name);
if (component.CachedPrototype.Prototype != null &&
_protoManager.TryIndex(component.CachedPrototype.Prototype, out var proto))
@@ -225,7 +227,7 @@ public class RCDSystem : EntitySystem
private void OnDoAfterAttempt(EntityUid uid, RCDComponent component, DoAfterAttemptEvent args)
{
- if (args.Event?.DoAfter?.Args == null)
+ if (args.Event?.DoAfter?.Args == null) // wtf if this
return;
// Exit if the RCD prototype has changed
@@ -302,7 +304,7 @@ public class RCDSystem : EntitySystem
public bool IsRCDOperationStillValid(EntityUid uid, RCDComponent component, MapGridData mapGridData, EntityUid? target, EntityUid user, bool popMsgs = true)
{
// Update cached prototype if required
- UpdateCachedPrototype(uid, component);
+ UpdateCachedPrototype(component);
// Check that the RCD has enough ammo to get the job done
TryComp(uid, out var charges);
@@ -589,7 +591,7 @@ public class RCDSystem : EntitySystem
return boundingPolygon.ComputeAABB(boundingTransform, 0).Intersects(fixture.Shape.ComputeAABB(entXform, 0));
}
- public void UpdateCachedPrototype(EntityUid uid, RCDComponent component)
+ public void UpdateCachedPrototype(RCDComponent component)
{
if (component.ProtoId.Id != component.CachedPrototype?.Prototype)
component.CachedPrototype = _protoManager.Index(component.ProtoId);
diff --git a/Content.Shared/_White/ClothingGrant/Systems/ClothingGrantingSystem.cs b/Content.Shared/_White/ClothingGrant/Systems/ClothingGrantingSystem.cs
index bd67e508e6..d3c669c017 100644
--- a/Content.Shared/_White/ClothingGrant/Systems/ClothingGrantingSystem.cs
+++ b/Content.Shared/_White/ClothingGrant/Systems/ClothingGrantingSystem.cs
@@ -3,6 +3,7 @@ using Content.Shared.Inventory.Events;
using Robust.Shared.Serialization.Manager;
using Content.Shared.Tag;
using Content.Shared._White.ClothingGrant.Components;
+using Robust.Shared.Prototypes;
using Robust.Shared.Timing;
namespace Content.Shared._White.ClothingGrant.Systems;
@@ -40,24 +41,29 @@ public sealed class ClothingGrantingSystem : EntitySystem
return;
}
- foreach (var (name, data) in component.Components)
- {
- var newComp = (Component) _componentFactory.GetComponent(name);
-
- if (HasComp(args.Equipee, newComp.GetType()))
- continue;
-
- newComp.Owner = args.Equipee;
-
- var temp = (object) newComp;
- _serializationManager.CopyTo(data.Component, ref temp);
- EntityManager.AddComponent(args.Equipee, (Component)temp!);
- }
+ AddComponents(args.Equipee, component.Components);
component.IsActive = true;
Dirty(uid, component);
}
+ public void AddComponents(EntityUid uid, ComponentRegistry components)
+ {
+ foreach (var (name, data) in components)
+ {
+ var newComp = (Component) _componentFactory.GetComponent(name);
+
+ if (HasComp(uid, newComp.GetType()))
+ continue;
+
+ newComp.Owner = uid;
+
+ var temp = (object) newComp;
+ _serializationManager.CopyTo(data.Component, ref temp);
+ EntityManager.AddComponent(uid, (Component)temp!);
+ }
+ }
+
private void OnCompUnequip(EntityUid uid, ClothingGrantComponentComponent component, GotUnequippedEvent args)
{
if (!component.IsActive) return;
diff --git a/Content.Shared/_White/Mood/MoodEffectPrototype.cs b/Content.Shared/_White/Mood/MoodEffectPrototype.cs
index 03a005f188..0f1e57eafe 100644
--- a/Content.Shared/_White/Mood/MoodEffectPrototype.cs
+++ b/Content.Shared/_White/Mood/MoodEffectPrototype.cs
@@ -3,29 +3,25 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations;
namespace Content.Shared._White.Mood;
-[Prototype("moodEffect")]
+[Prototype]
public sealed class MoodEffectPrototype : IPrototype
{
[ViewVariables]
[IdDataField]
public string ID { get; } = default!;
- [DataField("desc", required: true)]
+ [DataField(required: true)]
public string Description = string.Empty;
- [DataField("moodChange", customTypeSerializer: typeof(EnumSerializer), required: true)]
+ [DataField(customTypeSerializer: typeof(EnumSerializer), required: true)]
public Enum MoodChange = default!;
- [DataField("positiveEffect", required: true)]
- public bool PositiveEffect;
+ [DataField] public bool Positive;
- [DataField("timeout")]
- public int Timeout;
+ [DataField] public int Timeout;
- [DataField("hidden")]
- public bool Hidden;
+ [DataField] public bool Hidden;
- //If mob already has effect of the same category, the new one will replace the old one.
- [DataField("category")]
- public string? Category;
+ // If mob already has effect of the same category, the new one will replace the old one.
+ [DataField] public string? Category;
}
diff --git a/Content.Shared/_White/RCD/RCDCategoryPrototype.cs b/Content.Shared/_White/RCD/RCDCategoryPrototype.cs
new file mode 100644
index 0000000000..61ef3d54e2
--- /dev/null
+++ b/Content.Shared/_White/RCD/RCDCategoryPrototype.cs
@@ -0,0 +1,17 @@
+using Robust.Shared.Prototypes;
+using Robust.Shared.Utility;
+
+namespace Content.Shared._White.RCD;
+
+[Prototype("rcdCategory")]
+public sealed class RCDCategoryPrototype : IPrototype
+{
+ [IdDataField]
+ public string ID { get; private set; } = default!;
+
+ [DataField]
+ public string TooltipBase = "rcd-category-";
+
+ [DataField(required: true)]
+ public SpriteSpecifier SpritePath = default!;
+}
diff --git a/Resources/Locale/ru-RU/rcd/components/rcd-component.ftl b/Resources/Locale/ru-RU/rcd/components/rcd-component.ftl
index f15eae7e85..b5cdb6ec78 100644
--- a/Resources/Locale/ru-RU/rcd/components/rcd-component.ftl
+++ b/Resources/Locale/ru-RU/rcd/components/rcd-component.ftl
@@ -1,30 +1,59 @@
-### UI
+# WD EDIT ALL
-# Shown when an RCD is examined in details range
-rcd-component-examine-detail = В данный момент выбран режим { $mode }.
-# Shown when an RCD is examined in details range
-rcd-component-examine-detail-count =
- Находится в режиме { $mode ->
- *[other] _
- [floors] полы
- [walls] стены
- [airlock] шлюзы
- [deconstruct] разбор
- }, и { $ammoCount ->
- *[zero] не содержит зарядов.
- [one] содержит 1 заряд.
- [few] содержит { $ammoCount } заряда.
- [other] содержит { $ammoCount } зарядов.
- }
+# UI
-### Interaction Messages
+rcd-component-examine-mode-details = Текущий режим: '{$mode}'.
+rcd-component-examine-build-details = Текущий режим строительства: {$name}.
-# Shown when changing RCD Mode
-rcd-component-change-mode = РЦД переключён в режим { $mode }.
+
+## Interaction Messages
+
+# Mode change
+rcd-component-change-mode = РЦД переключён в режим '{$mode}'.
+rcd-component-change-build-mode = РЦД переключён в режим строительства {$name}.
+
+# Ammo count
rcd-component-no-ammo-message = В РЦД закончились заряды!
-rcd-component-tile-indestructible-message = Эта плитка не может быть уничтожена!
-rcd-component-tile-obstructed-message = Этот тайл заблокирован!
-rcd-component-deconstruct-target-not-on-whitelist-message = Вы не можете это деконструировать!
-rcd-component-cannot-build-floor-tile-not-empty-message = Пол можно построить только в космосе или на покрытии!
-rcd-component-cannot-build-wall-tile-not-empty-message = Вы не можете построить стену в космосе!
-rcd-component-cannot-build-airlock-tile-not-empty-message = Вы не можете построить шлюз в космосе!
+rcd-component-insufficient-ammo-message = В РЦД недостаточно зарядов!
+
+# Deconstruction
+rcd-component-tile-indestructible-message = Эта плитка неразрушима!
+rcd-component-deconstruct-target-not-on-whitelist-message = Вы не можете это демонтировать!
+rcd-component-nothing-to-deconstruct-message = Здесь нечего демонтировать!
+rcd-component-tile-obstructed-message = Вы не можете демонтировать плитку, если на ней что-то есть!
+
+# Construction
+rcd-component-no-valid-grid = Вы слишком далеко в открытом космосе, чтобы строить здесь!
+rcd-component-must-build-on-empty-tile-message = Здесь уже есть фундамент!
+rcd-component-cannot-build-on-empty-tile-message = Вы не можете строить это без фундамента!
+rcd-component-must-build-on-subfloor-message = Вы можете строить это только на открытом полу!
+rcd-component-cannot-build-on-subfloor-message = Вы не можете строить это на открытом полу!
+rcd-component-cannot-build-on-occupied-tile-message = Вы не можете строить здесь, это место уже занято!
+rcd-component-cannot-build-identical-tile = Эта плитка уже существует!
+
+
+### Category names
+
+# RCD
+rcd-category-WallsAndFlooring = Стены и пол
+rcd-category-WindowsAndGrilles = Окна и решётки
+rcd-category-Airlocks = Шлюзы
+rcd-category-Electrical = Электрика
+rcd-category-Lighting = Освещение
+
+# RPD
+rcd-category-Pipes = Трубы
+rcd-category-GasDevices = Атмосферные приборы
+rcd-category-DisposalPipes = Мусорные трубы
+rcd-category-DisposalUnits = Мусорные приборы
+
+### Prototype names (note: constructable items will be puralized)
+
+rcd-component-deconstruct = демонтаж
+rcd-component-floor-steel = стальная плитка
+rcd-component-plating = лист обшивки
+
+# RPD naming
+
+ent-RapidPipeDispenser = РПД
+ .desc = Новейшее ручное строительное устройство, которое может быстро размещать трубы и атмосферные приборы.
diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml
index b0f918a508..da190df84a 100644
--- a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml
+++ b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml
@@ -92,6 +92,7 @@
- id: ClothingEyesGlassesMeson
- id: ClothingShoesBootsMag
- id: ClothingHandsGlovesColorYellow
+ - id: RapidPipeDispenser # WD
- type: entity
id: LockerAtmosphericsFilled
@@ -111,6 +112,7 @@
- id: ClothingEyesGlassesMeson
- id: ClothingShoesBootsMag
- id: ClothingHandsGlovesColorYellow
+ - id: RapidPipeDispenser # WD
- type: entity
id: LockerEngineerFilledHardsuit
diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml
index 876150fe6f..7ff1f531a1 100644
--- a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml
+++ b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml
@@ -152,6 +152,7 @@
- id: ClothingOuterHardsuitEngineeringWhite
- id: ClothingMaskBreath
- id: OxygenTankFilled
+ - id: RapidPipeDispenser # WD
- type: entity
id: LockerChiefEngineerFilled
@@ -169,6 +170,7 @@
- id: RCDAmmo
amount: 2
- id: HolofanProjector
+ - id: RapidPipeDispenser # WD
- type: entity
id: LockerChiefMedicalOfficerFilledHardsuit
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml
index a90485b074..fc102d0765 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml
@@ -12,6 +12,5 @@
GeigerCounter: 3
InflatableWallStack1: 24
InflatableDoorStack1: 8
- emaggedInventory:
- RCD: 1
- RCDAmmo: 3
+ RCD: 3 # WD
+ RCDAmmo: 3 # WD
diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml
index 1bc4e1b0d7..efe5a9edb8 100644
--- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml
+++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml
@@ -86,6 +86,8 @@
reagents:
- ReagentId: Silicon
Quantity: 10
+ - type: RCDAmmo # WD
+ canBeExamined: false
- type: entity
parent: SheetGlass
@@ -172,6 +174,9 @@
max: 1
- !type:DoActsBehavior
acts: [ "Destruction" ]
+ - type: RCDAmmo # WD
+ canBeExamined: false
+ chargeCountModifier: 2
- type: entity
parent: SheetRGlass
@@ -249,6 +254,9 @@
max: 1
- !type:DoActsBehavior
acts: [ "Destruction" ]
+ - type: RCDAmmo # WD
+ canBeExamined: false
+ chargeCountModifier: 2
- type: entity
parent: SheetPGlass
@@ -315,6 +323,9 @@
- ReagentId: Carbon
Quantity: 0.5
canReact: false
+ - type: RCDAmmo # WD
+ canBeExamined: false
+ chargeCountModifier: 3
- type: entity
parent: SheetRPGlass
diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml
index 3a7b35f1cf..66cb2a76a3 100644
--- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml
+++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml
@@ -70,6 +70,8 @@
Quantity: 9
- ReagentId: Carbon
Quantity: 1
+ - type: RCDAmmo # WD
+ canBeExamined: false
- type: entity
parent: SheetSteel
@@ -206,6 +208,9 @@
- ReagentId: Carbon
Quantity: 1
canReact: false
+ - type: RCDAmmo # WD
+ canBeExamined: false
+ chargeCountModifier: 2
- type: entity
parent: SheetPlasteel
diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml
index 18590e98df..0f8aedfb36 100644
--- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml
+++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml
@@ -164,6 +164,9 @@
- ReagentId: Phosphorus
Quantity: 5
canReact: false
+ - type: RCDAmmo # WD
+ canBeExamined: false
+ chargeCountModifier: 0.5
- type: entity
parent: SheetPlastic
diff --git a/Resources/Prototypes/Entities/Objects/Materials/parts.yml b/Resources/Prototypes/Entities/Objects/Materials/parts.yml
index 652ddcd917..ca4d300efd 100644
--- a/Resources/Prototypes/Entities/Objects/Materials/parts.yml
+++ b/Resources/Prototypes/Entities/Objects/Materials/parts.yml
@@ -74,6 +74,9 @@
Quantity: 4.5
- ReagentId: Carbon
Quantity: 0.5
+ - type: RCDAmmo # WD
+ canBeExamined: false
+ chargeCountModifier: 0.5
- type: entity
parent: PartRodMetal
diff --git a/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml b/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml
index 17d1794c17..f7d39f19fd 100644
--- a/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml
+++ b/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml
@@ -27,6 +27,9 @@
price: 0
- type: StackPrice
price: 1
+ - type: RCDAmmo # WD
+ canBeExamined: false
+ chargeCountModifier: 0.2
- type: entity
id: CableHVStack
diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml
index 3d8754d226..640a5e435e 100644
--- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml
+++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml
@@ -395,32 +395,11 @@
path: "/Audio/Items/drill_hit.ogg"
- type: entity
- id: RCD
+ id: BaseRCD
parent: BaseItem
name: RCD
description: The rapid construction device can be used to quickly place and remove various station structures and fixtures. Requires compressed matter to function.
components:
- - type: RCD
- availablePrototypes:
- - WallSolid
- - FloorSteel
- - Plating
- - Catwalk
- - Grille
- - Window
- - WindowDirectional
- - WindowReinforcedDirectional
- - ReinforcedWindow
- - Airlock
- - AirlockGlass
- - Firelock
- - TubeLight
- - BulbLight
- - LVCable
- - MVCable
- - HVCable
- - CableTerminal
- - Deconstruct
- type: LimitedCharges
maxCharges: 30
charges: 30
@@ -449,13 +428,18 @@
key: enum.RcdUiKey.Key
- type: entity
- id: RCDEmpty
- parent: RCD
- suffix: Empty
+ id: RCD
+ parent: BaseRCD
+ name: RCD
+ description: The rapid construction device can be used to quickly place and remove various station structures and fixtures. Requires compressed matter to function.
components:
- - type: LimitedCharges
- charges: 0
- type: RCD
+ categoryPrototypes: # WD
+ - WallsAndFlooring # WD
+ - WindowsAndGrilles # WD
+ - Airlocks # WD
+ - Electrical # WD
+ - Lighting # WD
availablePrototypes:
- WallSolid
- FloorSteel
@@ -469,6 +453,76 @@
- Airlock
- AirlockGlass
- Firelock
+ - TubeLight
+ - BulbLight
+ - LVCable
+ - MVCable
+ - HVCable
+ - CableTerminal
+ - APC # WD
+ - Camera # WD
+ - Deconstruct
+
+- type: entity
+ id: RCDEmpty
+ parent: RCD
+ suffix: Empty
+ components:
+ - type: LimitedCharges
+ charges: 0
+
+- type: entity # WD
+ id: RapidPipeDispenser
+ parent: BaseRCD
+ components:
+ - type: Sprite
+ sprite: White/Items/Tools/rpd.rsi
+ - type: Item
+ size: Normal
+ shape:
+ - 0, 0, 1, 0
+ - type: Clothing
+ sprite: White/Items/Tools/rpd.rsi
+ quickEquip: false
+ slots:
+ - Belt
+ - type: RCD
+ categoryPrototypes:
+ - Pipes
+ - GasDevices
+ - DisposalPipes
+ - DisposalUnits
+ availablePrototypes:
+ - PipeStraight # pipes
+ - PipeBend
+ - PipeTJunction
+ - PipeFourway
+ - GasCanisterPort # gas devices
+ - GasFilter
+ - GasMixer
+ - GasOutletInjector
+ - GasPressurePump
+ - GasVolumePump
+ - GasValve
+ - SignalControlledValve
+ - PressureControlledValve
+ - GasVentScrubber
+ - GasVentPump
+ - GasPassiveVent
+ - DisposalPipe # disposal pipes
+ - DisposalBend
+ - DisposalJunction
+ - DisposalJunctionFlipped
+ - DisposalYJunction
+ - DisposalRouter
+ - DisposalRouterFlipped
+ - DisposalTagger
+ - DisposalSignalRouter
+ - DisposalSignalRouterFlipped
+ - DisposalTrunk
+ - DisposalUnit # disposal units
+ - MailingUnit
+ - ToiletEmpty
- type: entity
id: RCDRecharging
@@ -500,6 +554,7 @@
description: A cartridge of raw matter compacted by bluespace technology. Used in rapid construction devices.
components:
- type: RCDAmmo
+ chargeCountModifier: 1.5
- type: Sprite
sprite: Objects/Tools/rcd.rsi
state: ammo
diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
index 884e351494..93c05506a8 100644
--- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
+++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
@@ -348,6 +348,8 @@
- KitchenKnife # WD EDIT
- ButchCleaver # WD EDIT
- WeaponTempGun # WD EDIT
+ - RapidPipeDispenserRecipe # WD edit
+ - RCDRecipe # WD edit
- DeviceQuantumSpinInverter
- type: EmagLatheRecipes
emagDynamicRecipes:
diff --git a/Resources/Prototypes/RCD/rcd.yml b/Resources/Prototypes/RCD/rcd.yml
index 500b5f59bf..1101233cb6 100644
--- a/Resources/Prototypes/RCD/rcd.yml
+++ b/Resources/Prototypes/RCD/rcd.yml
@@ -2,7 +2,7 @@
- type: rcd
id: Invalid # Hidden prototype - do not add to RCDs
mode: Invalid
-
+
- type: rcd
id: Deconstruct
name: rcd-component-deconstruct
@@ -13,14 +13,14 @@
rotation: Camera
- type: rcd
- id: DeconstructLattice # Hidden prototype - do not add to RCDs
+ id: DeconstructLattice # Hidden prototype - do not add to RCDs
name: rcd-component-deconstruct
mode: Deconstruct
cost: 2
delay: 0
rotation: Camera
fx: EffectRCDConstruct0
-
+
- type: rcd
id: DeconstructTile # Hidden prototype - do not add to RCDs
name: rcd-component-deconstruct
@@ -30,7 +30,7 @@
rotation: Camera
fx: EffectRCDDeconstruct4
-# Flooring
+# Flooring
- type: rcd
id: Plating
name: rcd-component-plating
@@ -39,12 +39,12 @@
mode: ConstructTile
prototype: Plating
cost: 1
- delay: 1
+ delay: 0
collisionMask: InteractImpassable
rules:
- CanBuildOnEmptyTile
- fx: EffectRCDConstruct1
-
+ fx: EffectRCDConstruct0
+
- type: rcd
id: FloorSteel
name: rcd-component-floor-steel
@@ -53,11 +53,11 @@
mode: ConstructTile
prototype: FloorSteel
cost: 1
- delay: 1
+ delay: 0
collisionMask: InteractImpassable
rules:
- CanBuildOnEmptyTile
- fx: EffectRCDConstruct1
+ fx: EffectRCDConstruct0
- type: rcd
id: Catwalk
@@ -66,13 +66,13 @@
mode: ConstructObject
prototype: Catwalk
cost: 1
- delay: 1
+ delay: 0
collisionMask: InteractImpassable
rules:
- MustBuildOnSubfloor
- IsCatwalk
rotation: Fixed
- fx: EffectRCDConstruct1
+ fx: EffectRCDConstruct0
# Walls
- type: rcd
@@ -80,7 +80,7 @@
category: WallsAndFlooring
sprite: /Textures/Interface/Radial/RCD/solid_wall.png
mode: ConstructObject
- prototype: WallSolid
+ prototype: WallSolid
cost: 4
delay: 2
collisionMask: FullTileMask
@@ -93,11 +93,11 @@
sprite: /Textures/Interface/Radial/RCD/grille.png
mode: ConstructObject
prototype: Grille
- cost: 4
- delay: 2
+ cost: 1
+ delay: 1
collisionMask: FullTileMask
rotation: Fixed
- fx: EffectRCDConstruct2
+ fx: EffectRCDConstruct1
# Windows
- type: rcd
@@ -106,20 +106,49 @@
sprite: /Textures/Interface/Radial/RCD/window.png
mode: ConstructObject
prototype: Window
- cost: 3
- delay: 2
+ cost: 2
+ delay: 1
collisionMask: FullTileMask
rules:
- IsWindow
rotation: Fixed
- fx: EffectRCDConstruct2
-
+ fx: EffectRCDConstruct1
+
- type: rcd
id: WindowDirectional
category: WindowsAndGrilles
sprite: /Textures/Interface/Radial/RCD/directional.png
mode: ConstructObject
prototype: WindowDirectional
+ cost: 1
+ delay: 1
+ collisionMask: FullTileMask
+ collisionBounds: "-0.23,-0.49,0.23,-0.36"
+ rules:
+ - IsWindow
+ rotation: User
+ fx: EffectRCDConstruct1
+
+- type: rcd
+ id: ReinforcedWindow
+ category: WindowsAndGrilles
+ sprite: /Textures/Interface/Radial/RCD/window_reinforced.png
+ mode: ConstructObject
+ prototype: ReinforcedWindow
+ cost: 4
+ delay: 2
+ collisionMask: FullTileMask
+ rules:
+ - IsWindow
+ rotation: User
+ fx: EffectRCDConstruct2
+
+- type: rcd
+ id: WindowReinforcedDirectional
+ category: WindowsAndGrilles
+ sprite: /Textures/Interface/Radial/RCD/directional_reinforced.png
+ mode: ConstructObject
+ prototype: WindowReinforcedDirectional
cost: 2
delay: 1
collisionMask: FullTileMask
@@ -128,35 +157,6 @@
- IsWindow
rotation: User
fx: EffectRCDConstruct1
-
-- type: rcd
- id: ReinforcedWindow
- category: WindowsAndGrilles
- sprite: /Textures/Interface/Radial/RCD/window_reinforced.png
- mode: ConstructObject
- prototype: ReinforcedWindow
- cost: 4
- delay: 3
- collisionMask: FullTileMask
- rules:
- - IsWindow
- rotation: User
- fx: EffectRCDConstruct3
-
-- type: rcd
- id: WindowReinforcedDirectional
- category: WindowsAndGrilles
- sprite: /Textures/Interface/Radial/RCD/directional_reinforced.png
- mode: ConstructObject
- prototype: WindowReinforcedDirectional
- cost: 3
- delay: 2
- collisionMask: FullTileMask
- collisionBounds: "-0.23,-0.49,0.23,-0.36"
- rules:
- - IsWindow
- rotation: User
- fx: EffectRCDConstruct2
# Airlocks
- type: rcd
@@ -166,11 +166,11 @@
mode: ConstructObject
prototype: Airlock
cost: 4
- delay: 4
+ delay: 3
collisionMask: FullTileMask
rotation: Camera
- fx: EffectRCDConstruct4
-
+ fx: EffectRCDConstruct3
+
- type: rcd
id: AirlockGlass
category: Airlocks
@@ -178,22 +178,22 @@
mode: ConstructObject
prototype: AirlockGlass
cost: 4
- delay: 4
+ delay: 3
collisionMask: FullTileMask
rotation: Camera
- fx: EffectRCDConstruct4
-
+ fx: EffectRCDConstruct3
+
- type: rcd
id: Firelock
category: Airlocks
sprite: /Textures/Interface/Radial/RCD/firelock.png
mode: ConstructObject
prototype: Firelock
- cost: 4
- delay: 3
+ cost: 2
+ delay: 2
collisionMask: FullTileMask
rotation: Camera
- fx: EffectRCDConstruct3
+ fx: EffectRCDConstruct2
# Lighting
- type: rcd
@@ -202,25 +202,25 @@
sprite: /Textures/Interface/Radial/RCD/tube_light.png
mode: ConstructObject
prototype: Poweredlight
- cost: 2
- delay: 1
+ cost: 1
+ delay: 0
collisionMask: TabletopMachineMask
collisionBounds: "-0.23,-0.49,0.23,-0.36"
rotation: User
- fx: EffectRCDConstruct1
-
+ fx: EffectRCDConstruct0
+
- type: rcd
id: BulbLight
category: Lighting
sprite: /Textures/Interface/Radial/RCD/bulb_light.png
mode: ConstructObject
prototype: PoweredSmallLight
- cost: 2
- delay: 1
+ cost: 1
+ delay: 0
collisionMask: TabletopMachineMask
collisionBounds: "-0.23,-0.49,0.23,-0.36"
rotation: User
- fx: EffectRCDConstruct1
+ fx: EffectRCDConstruct0
# Electrical
- type: rcd
@@ -236,7 +236,7 @@
- MustBuildOnSubfloor
rotation: Fixed
fx: EffectRCDConstruct0
-
+
- type: rcd
id: MVCable
category: Electrical
@@ -250,7 +250,7 @@
- MustBuildOnSubfloor
rotation: Fixed
fx: EffectRCDConstruct0
-
+
- type: rcd
id: HVCable
category: Electrical
@@ -264,7 +264,7 @@
- MustBuildOnSubfloor
rotation: Fixed
fx: EffectRCDConstruct0
-
+
- type: rcd
id: CableTerminal
category: Electrical
@@ -277,4 +277,29 @@
rules:
- MustBuildOnSubfloor
rotation: User
- fx: EffectRCDConstruct0
\ No newline at end of file
+ fx: EffectRCDConstruct0
+
+- type: rcd # WD
+ id: APC
+ category: Electrical
+ sprite: /Textures/Structures/Power/apc.rsi/static.png
+ mode: ConstructObject
+ prototype: APCConstructed
+ cost: 4
+ delay: 1
+ collisionMask: None
+ rotation: User
+ fx: EffectRCDConstruct1
+
+- type: rcd # WD
+ id: Camera
+ category: Electrical
+ sprite: /Textures/Structures/Wallmounts/camera.rsi/cameracase.png
+ mode: ConstructObject
+ prototype: SurveillanceCameraConstructed
+ cost: 1
+ delay: 1
+ collisionMask: TabletopMachineMask
+ collisionBounds: "-0.23,-0.49,0.23,-0.36"
+ rotation: User
+ fx: EffectRCDConstruct1
diff --git a/Resources/Prototypes/Research/industrial.yml b/Resources/Prototypes/Research/industrial.yml
index ccc6e9c0f4..f4acd916c0 100644
--- a/Resources/Prototypes/Research/industrial.yml
+++ b/Resources/Prototypes/Research/industrial.yml
@@ -54,6 +54,7 @@
- AutolatheHyperConvectionMachineCircuitboard
- ProtolatheHyperConvectionMachineCircuitboard
- SheetifierMachineCircuitboard
+ - RCDRecipe # WD
- type: technology
id: PowerGeneration
@@ -85,6 +86,7 @@
recipeUnlocks:
- ThermomachineFreezerMachineCircuitBoard
- GasRecyclerMachineCircuitboard
+ - RapidPipeDispenserRecipe # WD
- type: technology
id: RipleyAPLU
diff --git a/Resources/Prototypes/_White/Mood/generic_negativeEffects.yml b/Resources/Prototypes/_White/Mood/generic_negativeEffects.yml
index 7deab7f4f6..296b3b4465 100644
--- a/Resources/Prototypes/_White/Mood/generic_negativeEffects.yml
+++ b/Resources/Prototypes/_White/Mood/generic_negativeEffects.yml
@@ -1,51 +1,43 @@
- type: moodEffect
id: Handcuffed
- desc: "Кажется мои выходки кто-то заметил."
+ description: "Кажется мои выходки кто-то заметил."
moodChange: enum.MoodChangeLevel.Small
- positiveEffect: false
- type: moodEffect
id: Suffocating
- desc: "НЕ.. МОГУ... ДЫШАТЬ..."
+ description: "НЕ.. МОГУ... ДЫШАТЬ..."
moodChange: enum.MoodChangeLevel.Medium
- positiveEffect: false
timeout: 1
- type: moodEffect
id: OnFire
- desc: "ГОРЮ!!!"
+ description: "ГОРЮ!!!"
moodChange: enum.MoodChangeLevel.Big
- positiveEffect: false
- type: moodEffect
id: Creampied
- desc: "Меня окремили. На вкус как пирог."
+ description: "Меня окремили. На вкус как пирог."
moodChange: enum.MoodChangeLevel.Small
- positiveEffect: false
timeout: 3
- type: moodEffect
id: MobSlipped
- desc: "Опять поскальзываюсь. Надо быть аккуратней."
+ description: "Опять поскальзываюсь. Надо быть аккуратней."
moodChange: enum.MoodChangeLevel.Small
- positiveEffect: false
timeout: 3
- type: moodEffect
id: MobVomit
- desc: "Меня только что вырвало. Мерзость."
+ description: "Меня только что вырвало. Мерзость."
moodChange: enum.MoodChangeLevel.Small
- positiveEffect: false
timeout: 8
- type: moodEffect
id: MobLowPressure
- desc: "Меня сейчас разорвёт наружу!"
+ description: "Меня сейчас разорвёт наружу!"
moodChange: enum.MoodChangeLevel.Medium
- positiveEffect: false
- type: moodEffect
id: MobHighPressure
- desc: "На меня оказывается огромное давление!"
+ description: "На меня оказывается огромное давление!"
moodChange: enum.MoodChangeLevel.Medium
- positiveEffect: false
diff --git a/Resources/Prototypes/_White/Mood/generic_positveEffects.yml b/Resources/Prototypes/_White/Mood/generic_positveEffects.yml
index 856879bdc2..ac67188d30 100644
--- a/Resources/Prototypes/_White/Mood/generic_positveEffects.yml
+++ b/Resources/Prototypes/_White/Mood/generic_positveEffects.yml
@@ -1,66 +1,66 @@
- type: moodEffect
id: BeingHugged
- desc: "Обнимашки - круто."
+ description: "Обнимашки - круто."
moodChange: enum.MoodChangeLevel.Small
- positiveEffect: true
+ positive: true
timeout: 2
- type: moodEffect
id: BeingPet
- desc: "Меня погладили!"
+ description: "Меня погладили!"
moodChange: enum.MoodChangeLevel.Small
- positiveEffect: true
+ positive: true
timeout: 2
- type: moodEffect
id: ArcadePlay
- desc: "Я весело поиграл в интересную аркаду."
+ description: "Я весело поиграл в интересную аркаду."
moodChange: enum.MoodChangeLevel.Small
- positiveEffect: true
+ positive: true
timeout: 8
- type: moodEffect
id: GotBlessed
- desc: "Меня благословили."
+ description: "Меня благословили."
moodChange: enum.MoodChangeLevel.Small
- positiveEffect: true
+ positive: true
timeout: 8
- type: moodEffect
id: PetAnimal
- desc: "Животные такие милые! Не могу перестать их гладить!"
+ description: "Животные такие милые! Не могу перестать их гладить!"
moodChange: enum.MoodChangeLevel.Small
- positiveEffect: true
+ positive: true
timeout: 5
- type: moodEffect
id: SavedLife
- desc: "Так приятно спасать чью-то жизнь."
+ description: "Так приятно спасать чью-то жизнь."
moodChange: enum.MoodChangeLevel.Medium
- positiveEffect: true
+ positive: true
timeout: 8
- type: moodEffect
id: TraitorFocused #Used for traitors to boost their goals completion.
- desc: "У меня есть цель, и я добьюсь её, во что бы то ни стало!"
+ description: "У меня есть цель, и я добьюсь её, во что бы то ни стало!"
moodChange: enum.MoodChangeLevel.Medium
- positiveEffect: true
+ positive: true
- type: moodEffect
id: RevolutionFocused #Used for revolution
- desc: "СЛАВА РЕВОЛЮЦИИ!!!"
+ description: "СЛАВА РЕВОЛЮЦИИ!!!"
moodChange: enum.MoodChangeLevel.Medium
- positiveEffect: true
+ positive: true
- type: moodEffect
id: CultFocused
- desc: "Знаю правду, славим великого!"
+ description: "Знаю правду, славим великого!"
moodChange: enum.MoodChangeLevel.Big
- positiveEffect: true
+ positive: true
- type: moodEffect
id: Stimulator
- desc: "Я ЧУВСТВУЮ ЭТО, В МОЕЙ КРОВИ НАХОДИТСЯ ЧТО-ТО НЕОБЫЧНОЕ!!"
+ description: "Я ЧУВСТВУЮ ЭТО, В МОЕЙ КРОВИ НАХОДИТСЯ ЧТО-ТО НЕОБЫЧНОЕ!!"
moodChange: enum.MoodChangeLevel.Medium
- positiveEffect: true
- timeout: 2
\ No newline at end of file
+ positive: true
+ timeout: 2
diff --git a/Resources/Prototypes/_White/Mood/moodEffects_needs.yml b/Resources/Prototypes/_White/Mood/moodEffects_needs.yml
index 7266cbe8f3..f99aac0ebc 100644
--- a/Resources/Prototypes/_White/Mood/moodEffects_needs.yml
+++ b/Resources/Prototypes/_White/Mood/moodEffects_needs.yml
@@ -1,87 +1,78 @@
#Hunger
- type: moodEffect
id: HungerOverfed
- desc: "Во мне столько жира..."
+ description: "Во мне столько жира..."
moodChange: enum.MoodChangeLevel.Small
- positiveEffect: false
category: "Hunger"
- type: moodEffect
id: HungerOkay
- desc: "Мой желудок полон!"
+ description: "Мой желудок полон!"
moodChange: enum.MoodChangeLevel.Medium
- positiveEffect: true
+ positive: true
category: "Hunger"
- type: moodEffect
id: HungerPeckish
- desc: "Хочу есть."
+ description: "Хочу есть."
moodChange: enum.MoodChangeLevel.Medium
- positiveEffect: false
category: "Hunger"
- type: moodEffect
id: HungerStarving
- desc: "Голодаю!"
+ description: "Голодаю!"
moodChange: enum.MoodChangeLevel.Big
- positiveEffect: false
category: "Hunger"
#Thirst
- type: moodEffect
id: ThirstOverHydrated
- desc: "СЛИШКОМ МНОГО ВОДЫ..."
+ description: "СЛИШКОМ МНОГО ВОДЫ..."
moodChange: enum.MoodChangeLevel.Small
- positiveEffect: false
category: "Thirst"
- type: moodEffect
id: ThirstOkay
- desc: "Не хочу пить."
+ description: "Не хочу пить."
moodChange: enum.MoodChangeLevel.Medium
- positiveEffect: true
+ positive: true
category: "Thirst"
- type: moodEffect
id: ThirstThirsty
- desc: "Хочу пить."
+ description: "Хочу пить."
moodChange: enum.MoodChangeLevel.Medium
- positiveEffect: false
category: "Thirst"
- type: moodEffect
id: ThirstParched
- desc: "ВОДЫ!"
+ description: "ВОДЫ!"
moodChange: enum.MoodChangeLevel.Big
- positiveEffect: false
category: "Thirst"
#Health
- type: moodEffect
id: HealthNoDamage
- desc: "Чувствую себя лишённым боли."
+ description: "Чувствую себя лишённым боли."
moodChange: enum.MoodChangeLevel.None
- positiveEffect: true
+ positive: true
hidden: true
category: "Health"
- type: moodEffect
id: HealthLightDamage
- desc: "Мои ссадины жгутся."
+ description: "Мои ссадины жгутся."
moodChange: enum.MoodChangeLevel.Small
- positiveEffect: false
category: "Health"
- type: moodEffect
id: HealthSevereDamage
- desc: "Сильная боль пронзает меня."
+ description: "Сильная боль пронзает меня."
moodChange: enum.MoodChangeLevel.Medium
- positiveEffect: false
category: "Health"
- type: moodEffect
id: HealthHeavyDamage
- desc: "Агония гложет мою душу!"
+ description: "Агония гложет мою душу!"
moodChange: enum.MoodChangeLevel.Large
- positiveEffect: false
category: "Health"
diff --git a/Resources/Prototypes/_White/RCD/categories.yml b/Resources/Prototypes/_White/RCD/categories.yml
new file mode 100644
index 0000000000..bd88be5ad4
--- /dev/null
+++ b/Resources/Prototypes/_White/RCD/categories.yml
@@ -0,0 +1,43 @@
+- type: rcdCategory
+ id: WallsAndFlooring
+ spritePath: /Textures/Interface/Radial/RCD/walls_and_flooring.png
+
+- type: rcdCategory
+ id: WindowsAndGrilles
+ spritePath: /Textures/Interface/Radial/RCD/windows_and_grilles.png
+
+- type: rcdCategory
+ id: Airlocks
+ spritePath: /Textures/Interface/Radial/RCD/airlocks.png
+
+- type: rcdCategory
+ id: Electrical
+ spritePath: /Textures/Interface/Radial/RCD/multicoil.png
+
+- type: rcdCategory
+ id: Lighting
+ spritePath: /Textures/Interface/Radial/RCD/lighting.png
+
+- type: rcdCategory
+ id: Pipes
+ spritePath:
+ sprite: /Textures/Structures/Piping/Atmospherics/pipe.rsi
+ state: pipeFourway
+
+- type: rcdCategory
+ id: GasDevices
+ spritePath:
+ sprite: /Textures/Structures/Piping/Atmospherics/vent.rsi
+ state: vent_off
+
+- type: rcdCategory
+ id: DisposalPipes
+ spritePath:
+ sprite: /Textures/Structures/Piping/disposal.rsi
+ state: conpipe-t
+
+- type: rcdCategory
+ id: DisposalUnits
+ spritePath:
+ sprite: /Textures/Structures/Piping/disposal.rsi
+ state: disposal
diff --git a/Resources/Prototypes/_White/RPD/rpd.yml b/Resources/Prototypes/_White/RPD/rpd.yml
new file mode 100644
index 0000000000..d2ef3481dd
--- /dev/null
+++ b/Resources/Prototypes/_White/RPD/rpd.yml
@@ -0,0 +1,482 @@
+# Pipes
+
+- type: rcd
+ id: PipeStraight
+ category: Pipes
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/pipe.rsi
+ state: pipeStraight
+ mode: ConstructObject
+ prototype: GasPipeStraight
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: PipeBend
+ category: Pipes
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/pipe.rsi
+ state: pipeBend
+ mode: ConstructObject
+ prototype: GasPipeBend
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: PipeTJunction
+ category: Pipes
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/pipe.rsi
+ state: pipeTJunction
+ mode: ConstructObject
+ prototype: GasPipeTJunction
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: PipeFourway
+ category: Pipes
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/pipe.rsi
+ state: pipeFourway
+ mode: ConstructObject
+ prototype: GasPipeFourway
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+# Gas devices
+
+- type: rcd
+ id: GasCanisterPort
+ category: GasDevices
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/gascanisterport.rsi
+ state: gasCanisterPort
+ mode: ConstructObject
+ prototype: GasPort
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: GasFilter
+ category: GasDevices
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/gasfilter.rsi
+ state: gasFilter
+ mode: ConstructObject
+ prototype: GasFilter
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: GasMixer
+ category: GasDevices
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/gasmixer.rsi
+ state: gasMixer
+ mode: ConstructObject
+ prototype: GasMixer
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: GasOutletInjector
+ category: GasDevices
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/outletinjector.rsi
+ state: injector
+ mode: ConstructObject
+ prototype: GasOutletInjector
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: GasPressurePump
+ category: GasDevices
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/pump.rsi
+ state: pumpPressure
+ mode: ConstructObject
+ prototype: GasPressurePump
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: GasVolumePump
+ category: GasDevices
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/pump.rsi
+ state: pumpVolume
+ mode: ConstructObject
+ prototype: GasVolumePump
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: GasValve
+ category: GasDevices
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/pump.rsi
+ state: pumpManualValve
+ mode: ConstructObject
+ prototype: GasValve
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: SignalControlledValve
+ category: GasDevices
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/pump.rsi
+ state: pumpDigitalValve
+ mode: ConstructObject
+ prototype: SignalControlledValve
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: PressureControlledValve
+ category: GasDevices
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/pneumaticvalve.rsi
+ state: off
+ mode: ConstructObject
+ prototype: PressureControlledValve
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: GasVentScrubber
+ category: GasDevices
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/scrubber.rsi
+ state: scrub_off
+ mode: ConstructObject
+ prototype: GasVentScrubber
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: GasVentPump
+ category: GasDevices
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/vent.rsi
+ state: vent_off
+ mode: ConstructObject
+ prototype: GasVentPump
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: GasPassiveVent
+ category: GasDevices
+ sprite:
+ sprite: /Textures/Structures/Piping/Atmospherics/vent.rsi
+ state: vent_off
+ mode: ConstructObject
+ prototype: GasPassiveVent
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+# Disposal pipes
+
+- type: rcd
+ id: DisposalPipe
+ category: DisposalPipes
+ sprite:
+ sprite: /Textures/Structures/Piping/disposal.rsi
+ state: pipe-s
+ mode: ConstructObject
+ prototype: DisposalPipe
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: DisposalBend
+ category: DisposalPipes
+ sprite:
+ sprite: /Textures/Structures/Piping/disposal.rsi
+ state: pipe-c
+ mode: ConstructObject
+ prototype: DisposalBend
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: DisposalJunction
+ category: DisposalPipes
+ sprite:
+ sprite: /Textures/Structures/Piping/disposal.rsi
+ state: pipe-j1
+ mode: ConstructObject
+ prototype: DisposalJunction
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: DisposalJunctionFlipped
+ category: DisposalPipes
+ sprite:
+ sprite: /Textures/Structures/Piping/disposal.rsi
+ state: pipe-j1
+ mode: ConstructObject
+ prototype: DisposalJunctionFlipped
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: DisposalYJunction
+ category: DisposalPipes
+ sprite:
+ sprite: /Textures/Structures/Piping/disposal.rsi
+ state: pipe-y
+ mode: ConstructObject
+ prototype: DisposalYJunction
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: DisposalRouter
+ category: DisposalPipes
+ sprite:
+ sprite: /Textures/Structures/Piping/disposal.rsi
+ state: pipe-j1s
+ mode: ConstructObject
+ prototype: DisposalRouter
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: DisposalRouterFlipped
+ category: DisposalPipes
+ sprite:
+ sprite: /Textures/Structures/Piping/disposal.rsi
+ state: pipe-j2s
+ mode: ConstructObject
+ prototype: DisposalRouterFlipped
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: DisposalTagger
+ category: DisposalPipes
+ sprite:
+ sprite: /Textures/Structures/Piping/disposal.rsi
+ state: pipe-tagger
+ mode: ConstructObject
+ prototype: DisposalTagger
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: DisposalSignalRouter
+ category: DisposalPipes
+ sprite:
+ sprite: /Textures/Structures/Piping/disposal.rsi
+ state: signal-router
+ mode: ConstructObject
+ prototype: DisposalSignalRouter
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: DisposalSignalRouterFlipped
+ category: DisposalPipes
+ sprite:
+ sprite: /Textures/Structures/Piping/disposal.rsi
+ state: signal-router-flipped
+ mode: ConstructObject
+ prototype: DisposalSignalRouterFlipped
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+- type: rcd
+ id: DisposalTrunk
+ category: DisposalPipes
+ sprite:
+ sprite: /Textures/Structures/Piping/disposal.rsi
+ state: conpipe-t
+ mode: ConstructObject
+ prototype: DisposalTrunk
+ cost: 1
+ delay: 0
+ collisionMask: InteractImpassable
+ rules:
+ - MustBuildOnSubfloor
+ rotation: User
+ fx: EffectRCDConstruct0
+
+# Disposal units
+
+- type: rcd
+ id: DisposalUnit
+ category: DisposalUnits
+ sprite:
+ sprite: /Textures/Structures/Piping/disposal.rsi
+ state: disposal
+ mode: ConstructObject
+ prototype: DisposalUnit
+ cost: 2
+ delay: 1
+ collisionMask: InteractImpassable
+ rotation: User
+ fx: EffectRCDConstruct1
+
+- type: rcd
+ id: MailingUnit
+ category: DisposalUnits
+ sprite:
+ sprite: /Textures/Structures/Piping/disposal.rsi
+ state: mailing
+ mode: ConstructObject
+ prototype: MailingUnit
+ cost: 2
+ delay: 1
+ collisionMask: InteractImpassable
+ rotation: User
+ fx: EffectRCDConstruct1
+
+- type: rcd
+ id: ToiletEmpty
+ category: DisposalUnits
+ sprite:
+ sprite: /Textures/Structures/Furniture/toilet.rsi
+ state: condisposal
+ mode: ConstructObject
+ prototype: ToiletEmpty
+ cost: 2
+ delay: 1
+ collisionMask: InteractImpassable
+ rotation: User
+ fx: EffectRCDConstruct1
+
diff --git a/Resources/Prototypes/_White/Recipes/lathe_recipes.yml b/Resources/Prototypes/_White/Recipes/lathe_recipes.yml
index 1d1620b717..4cba462e3b 100644
--- a/Resources/Prototypes/_White/Recipes/lathe_recipes.yml
+++ b/Resources/Prototypes/_White/Recipes/lathe_recipes.yml
@@ -166,4 +166,20 @@
result: ShinanoGrenadeBeanbag
completetime: 3
materials:
- Steel: 800
\ No newline at end of file
+ Steel: 800
+
+- type: latheRecipe
+ id: RapidPipeDispenserRecipe
+ result: RapidPipeDispenser
+ completetime: 1
+ materials:
+ Steel: 300
+ Glass: 300
+
+- type: latheRecipe
+ id: RCDRecipe
+ result: RCD
+ completetime: 1
+ materials:
+ Steel: 300
+ Glass: 300
diff --git a/Resources/Textures/White/Items/Tools/rpd.rsi/equipped-BELT.png b/Resources/Textures/White/Items/Tools/rpd.rsi/equipped-BELT.png
new file mode 100644
index 0000000000..c1182e5dfc
Binary files /dev/null and b/Resources/Textures/White/Items/Tools/rpd.rsi/equipped-BELT.png differ
diff --git a/Resources/Textures/White/Items/Tools/rpd.rsi/icon.png b/Resources/Textures/White/Items/Tools/rpd.rsi/icon.png
new file mode 100644
index 0000000000..00f92c0152
Binary files /dev/null and b/Resources/Textures/White/Items/Tools/rpd.rsi/icon.png differ
diff --git a/Resources/Textures/White/Items/Tools/rpd.rsi/inhand-left.png b/Resources/Textures/White/Items/Tools/rpd.rsi/inhand-left.png
new file mode 100644
index 0000000000..d80f8abf1f
Binary files /dev/null and b/Resources/Textures/White/Items/Tools/rpd.rsi/inhand-left.png differ
diff --git a/Resources/Textures/White/Items/Tools/rpd.rsi/inhand-right.png b/Resources/Textures/White/Items/Tools/rpd.rsi/inhand-right.png
new file mode 100644
index 0000000000..951a323c11
Binary files /dev/null and b/Resources/Textures/White/Items/Tools/rpd.rsi/inhand-right.png differ
diff --git a/Resources/Textures/White/Items/Tools/rpd.rsi/meta.json b/Resources/Textures/White/Items/Tools/rpd.rsi/meta.json
new file mode 100644
index 0000000000..fefcb394af
--- /dev/null
+++ b/Resources/Textures/White/Items/Tools/rpd.rsi/meta.json
@@ -0,0 +1,26 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from cev-eris at commit https://github.com/discordia-space/CEV-Eris/commit/ce025775f73b66934ca96f3a8edc30993ea70b4d and modified by Swept",
+ "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/_Sunrise/Entities/Objects/Devices/portable_camera_viewer.rsi/icon.png b/Resources/Textures/_Sunrise/Entities/Objects/Devices/portable_camera_viewer.rsi/icon.png
deleted file mode 100644
index 7158e2c3e1..0000000000
Binary files a/Resources/Textures/_Sunrise/Entities/Objects/Devices/portable_camera_viewer.rsi/icon.png and /dev/null differ
diff --git a/Resources/Textures/_Sunrise/Entities/Objects/Devices/portable_camera_viewer.rsi/meta.json b/Resources/Textures/_Sunrise/Entities/Objects/Devices/portable_camera_viewer.rsi/meta.json
deleted file mode 100644
index fb7d306474..0000000000
--- a/Resources/Textures/_Sunrise/Entities/Objects/Devices/portable_camera_viewer.rsi/meta.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "version": 1,
- "size": {
- "x": 32,
- "y": 32
- },
- "license": "CC-BY-SA-3.0",
- "copyright": "",
- "states": [
- {
- "name": "icon"
- }
- ]
-}