Баффы (#510)

* 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>
This commit is contained in:
ThereDrD0
2024-07-29 06:04:21 +03:00
committed by GitHub
parent 0f641a46d2
commit d627758826
44 changed files with 1082 additions and 315 deletions

View File

@@ -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;

View File

@@ -1,6 +1,5 @@
<ui:RadialMenu xmlns="https://spacestation14.io"
xmlns:ui="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:rcd="clr-namespace:Content.Client.RCD"
BackButtonStyleClass="RadialMenuBackButton"
CloseButtonStyleClass="RadialMenuCloseButton"
VerticalExpand="True"
@@ -12,36 +11,9 @@
<!-- Entry layer (shows main categories) -->
<ui:RadialContainer Name="Main" VerticalExpand="True" HorizontalExpand="True" Radius="64" ReserveSpaceForHiddenChildren="False">
<ui:RadialMenuTextureButton StyleClasses="RadialMenuButton" SetSize="64 64" ToolTip="{Loc 'rcd-component-walls-and-flooring'}" TargetLayer="WallsAndFlooring" Visible="False">
<TextureRect VerticalAlignment="Center" HorizontalAlignment="Center" TextureScale="2 2" TexturePath="/Textures/Interface/Radial/RCD/walls_and_flooring.png"/>
</ui:RadialMenuTextureButton>
<ui:RadialMenuTextureButton StyleClasses="RadialMenuButton" SetSize="64 64" ToolTip="{Loc 'rcd-component-windows-and-grilles'}" TargetLayer="WindowsAndGrilles" Visible="False">
<TextureRect VerticalAlignment="Center" HorizontalAlignment="Center" TextureScale="2 2" TexturePath="/Textures/Interface/Radial/RCD/windows_and_grilles.png"/>
</ui:RadialMenuTextureButton>
<ui:RadialMenuTextureButton StyleClasses="RadialMenuButton" SetSize="64 64" ToolTip="{Loc 'rcd-component-airlocks'}" TargetLayer="Airlocks" Visible="False">
<TextureRect VerticalAlignment="Center" HorizontalAlignment="Center" TextureScale="2 2" TexturePath="/Textures/Interface/Radial/RCD/airlocks.png"/>
</ui:RadialMenuTextureButton>
<ui:RadialMenuTextureButton StyleClasses="RadialMenuButton" SetSize="64 64" ToolTip="{Loc 'rcd-component-electrical'}" TargetLayer="Electrical" Visible="False">
<TextureRect VerticalAlignment="Center" HorizontalAlignment="Center" TextureScale="2 2" TexturePath="/Textures/Interface/Radial/RCD/multicoil.png"/>
</ui:RadialMenuTextureButton>
<ui:RadialMenuTextureButton StyleClasses="RadialMenuButton" SetSize="64 64" ToolTip="{Loc 'rcd-component-lighting'}" TargetLayer="Lighting" Visible="False">
<TextureRect VerticalAlignment="Center" HorizontalAlignment="Center" TextureScale="2 2" TexturePath="/Textures/Interface/Radial/RCD/lighting.png"/>
</ui:RadialMenuTextureButton>
<!-- Categories -->
</ui:RadialContainer>
<!-- Walls and flooring -->
<ui:RadialContainer Name="WallsAndFlooring" VerticalExpand="True" HorizontalExpand="True" Radius="64"/>
<!-- Windows and grilles -->
<ui:RadialContainer Name="WindowsAndGrilles" VerticalExpand="True" HorizontalExpand="True" Radius="64"/>
<!-- Airlocks -->
<ui:RadialContainer Name="Airlocks" VerticalExpand="True" HorizontalExpand="True" Radius="64"/>
<!-- Computer and machine frames -->
<ui:RadialContainer Name="Electrical" VerticalExpand="True" HorizontalExpand="True" Radius="64"/>
<!-- Lighting -->
<ui:RadialContainer Name="Lighting" VerticalExpand="True" HorizontalExpand="True" Radius="64"/>
<!-- Another categories -->
</ui:RadialMenu>

View File

@@ -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<RadialContainer>("Main");
if (main == null)
return;
// Populate secondary radial containers
if (!_entManager.TryGetComponent<RCDComponent>(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<RadialContainer>(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))

View File

@@ -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;

View File

@@ -217,7 +217,6 @@ namespace Content.Server.GameTicking
var readyPlayers = new List<ICommonSession>();
var readyPlayerProfiles = new Dictionary<NetUserId, HumanoidCharacterProfile>();
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();

View File

@@ -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<string, float> 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<MoodThreshold, float>))]
[DataField(customTypeSerializer: typeof(DictionarySerializer<MoodThreshold, float>))]
public Dictionary<MoodThreshold, float> 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<MoodThreshold, AlertType>))]
[DataField(customTypeSerializer: typeof(DictionarySerializer<MoodThreshold, AlertType>))]
public Dictionary<MoodThreshold, AlertType> 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<Enum, float>))]
[DataField(customTypeSerializer: typeof(DictionarySerializer<Enum, float>))]
public Dictionary<Enum, float> MoodChangeValues = new()
{
{ MoodChangeLevel.None , 0.0f },
@@ -80,7 +80,7 @@ public sealed partial class MoodComponent : Component
{ MoodChangeLevel.Large , 2f }
};
[DataField("healthMoodEffectsThresholds", customTypeSerializer: typeof(DictionarySerializer<string, float>))]
[DataField(customTypeSerializer: typeof(DictionarySerializer<string, float>))]
public Dictionary<string, float> HealthMoodEffectsThresholds = new()
{
{ "HealthHeavyDamage", 80f },

View File

@@ -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<IChatManager>();
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,

View File

@@ -838,7 +838,7 @@ namespace Content.Shared.CCVar
/// de-admin them.
/// </summary>
public static readonly CVarDef<bool> AdminDeadminOnJoin =
CVarDef.Create("admin.deadmin_on_join", false, CVar.SERVERONLY);
CVarDef.Create("admin.deadmin_on_join", true, CVar.SERVERONLY);
/// <summary>
/// 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.
/// </summary>
public static readonly CVarDef<int> 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);
/// <summary>
/// How long an admin client can go without any input before being considered AFK.
@@ -1346,7 +1346,7 @@ namespace Content.Shared.CCVar
/// <summary>
/// Config for when the restart vote should be allowed to be called based on percentage of ghosts.
///
/// </summary>
public static readonly CVarDef<int> 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.
/// </summary>
public static readonly CVarDef<bool> ArrivalsPlanet =
CVarDef.Create("shuttle.arrivals_planet", true, CVar.SERVERONLY);
CVarDef.Create("shuttle.arrivals_planet", false, CVar.SERVERONLY);
/// <summary>
/// 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.
/// </summary>
public static readonly CVarDef<float> ArrivalsCooldown =
CVarDef.Create("shuttle.arrivals_cooldown", 50f, CVar.SERVERONLY);
CVarDef.Create("shuttle.arrivals_cooldown", 10f, CVar.SERVERONLY);
/// <summary>
/// Are players allowed to return on the arrivals shuttle.

