From d6277588264f67e94f085b6aa9c8fb003f262a25 Mon Sep 17 00:00:00 2001 From: ThereDrD0 <88589686+ThereDrD0@users.noreply.github.com> Date: Mon, 29 Jul 2024 06:04:21 +0300 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=B0=D1=84=D1=84=D1=8B=20(#510)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Moodsystem cleanups * remove overhydrated and overfed mood debuffs * admins now join game deadmined + new player timers * faster arrivals * recharging rcd with metal, glass, plastic or cable coils * better timings and costs + building apc and camera * preparing for rpd * RPD + make RCD more generic * add rpd to atmos lockers, rcd to engivend * rcd and rpd to technologies * dont deadmin me in debug * rcd ammo buff * add ChargeCountModifier logic for non stackable items * increase time to become experienced player * Dynamic Radial Menus (#29678) * fix * Clean Some Code * Some Commentaries * Update Content.Client/UserInterface/Controls/RadialContainer.cs * Update Content.Client/UserInterface/Controls/RadialContainer.cs --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * more dynamically parameters --------- Co-authored-by: Rinary <72972221+Rinary1@users.noreply.github.com> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> --- .../RCD/RCDConstructionGhostSystem.cs | 2 +- Content.Client/RCD/RCDMenu.xaml | 34 +- Content.Client/RCD/RCDMenu.xaml.cs | 70 ++- .../UserInterface/Controls/RadialContainer.cs | 6 + .../GameTicking/GameTicker.RoundFlow.cs | 7 +- Content.Server/_White/Mood/MoodComponent.cs | 22 +- Content.Server/_White/Mood/MoodSystem.cs | 14 +- Content.Shared/CCVar/CCVars.cs | 10 +- .../Nutrition/EntitySystems/HungerSystem.cs | 2 +- .../Nutrition/EntitySystems/ThirstSystem.cs | 11 +- .../RCD/Components/RCDAmmoComponent.cs | 4 + Content.Shared/RCD/Components/RCDComponent.cs | 7 + Content.Shared/RCD/RCDPrototype.cs | 15 +- Content.Shared/RCD/Systems/RCDAmmoSystem.cs | 27 + Content.Shared/RCD/Systems/RCDSystem.cs | 20 +- .../Systems/ClothingGrantingSystem.cs | 32 +- .../_White/Mood/MoodEffectPrototype.cs | 20 +- .../_White/RCD/RCDCategoryPrototype.cs | 17 + .../ru-RU/rcd/components/rcd-component.ftl | 81 ++- .../Catalog/Fills/Lockers/engineer.yml | 2 + .../Catalog/Fills/Lockers/heads.yml | 2 + .../VendingMachines/Inventories/engivend.yml | 5 +- .../Objects/Materials/Sheets/glass.yml | 11 + .../Objects/Materials/Sheets/metal.yml | 5 + .../Objects/Materials/Sheets/other.yml | 3 + .../Entities/Objects/Materials/parts.yml | 3 + .../Entities/Objects/Tools/cable_coils.yml | 3 + .../Entities/Objects/Tools/tools.yml | 109 +++- .../Entities/Structures/Machines/lathe.yml | 2 + Resources/Prototypes/RCD/rcd.yml | 161 +++--- Resources/Prototypes/Research/industrial.yml | 2 + .../_White/Mood/generic_negativeEffects.yml | 24 +- .../_White/Mood/generic_positveEffects.yml | 42 +- .../_White/Mood/moodEffects_needs.yml | 39 +- .../Prototypes/_White/RCD/categories.yml | 43 ++ Resources/Prototypes/_White/RPD/rpd.yml | 482 ++++++++++++++++++ .../_White/Recipes/lathe_recipes.yml | 18 +- .../Items/Tools/rpd.rsi/equipped-BELT.png | Bin 0 -> 422 bytes .../White/Items/Tools/rpd.rsi/icon.png | Bin 0 -> 875 bytes .../White/Items/Tools/rpd.rsi/inhand-left.png | Bin 0 -> 1068 bytes .../Items/Tools/rpd.rsi/inhand-right.png | Bin 0 -> 1100 bytes .../White/Items/Tools/rpd.rsi/meta.json | 26 + .../portable_camera_viewer.rsi/icon.png | Bin 701 -> 0 bytes .../portable_camera_viewer.rsi/meta.json | 14 - 44 files changed, 1082 insertions(+), 315 deletions(-) create mode 100644 Content.Shared/_White/RCD/RCDCategoryPrototype.cs create mode 100644 Resources/Prototypes/_White/RCD/categories.yml create mode 100644 Resources/Prototypes/_White/RPD/rpd.yml create mode 100644 Resources/Textures/White/Items/Tools/rpd.rsi/equipped-BELT.png create mode 100644 Resources/Textures/White/Items/Tools/rpd.rsi/icon.png create mode 100644 Resources/Textures/White/Items/Tools/rpd.rsi/inhand-left.png create mode 100644 Resources/Textures/White/Items/Tools/rpd.rsi/inhand-right.png create mode 100644 Resources/Textures/White/Items/Tools/rpd.rsi/meta.json delete mode 100644 Resources/Textures/_Sunrise/Entities/Objects/Devices/portable_camera_viewer.rsi/icon.png delete mode 100644 Resources/Textures/_Sunrise/Entities/Objects/Devices/portable_camera_viewer.rsi/meta.json 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 0000000000000000000000000000000000000000..c1182e5dfc1697421064bdb576af05c8c6eafdca GIT binary patch literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R4( zr;B4q#hkad7J9J+N*w)Ytgz$Yrbw2=xC0wfH$>|sf7g7Y)STEI`jIhb8smM33yuPt z6~vpH4{q9!YZ&vLTU5+$*S0$BWV{ob z_DApjH3p8UueA+q|8RZ%qHEqT_o`(<;e?B&3k6Czcg;1K9ooHougzNlE%S!<>?g;c zb1r(yw!xNZ{$q9^qrk-ds>#`3`wujD?2KzVY|!$Hb;B2JhEFVb(ILhuvQ1Anx^l1w zlySVQF1e}H!n`4;{Xre{%>8JFA%j)w@Q3unwIKwvG>w=>A&Mp#)a^ZY-nYH# zOh{5_59~efeeb>JKIb{-To%#Q)rFNr1XdVf0$~EHn?TiBBg@*lP9E#B)rj0zulgqh z=S74#EaRP0UoWTp7uJ4lUYkA}(|6EXQP=T7PFX6*MSS$|s21e268{}4u zZ|+w^lb0*+quMEK`oWbIL2&|fxL7##&WXEGyAc0*5dK~_c1}cdg2D+EVQtY9PLf(w zm;D;)nQw6>Q<|KvK=VafH9JNO_ZLh&E+LJll@ult5hCJrjgw1zbutO&%hho8dtikL zjTfdA(YtL=xxLb$mkHCprGQi`Y#M4GSHSAJurO&);=33oxwX}Xl?kM`M=mG)Tb(>7$TiG*|W^PBF_dQZ)ZRzb|v>rXl z9gQO@uxWUjJBKu;?WyI-hJsD=jcll>o!y;T zf;lh9ap#=*nD3dNv$OMVfabCQKyz6Dpt&pn&|DS(Xf6u?G?xVcn#%$J&1C_A=28M6 zJt>jdVmIPuOMeLdb14Bp$(LM+LPn~M9lhd~3Zc2m#^@?5t`Y!45r>fJ7)9idF{yDc z9@)*3>|q!*ro||09rOeYK?#7DPo1J+)Znr_|3(4z^x}GPiOHSs zS_cDft8@UAG|heLA({qvZ%z6Y$JH^1p*JZk;rM$2Av0kfZTxzt<)OI$miZTVxugSd zkIagOQ{psKC*!ku=~bWOP`yFpl>ka0^GnAt#td<9tk;m%Ug-dKrsax;lc*O5eox?R zfrFhma~P-6(*8LWp0&5L*G+90@Jztc z51okO4X0ism7pI+=xI<=<<<9Db@{nfA<%t#j$k=vDtXC53>r;+Q=Q^}O5U+;tF$+Z zl0}fF0rgtVgK3oIg~4vGL~nd9W?OHsS&!~Vr=N$NC%?Ep#X~soWZfqGl9)V6{uDYOOLlYBi~xE+56vetn>_}@!=osu02;1mff7%`%1JCFKMev=P%$Fv#l^+o zg)xp{k4M=zN@aV2Vb8}9{s-Is47MCXVdK0gr(UINVdFUJu{3#-_xprODc=lHk|(qC zS>c`@o_voO`t;eGB*|t!z{{N>%>aK69LBz&Bu@&;ZqRLXp{8#JL-V1a z<%Nx1NLWwLbs<;^3IH)3_|-cdR(yt+M?`K%D=l_GR8W5paIcY^JIIN9W&I!m&1C_A z=CS}lb6EhOxhw$CTowRmE(-uOmjwWtOWD~Vf}}uCiKPQj-5H1bO!dYYj7 z;~$U;K!z{Cti1jK@*_EGQ<%U00cilp0}zNWz^r8Z2c!WA#1~*zD*OXdr+~k{0JBoz zACLyXA76l3sq_y>9RdFM0?bO4e?a0?S|lRG{})<&y%x+sVhVV1(WY3Xxu~ldW&)73&~ei9&hxV7Ns1}p>YY)HJY9(F z>`m;|TO=a|);u0OO%!Eob<0~#5~2zqtFBkSQQhLQ$ZwFe*p|-5yKOaCXtm*`RD^8b zETzxe6O=%4#LA4Q0x0;hlNpfxc?zBX@z^zjyUH+j`Fr4D4`N^L7^=PF|MNZDtkCHj zi>LyIa}J=_{gfMStlg}XoESi|^8D5%WUiAi(B+2QpB4~A{W(Bqe+a&+Ys^Y|j+0_aL99W2E64=(n`8%SGT2xpTYBkBDtjXv=m>fm)cY3V?>8|A)TdmlnEFMScIiTTkAt-PwTw(jB*f#7?>`jAkB0PBF$%Dpe6?iDL z7GMuhe326DO=EmJWi`(Lo3xRoM5E;epxD=d$yh(FgAav*+O675ePHylTKt|@xUyRmiaIw=0KONX};B*Kj zC_tWpfk*PM7|kCYtIxZ-B+H6&G=+B_(Tcq zRnU8ERRSVw@PV|a%xJ95#AG%2M2YNG&~t3n*MLN7@QD)HtB||rHBZ-cRF@T$j{f?fsP1jMSrYaYwMUWLE&JH{>< S=HG$<0000zrb>uaS`-z|Ob{CxMEbH8)%eG!RA%s|Y*MQ30jNWj$n zheydoDrlDU^|WL2>Yk$?wwhw+5lfm(rUFWUTri4eYEq9 z`C$X|EBj?Z5tl6xD`0ZZt67(L?t&d(Pzl4P(;0=6EvEp`hU$>~&$Sr^X0kr@sT;{) zo=AH0$D!hC6@LYu_d!quTjUe~BpBcdrsu~aC5a09xUt&8fO?FBd8Scod8=GA><=m^4uC1Sd!oF79 zf;QGWAh6tM`mJ#az>yhD4Qd?rytuTc$@>LAtDVQQZwnZB;>{EJ^>|s;#rZiYJbS7# z-%zZq&J!N?7&{E$vdDD)>;U~}L$PBd?eJUbt!(Fp$-J1H0x*H6fX8QeeOZ%-1^XXg zPYWzP2t2v>TpoORtvPH9U;y>7oiwlkF}Ns;cNpO91OP9Nf$|mkHrmi#oLhaTa~W_p z_tMc-33(tU5`yKMW49FP6oA`_Er1sn$5!@{$bm?zQq>8keQ?!W5axS7ze}V3TSGYo z;AmVON$ORJD-)w$(wClJUpm{9iTEw3w#piac2&4D!Gf66;OlPU;9h|jxPRH{V+4zF zKF0v?_W;@fMpzX02R|YV7Uj)L2Uy1A?|~@uV@%9I%)q%aa13VD;_2oXowNV|01jnX jNoGw=04e|g00;m8000000Mb*F00000NkvXXu0mjf$dg7n 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" - } - ] -}