View File

@@ -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);

View File

@@ -112,10 +112,13 @@ public sealed class ThirstSystem : EntitySystem
_alerts.ClearAlertCategory(uid, AlertCategory.Thirst);
}
//WD start
// WD start
if (component.CurrentThirstThreshold != ThirstThreshold.OverHydrated)
{
var ev = new MoodEffectEvent("Thirst" + component.CurrentThirstThreshold);
RaiseLocalEvent(uid, ev);
//WD end
}
// WD end
switch (component.CurrentThirstThreshold)
{

View File

@@ -13,4 +13,8 @@ public sealed partial class RCDAmmoComponent : Component
/// </summary>
[DataField("charges"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public int Charges = 30;
[DataField] public bool CanBeExamined = true; // WD
[DataField] public float ChargeCountModifier = 1; // WD
}

View File

@@ -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<RCDPrototype> ProtoId { get; set; } = "Invalid";
/// <summary>
/// The ProtoId of the currently selected RCD prototype
/// </summary>
[DataField(required: true), AutoNetworkedField]
public HashSet<ProtoId<RCDCategoryPrototype>> CategoryPrototypes = default!;
/// <summary>
/// A cached copy of currently selected RCD prototype
/// </summary>

View File

@@ -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
/// <summary>
/// The name associated with the prototype
/// </summary>
[DataField("name"), ViewVariables(VVAccess.ReadOnly)]
public string SetName { get; private set; } = "Unknown";
[DataField, ViewVariables(VVAccess.ReadOnly)]
public string Name { get; private set; } = "Unknown";
/// <summary>
/// The name of the radial container that this prototype will be listed under on the RCD menu
/// </summary>
[DataField, ViewVariables(VVAccess.ReadOnly)]
public string Category { get; private set; } = "Undefined";
public ProtoId<RCDCategoryPrototype> Category { get; private set; } = "WallsAndFlooring"; // WD
/// <summary>
/// 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)
/// </summary>
[DataField, ViewVariables(VVAccess.ReadOnly)]
public string? Prototype { get; private set; } = string.Empty;
public ProtoId<EntityPrototype>? Prototype { get; private set; } = null;
/// <summary>
/// Number of charges consumed when the operation is completed

View File

@@ -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<RCDAmmoComponent, ComponentInit>(OnInit); // WD edit
SubscribeLocalEvent<RCDAmmoComponent, ExaminedEvent>(OnExamine);
SubscribeLocalEvent<RCDAmmoComponent, AfterInteractEvent>(OnAfterInteract);
}
// WD edit start
private void OnInit(EntityUid uid, RCDAmmoComponent rcdAmmoComponent, ComponentInit _)
{
if (TryComp<StackComponent>(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<StackComponent>(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);

View File

@@ -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<RCDDoAfterEvent> 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<LimitedChargesComponent>(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);

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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!;
}

View File

@@ -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 = Новейшее ручное строительное устройство, которое может быстро размещать трубы и атмосферные приборы.

View File

@@ -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

View File

@@ -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

View File

@@ -12,6 +12,5 @@
GeigerCounter: 3
InflatableWallStack1: 24
InflatableDoorStack1: 8
emaggedInventory:
RCD: 1
RCDAmmo: 3
RCD: 3 # WD
RCDAmmo: 3 # WD

View File

@@ -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

View File

@@ -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

View File

@@ -164,6 +164,9 @@
- ReagentId: Phosphorus
Quantity: 5
canReact: false
- type: RCDAmmo # WD
canBeExamined: false
chargeCountModifier: 0.5
- type: entity
parent: SheetPlastic

View File

@@ -74,6 +74,9 @@
Quantity: 4.5
- ReagentId: Carbon
Quantity: 0.5
- type: RCDAmmo # WD
canBeExamined: false
chargeCountModifier: 0.5
- type: entity
parent: PartRodMetal

View File

@@ -27,6 +27,9 @@
price: 0
- type: StackPrice
price: 1
- type: RCDAmmo # WD
canBeExamined: false
chargeCountModifier: 0.2
- type: entity
id: CableHVStack

View File

@@ -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

View File

@@ -348,6 +348,8 @@
- KitchenKnife # WD EDIT
- ButchCleaver # WD EDIT
- WeaponTempGun # WD EDIT
- RapidPipeDispenserRecipe # WD edit
- RCDRecipe # WD edit
- DeviceQuantumSpinInverter
- type: EmagLatheRecipes
emagDynamicRecipes:

View File

@@ -39,11 +39,11 @@
mode: ConstructTile
prototype: Plating
cost: 1
delay: 1
delay: 0
collisionMask: InteractImpassable
rules:
- CanBuildOnEmptyTile
fx: EffectRCDConstruct1
fx: EffectRCDConstruct0
- type: rcd
id: FloorSteel
@@ -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
@@ -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,13 +106,13 @@
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
@@ -120,7 +120,7 @@
sprite: /Textures/Interface/Radial/RCD/directional.png
mode: ConstructObject
prototype: WindowDirectional
cost: 2
cost: 1
delay: 1
collisionMask: FullTileMask
collisionBounds: "-0.23,-0.49,0.23,-0.36"
@@ -136,12 +136,12 @@
mode: ConstructObject
prototype: ReinforcedWindow
cost: 4
delay: 3
delay: 2
collisionMask: FullTileMask
rules:
- IsWindow
rotation: User
fx: EffectRCDConstruct3
fx: EffectRCDConstruct2
- type: rcd
id: WindowReinforcedDirectional
@@ -149,14 +149,14 @@
sprite: /Textures/Interface/Radial/RCD/directional_reinforced.png
mode: ConstructObject
prototype: WindowReinforcedDirectional
cost: 3
delay: 2
cost: 2
delay: 1
collisionMask: FullTileMask
collisionBounds: "-0.23,-0.49,0.23,-0.36"
rules:
- IsWindow
rotation: User
fx: EffectRCDConstruct2
fx: EffectRCDConstruct1
# Airlocks
- type: rcd
@@ -166,10 +166,10 @@
mode: ConstructObject
prototype: Airlock
cost: 4
delay: 4
delay: 3
collisionMask: FullTileMask
rotation: Camera
fx: EffectRCDConstruct4
fx: EffectRCDConstruct3
- type: rcd
id: AirlockGlass
@@ -178,10 +178,10 @@
mode: ConstructObject
prototype: AirlockGlass
cost: 4
delay: 4
delay: 3
collisionMask: FullTileMask
rotation: Camera
fx: EffectRCDConstruct4
fx: EffectRCDConstruct3
- type: rcd
id: Firelock
@@ -189,11 +189,11 @@
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,12 +202,12 @@
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
@@ -215,12 +215,12 @@
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
@@ -278,3 +278,28 @@
- MustBuildOnSubfloor
rotation: User
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

View File

@@ -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

View File

@@ -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

View File

@@ -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
positive: true
timeout: 2

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -167,3 +167,19 @@
completetime: 3
materials:
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 875 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -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
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 701 B

View File

@@ -1,14 +0,0 @@
{
"version": 1,
"size": {
"x": 32,
"y": 32
},
"license": "CC-BY-SA-3.0",
"copyright": "",
"states": [
{
"name": "icon"
}
]
}