diff --git a/Content.Client/Power/APC/ApcVisualizerComponent.cs b/Content.Client/Power/APC/ApcVisualizerComponent.cs index 87cb70019f5..e356a801772 100644 --- a/Content.Client/Power/APC/ApcVisualizerComponent.cs +++ b/Content.Client/Power/APC/ApcVisualizerComponent.cs @@ -87,7 +87,7 @@ public sealed partial class ApcVisualsComponent : Component /// [DataField("screenColors")] [ViewVariables(VVAccess.ReadWrite)] - public Color[] ScreenColors = new Color[(byte)ApcChargeState.NumStates]{Color.FromHex("#d1332e"), Color.FromHex("#2e8ad1"), Color.FromHex("#3db83b"), Color.FromHex("#ffac1c")}; + public Color[] ScreenColors = new Color[(byte)ApcChargeState.NumStates]{Color.FromHex("#d1332e"), Color.FromHex("#dcdc28"), Color.FromHex("#82ff4c"), Color.FromHex("#ffac1c")}; /// /// The sprite state of the unlit overlay used for the APC screen when the APC has been emagged. diff --git a/Content.Client/Power/PowerMonitoringWindow.xaml.Widgets.cs b/Content.Client/Power/PowerMonitoringWindow.xaml.Widgets.cs index 1427df05153..74752ddc534 100644 --- a/Content.Client/Power/PowerMonitoringWindow.xaml.Widgets.cs +++ b/Content.Client/Power/PowerMonitoringWindow.xaml.Widgets.cs @@ -482,7 +482,7 @@ public PowerMonitoringButton() { HorizontalAlignment = HAlignment.Right, Align = Label.AlignMode.Right, - SetWidth = 72f, + SetWidth = 80f, Margin = new Thickness(10, 0, 0, 0), ClipText = true, }; diff --git a/Content.Server/GameTicking/GameTicker.GamePreset.cs b/Content.Server/GameTicking/GameTicker.GamePreset.cs index fffacb59dee..6e297789528 100644 --- a/Content.Server/GameTicking/GameTicker.GamePreset.cs +++ b/Content.Server/GameTicking/GameTicker.GamePreset.cs @@ -251,7 +251,9 @@ public bool OnGhostAttempt(EntityUid mindId, bool canReturnGlobal, bool viaComma // (If the mob survives, that's a bug. Ghosting is kept regardless.) var canReturn = canReturnGlobal && _mind.IsCharacterDeadPhysically(mind); - if (canReturnGlobal && TryComp(playerEntity, out MobStateComponent? mobState)) + if (_configurationManager.GetCVar(CCVars.GhostKillCrit) && + canReturnGlobal && + TryComp(playerEntity, out MobStateComponent? mobState)) { if (_mobState.IsCritical(playerEntity.Value, mobState)) { diff --git a/Content.Server/Movement/Components/PullMoverComponent.cs b/Content.Server/Movement/Components/PullMoverComponent.cs deleted file mode 100644 index 19a01c6b17d..00000000000 --- a/Content.Server/Movement/Components/PullMoverComponent.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Content.Server.Movement.Components; - -/// -/// Added to an entity that is ctrl-click moving their pulled object. -/// -/// -/// This just exists so we don't have MoveEvent subs going off for every single mob constantly. -/// -[RegisterComponent] -public sealed partial class PullMoverComponent : Component -{ - -} diff --git a/Content.Server/Movement/Systems/PullController.cs b/Content.Server/Movement/Systems/PullController.cs index 72110ff67d2..f227d9c55cd 100644 --- a/Content.Server/Movement/Systems/PullController.cs +++ b/Content.Server/Movement/Systems/PullController.cs @@ -18,6 +18,7 @@ using Robust.Shared.Physics.Dynamics.Joints; using Robust.Shared.Player; using Robust.Shared.Timing; +using Robust.Shared.Utility; namespace Content.Server.Movement.Systems; @@ -91,7 +92,7 @@ public override void Initialize() UpdatesAfter.Add(typeof(MoverController)); SubscribeLocalEvent(OnPullStop); - SubscribeLocalEvent(OnPullerMove); + SubscribeLocalEvent(OnPullerMove); base.Initialize(); } @@ -155,19 +156,22 @@ private bool OnRequestMovePulledObject(ICommonSession? session, EntityCoordinate coords = fromUserCoords.WithEntityId(coords.EntityId); } - EnsureComp(player); var moving = EnsureComp(pulled!.Value); moving.MovingTo = coords; return false; } - private void OnPullerMove(EntityUid uid, PullMoverComponent component, ref MoveEvent args) + private void OnPullerMove(EntityUid uid, ActivePullerComponent component, ref MoveEvent args) { if (!_pullerQuery.TryComp(uid, out var puller)) return; if (puller.Pulling is not { } pullable) + { + DebugTools.Assert($"Failed to clean up puller: {ToPrettyString(uid)}"); + RemCompDeferred(uid, component); return; + } UpdatePulledRotation(uid, pullable); @@ -182,13 +186,7 @@ private void OnPullerMove(EntityUid uid, PullMoverComponent component, ref MoveE if (_physicsQuery.TryComp(uid, out var physics)) PhysicsSystem.WakeBody(uid, body: physics); - StopMove(uid, pullable); - } - - private void StopMove(Entity mover, Entity moving) - { - RemCompDeferred(mover.Owner); - RemCompDeferred(moving.Owner); + RemCompDeferred(pullable); } private void UpdatePulledRotation(EntityUid puller, EntityUid pulled) @@ -302,17 +300,5 @@ public override void UpdateBeforeSolve(bool prediction, float frameTime) PhysicsSystem.ApplyLinearImpulse(puller, -impulse); } } - - // Cleanup PullMover - var moverQuery = EntityQueryEnumerator(); - - while (moverQuery.MoveNext(out var uid, out _, out var puller)) - { - if (!HasComp(puller.Pulling)) - { - RemCompDeferred(uid); - continue; - } - } } } diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs index f372f7df1a5..746d75f0d85 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs @@ -281,15 +281,13 @@ public bool CanInsertModule(EntityUid uid, EntityUid module, BorgChassisComponen if (!TryComp(containedModuleUid, out var containedItemModuleComp)) continue; - for (int i = 0; i < itemModuleComp.Items.Count; i++) + if (containedItemModuleComp.Items.Count == itemModuleComp.Items.Count && + containedItemModuleComp.Items.All(itemModuleComp.Items.Contains)) { - if (itemModuleComp.Items[i] != containedItemModuleComp.Items[i]) - continue; + if (user != null) + Popup.PopupEntity(Loc.GetString("borg-module-duplicate"), uid, user.Value); + return false; } - - if (user != null) - Popup.PopupEntity(Loc.GetString("borg-module-duplicate"), uid, user.Value); - return false; } } diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 7c2d0e12bcf..355f70753a6 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1950,6 +1950,12 @@ public static readonly CVarDef public static readonly CVarDef GhostRoleTime = CVarDef.Create("ghost.role_time", 3f, CVar.REPLICATED | CVar.SERVER); + /// + /// Whether or not to kill the player's mob on ghosting, when it is in a critical health state. + /// + public static readonly CVarDef GhostKillCrit = + CVarDef.Create("ghost.kill_crit", true, CVar.REPLICATED | CVar.SERVER); + /* * Fire alarm */ diff --git a/Content.Shared/Clothing/Components/FactionClothingComponent.cs b/Content.Shared/Clothing/Components/FactionClothingComponent.cs new file mode 100644 index 00000000000..d49ee4f81d6 --- /dev/null +++ b/Content.Shared/Clothing/Components/FactionClothingComponent.cs @@ -0,0 +1,27 @@ +using Content.Shared.Clothing.EntitySystems; +using Content.Shared.NPC.Prototypes; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Clothing.Components; + +/// +/// When equipped, adds the wearer to a faction. +/// When removed, removes the wearer from a faction. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(FactionClothingSystem))] +public sealed partial class FactionClothingComponent : Component +{ + /// + /// Faction to add and remove. + /// + [DataField(required: true)] + public ProtoId Faction = string.Empty; + + /// + /// If true, the wearer was already part of the faction. + /// This prevents wrongly removing them after removing the item. + /// + [DataField] + public bool AlreadyMember; +} diff --git a/Content.Shared/Clothing/EntitySystems/FactionClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/FactionClothingSystem.cs new file mode 100644 index 00000000000..76b7b9aa66d --- /dev/null +++ b/Content.Shared/Clothing/EntitySystems/FactionClothingSystem.cs @@ -0,0 +1,42 @@ +using Content.Shared.Clothing.Components; +using Content.Shared.Inventory.Events; +using Content.Shared.NPC.Components; +using Content.Shared.NPC.Systems; + +namespace Content.Shared.Clothing.EntitySystems; + +/// +/// Handles faction adding and removal. +/// +public sealed class FactionClothingSystem : EntitySystem +{ + [Dependency] private readonly NpcFactionSystem _faction = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnEquipped); + SubscribeLocalEvent(OnUnequipped); + } + + private void OnEquipped(Entity ent, ref GotEquippedEvent args) + { + TryComp(args.Equipee, out var factionComp); + var faction = (args.Equipee, factionComp); + ent.Comp.AlreadyMember = _faction.IsMember(faction, ent.Comp.Faction); + + _faction.AddFaction(faction, ent.Comp.Faction); + } + + private void OnUnequipped(Entity ent, ref GotUnequippedEvent args) + { + if (ent.Comp.AlreadyMember) + { + ent.Comp.AlreadyMember = false; + return; + } + + _faction.RemoveFaction(args.Equipee, ent.Comp.Faction); + } +} diff --git a/Content.Shared/Clothing/MagbootsComponent.cs b/Content.Shared/Clothing/MagbootsComponent.cs index 0d074ff38b6..b3fb607a38b 100644 --- a/Content.Shared/Clothing/MagbootsComponent.cs +++ b/Content.Shared/Clothing/MagbootsComponent.cs @@ -20,4 +20,10 @@ public sealed partial class MagbootsComponent : Component [DataField] public ProtoId MagbootsAlert = "Magboots"; + + /// + /// If true, the user must be standing on a grid or planet map to experience the weightlessness-canceling effect + /// + [DataField] + public bool RequiresGrid = true; } diff --git a/Content.Shared/Clothing/SharedMagbootsSystem.cs b/Content.Shared/Clothing/SharedMagbootsSystem.cs index bb3b05074f2..68145936152 100644 --- a/Content.Shared/Clothing/SharedMagbootsSystem.cs +++ b/Content.Shared/Clothing/SharedMagbootsSystem.cs @@ -17,6 +17,7 @@ public sealed class SharedMagbootsSystem : EntitySystem [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly ClothingSpeedModifierSystem _clothingSpeedModifier = default!; [Dependency] private readonly ClothingSystem _clothing = default!; + [Dependency] private readonly SharedGravitySystem _gravity = default!; [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly SharedActionsSystem _sharedActions = default!; [Dependency] private readonly SharedActionsSystem _actionContainer = default!; @@ -147,6 +148,10 @@ private void OnIsWeightless(Entity ent, ref InventoryRelayedE if (!ent.Comp.On) return; + // do not cancel weightlessness if the person is in off-grid. + if (ent.Comp.RequiresGrid && !_gravity.EntityOnGravitySupportingGridOrMap(ent.Owner)) + return; + args.Args.IsWeightless = false; args.Args.Handled = true; } diff --git a/Content.Shared/Gravity/SharedGravitySystem.cs b/Content.Shared/Gravity/SharedGravitySystem.cs index 42a6d5d1f80..2f532d0f1d3 100644 --- a/Content.Shared/Gravity/SharedGravitySystem.cs +++ b/Content.Shared/Gravity/SharedGravitySystem.cs @@ -17,6 +17,8 @@ public abstract partial class SharedGravitySystem : EntitySystem [ValidatePrototypeId] public const string WeightlessAlert = "Weightless"; + private EntityQuery _gravityQuery; + public bool IsWeightless(EntityUid uid, PhysicsComponent? body = null, TransformComponent? xform = null) { Resolve(uid, ref body, false); @@ -36,15 +38,35 @@ public bool IsWeightless(EntityUid uid, PhysicsComponent? body = null, Transform return true; // If grid / map has gravity - if (TryComp(xform.GridUid, out var gravity) && gravity.Enabled || - TryComp(xform.MapUid, out var mapGravity) && mapGravity.Enabled) - { + if (EntityGridOrMapHaveGravity((uid, xform))) return false; - } return true; } + /// + /// Checks if a given entity is currently standing on a grid or map that supports having gravity at all. + /// + public bool EntityOnGravitySupportingGridOrMap(Entity entity) + { + entity.Comp ??= Transform(entity); + + return _gravityQuery.HasComp(entity.Comp.GridUid) || + _gravityQuery.HasComp(entity.Comp.MapUid); + } + + + /// + /// Checks if a given entity is currently standing on a grid or map that has gravity of some kind. + /// + public bool EntityGridOrMapHaveGravity(Entity entity) + { + entity.Comp ??= Transform(entity); + + return _gravityQuery.TryComp(entity.Comp.GridUid, out var gravity) && gravity.Enabled || + _gravityQuery.TryComp(entity.Comp.MapUid, out var mapGravity) && mapGravity.Enabled; + } + public override void Initialize() { base.Initialize(); @@ -54,6 +76,8 @@ public override void Initialize() SubscribeLocalEvent(OnGravityChange); SubscribeLocalEvent(OnGetState); SubscribeLocalEvent(OnHandleState); + + _gravityQuery = GetEntityQuery(); } public override void Update(float frameTime) diff --git a/Content.Shared/Mobs/Systems/MobStateSystem.StateMachine.cs b/Content.Shared/Mobs/Systems/MobStateSystem.StateMachine.cs index 2fa522dea59..5928b3871ff 100644 --- a/Content.Shared/Mobs/Systems/MobStateSystem.StateMachine.cs +++ b/Content.Shared/Mobs/Systems/MobStateSystem.StateMachine.cs @@ -16,7 +16,8 @@ public partial class MobStateSystem /// If the entity can be set to that MobState public bool HasState(EntityUid entity, MobState mobState, MobStateComponent? component = null) { - return Resolve(entity, ref component, false) && component.AllowedStates.Contains(mobState); + return _mobStateQuery.Resolve(entity, ref component, false) && + component.AllowedStates.Contains(mobState); } /// @@ -27,7 +28,7 @@ public bool HasState(EntityUid entity, MobState mobState, MobStateComponent? com /// Entity that caused the state update (if applicable) public void UpdateMobState(EntityUid entity, MobStateComponent? component = null, EntityUid? origin = null) { - if (!Resolve(entity, ref component)) + if (!_mobStateQuery.Resolve(entity, ref component)) return; var ev = new UpdateMobStateEvent {Target = entity, Component = component, Origin = origin}; @@ -46,7 +47,7 @@ public void UpdateMobState(EntityUid entity, MobStateComponent? component = null public void ChangeMobState(EntityUid entity, MobState mobState, MobStateComponent? component = null, EntityUid? origin = null) { - if (!Resolve(entity, ref component)) + if (!_mobStateQuery.Resolve(entity, ref component)) return; ChangeState(entity, component, mobState, origin: origin); diff --git a/Content.Shared/Mobs/Systems/MobStateSystem.cs b/Content.Shared/Mobs/Systems/MobStateSystem.cs index a3886dd42e1..323efa22428 100644 --- a/Content.Shared/Mobs/Systems/MobStateSystem.cs +++ b/Content.Shared/Mobs/Systems/MobStateSystem.cs @@ -2,7 +2,6 @@ using Content.Shared.Administration.Logs; using Content.Shared.Mobs.Components; using Content.Shared.Standing; -using Robust.Shared.GameStates; using Robust.Shared.Physics.Systems; using Robust.Shared.Timing; @@ -20,9 +19,12 @@ public partial class MobStateSystem : EntitySystem [Dependency] private readonly IGameTiming _timing = default!; private ISawmill _sawmill = default!; + private EntityQuery _mobStateQuery; + public override void Initialize() { _sawmill = _logManager.GetSawmill("MobState"); + _mobStateQuery = GetEntityQuery(); base.Initialize(); SubscribeEvents(); } @@ -37,7 +39,7 @@ public override void Initialize() /// If the entity is alive public bool IsAlive(EntityUid target, MobStateComponent? component = null) { - if (!Resolve(target, ref component, false)) + if (!_mobStateQuery.Resolve(target, ref component, false)) return false; return component.CurrentState == MobState.Alive; } @@ -50,7 +52,7 @@ public bool IsAlive(EntityUid target, MobStateComponent? component = null) /// If the entity is Critical public bool IsCritical(EntityUid target, MobStateComponent? component = null) { - if (!Resolve(target, ref component, false)) + if (!_mobStateQuery.Resolve(target, ref component, false)) return false; return component.CurrentState == MobState.Critical; } @@ -63,7 +65,7 @@ public bool IsCritical(EntityUid target, MobStateComponent? component = null) /// If the entity is Dead public bool IsDead(EntityUid target, MobStateComponent? component = null) { - if (!Resolve(target, ref component, false)) + if (!_mobStateQuery.Resolve(target, ref component, false)) return false; return component.CurrentState == MobState.Dead; } @@ -76,7 +78,7 @@ public bool IsDead(EntityUid target, MobStateComponent? component = null) /// If the entity is Critical or Dead public bool IsIncapacitated(EntityUid target, MobStateComponent? component = null) { - if (!Resolve(target, ref component, false)) + if (!_mobStateQuery.Resolve(target, ref component, false)) return false; return component.CurrentState is MobState.Critical or MobState.Dead; } @@ -89,14 +91,10 @@ public bool IsIncapacitated(EntityUid target, MobStateComponent? component = nul /// If the entity is in an Invalid State public bool IsInvalidState(EntityUid target, MobStateComponent? component = null) { - if (!Resolve(target, ref component, false)) + if (!_mobStateQuery.Resolve(target, ref component, false)) return false; return component.CurrentState is MobState.Invalid; } #endregion - - #region Private Implementation - - #endregion } diff --git a/Content.Shared/Movement/Pulling/Components/ActivePullerComponent.cs b/Content.Shared/Movement/Pulling/Components/ActivePullerComponent.cs new file mode 100644 index 00000000000..83bfd9f7954 --- /dev/null +++ b/Content.Shared/Movement/Pulling/Components/ActivePullerComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Shared.Movement.Pulling.Components; + +/// +/// Component that indicates that an entity is currently pulling some other entity. +/// +[RegisterComponent] +public sealed partial class ActivePullerComponent : Component; diff --git a/Content.Shared/Movement/Pulling/Components/PullerComponent.cs b/Content.Shared/Movement/Pulling/Components/PullerComponent.cs index f47ae32f90b..32e4d9b1f31 100644 --- a/Content.Shared/Movement/Pulling/Components/PullerComponent.cs +++ b/Content.Shared/Movement/Pulling/Components/PullerComponent.cs @@ -9,7 +9,7 @@ namespace Content.Shared.Movement.Pulling.Components; /// /// Specifies an entity as being able to pull another entity with /// -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] [Access(typeof(PullingSystem))] public sealed partial class PullerComponent : Component { diff --git a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs index 161868370ea..72b87476bb0 100644 --- a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs +++ b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs @@ -61,6 +61,7 @@ public override void Initialize() SubscribeLocalEvent(OnPullableContainerInsert); SubscribeLocalEvent(OnModifyUncuffDuration); + SubscribeLocalEvent(OnAfterState); SubscribeLocalEvent(OnPullerContainerInsert); SubscribeLocalEvent(OnPullerUnpaused); SubscribeLocalEvent(OnVirtualItemDeleted); @@ -72,6 +73,14 @@ public override void Initialize() .Register(); } + private void OnAfterState(Entity ent, ref AfterAutoHandleStateEvent args) + { + if (ent.Comp.Pulling == null) + RemComp(ent.Owner); + else + EnsureComp(ent.Owner); + } + private void OnDropHandItems(EntityUid uid, PullerComponent pullerComp, DropHandItemsEvent args) { if (pullerComp.Pulling == null || pullerComp.NeedsHands) @@ -228,6 +237,9 @@ private void StopPulling(EntityUid pullableUid, PullableComponent pullableComp) } var oldPuller = pullableComp.Puller; + if (oldPuller != null) + RemComp(oldPuller.Value); + pullableComp.PullJointId = null; pullableComp.Puller = null; Dirty(pullableUid, pullableComp); @@ -410,6 +422,7 @@ public bool TryStartPull(EntityUid pullerUid, EntityUid pullableUid, // Use net entity so it's consistent across client and server. pullableComp.PullJointId = $"pull-joint-{GetNetEntity(pullableUid)}"; + EnsureComp(pullerUid); pullerComp.Pulling = pullableUid; pullableComp.Puller = pullerUid; diff --git a/Content.Shared/Preferences/Loadouts/RoleLoadout.cs b/Content.Shared/Preferences/Loadouts/RoleLoadout.cs index 687eb49a28e..0361b52e667 100644 --- a/Content.Shared/Preferences/Loadouts/RoleLoadout.cs +++ b/Content.Shared/Preferences/Loadouts/RoleLoadout.cs @@ -126,25 +126,35 @@ public void EnsureValid(HumanoidCharacterProfile profile, ICommonSession session // If you put invalid ones first but that's your fault for not using sensible defaults if (loadouts.Count < groupProto.MinLimit) { - for (var i = 0; i < Math.Min(groupProto.MinLimit, groupProto.Loadouts.Count); i++) + var validLoadoutsCount = 0; + var j = 0; + + // Loop while we need more valid loadouts and we haven't exhausted the list of loadouts + while (validLoadoutsCount < groupProto.MinLimit && j < groupProto.Loadouts.Count) { - if (!protoManager.TryIndex(groupProto.Loadouts[i], out var loadoutProto)) + if (!protoManager.TryIndex(groupProto.Loadouts[j], out var loadoutProto)) + { + j++; continue; + } var defaultLoadout = new Loadout() { Prototype = loadoutProto.ID, }; - if (loadouts.Contains(defaultLoadout)) - continue; - // Not valid so don't default to it anyway. - if (!IsValid(profile, session, defaultLoadout.Prototype, collection, sponsorPrototypes, out _)) // Sunrise-Sponsors + if (!IsValid(profile, session, defaultLoadout.Prototype, collection, sponsorPrototypes, out _)) + { + j++; // Move to the next loadout continue; + } loadouts.Add(defaultLoadout); Apply(loadoutProto); + + validLoadoutsCount++; + j++; } } diff --git a/Content.Tests/Shared/Alert/ServerAlertsComponentTests.cs b/Content.Tests/Shared/Alert/ServerAlertsComponentTests.cs deleted file mode 100644 index bcc32e13dee..00000000000 --- a/Content.Tests/Shared/Alert/ServerAlertsComponentTests.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System.IO; -using Content.Server.Alert; -using Content.Shared.Alert; -using NUnit.Framework; -using Robust.Shared.GameObjects; -using Robust.Shared.GameStates; -using Robust.Shared.IoC; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.Manager; - -namespace Content.Tests.Shared.Alert -{ - [TestFixture] - [TestOf(typeof(AlertsComponent))] - public sealed class ServerAlertsComponentTests : ContentUnitTest - { - const string PROTOTYPES = @" -- type: alertCategory - id: Pressure - -- type: alert - id: LowPressure - category: Pressure - icon: /Textures/Interface/Alerts/Pressure/lowpressure.png - -- type: alert - id: HighPressure - category: Pressure - icon: /Textures/Interface/Alerts/Pressure/highpressure.png -"; - - [Test] - [Ignore("There is no way to load extra Systems in a unit test, fixing RobustUnitTest is out of scope.")] - public void ShowAlerts() - { - // this is kind of unnecessary because there's integration test coverage of Alert components - // but wanted to keep it anyway to see what's possible w.r.t. testing components - // in a unit test - - var entManager = IoCManager.Resolve(); - IoCManager.Resolve().Initialize(); - var prototypeManager = IoCManager.Resolve(); - prototypeManager.Initialize(); - var factory = IoCManager.Resolve(); - factory.RegisterClass(); - prototypeManager.LoadFromStream(new StringReader(PROTOTYPES)); - prototypeManager.ResolveResults(); - - var entSys = entManager.EntitySysManager; - entSys.LoadExtraSystemType(); - - var alertsComponent = new AlertsComponent(); - alertsComponent = IoCManager.InjectDependencies(alertsComponent); - - Assert.That(entManager.System().TryGet("LowPressure", out var lowpressure)); - Assert.That(entManager.System().TryGet("HighPressure", out var highpressure)); - - entManager.System().ShowAlert(alertsComponent.Owner, "LowPressure"); - - var getty = new ComponentGetState(); - entManager.EventBus.RaiseComponentEvent(alertsComponent, getty); - - var alertState = (AlertsComponent.AlertsComponent_AutoState) getty.State!; - Assert.That(alertState, Is.Not.Null); - Assert.That(alertState.Alerts.Count, Is.EqualTo(1)); - Assert.That(alertState.Alerts.ContainsKey(lowpressure!.AlertKey)); - - entManager.System().ShowAlert(alertsComponent.Owner, "HighPressure"); - - // Lazy - entManager.EventBus.RaiseComponentEvent(alertsComponent, getty); - alertState = (AlertsComponent.AlertsComponent_AutoState) getty.State!; - Assert.That(alertState.Alerts.Count, Is.EqualTo(1)); - Assert.That(alertState.Alerts.ContainsKey(highpressure!.AlertKey)); - - entManager.System().ClearAlertCategory(alertsComponent.Owner, "Pressure"); - - entManager.EventBus.RaiseComponentEvent(alertsComponent, getty); - alertState = (AlertsComponent.AlertsComponent_AutoState) getty.State!; - Assert.That(alertState.Alerts.Count, Is.EqualTo(0)); - } - } -} diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0a127c4684e..b3d8fff8131 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,57 +1,4 @@ Entries: -- author: Boaz1111 - changes: - - message: Added an industrial reagent grinder to the basic hydroponics research. - It grinds things into reagents like a recycler. - type: Add - id: 6254 - time: '2024-03-30T02:46:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25020 -- author: SonicHDC - changes: - - message: Added unzipping for lab coats! - type: Add - id: 6255 - time: '2024-03-30T03:31:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26494 -- author: Zealith-Gamer - changes: - - message: Items being pulled no longer spin when being thrown. - type: Fix - id: 6256 - time: '2024-03-30T03:35:43.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26504 -- author: Plykiya - changes: - - message: Hyposprays can now be toggled to draw from solution containers like jugs - and beakers. - type: Tweak - id: 6257 - time: '2024-03-30T03:59:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25544 -- author: EdenTheLiznerd - changes: - - message: Amanita toxin now kills you slightly slower, providing you time to seek - charcoal before it's too late - type: Tweak - id: 6258 - time: '2024-03-30T04:00:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25830 -- author: liltenhead - changes: - - message: Changed the syndicate hardbomb to have less of a chance to completely - destroy tiles. - type: Tweak - id: 6259 - time: '2024-03-30T04:36:33.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26548 -- author: takemysoult - changes: - - message: stimulants removes chloral hydrate from body - type: Tweak - id: 6260 - time: '2024-03-30T06:52:27.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25886 - author: Flareguy changes: - message: Removed SCAF armor. @@ -3860,3 +3807,55 @@ id: 6753 time: '2024-06-15T22:38:29.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29018 +- author: Keer-Sar + changes: + - message: Fixed a spelling error in the cargo bounty for lungs. + type: Fix + id: 6754 + time: '2024-06-16T00:24:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29064 +- author: Keer-Sar + changes: + - message: Non-humanoids' names are now capitalized when inserting materials into + machines. + type: Fix + id: 6755 + time: '2024-06-16T02:06:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29071 +- author: EmoGarbage404 + changes: + - message: Magboots no longer work when off-grid. + type: Fix + id: 6756 + time: '2024-06-16T03:38:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29034 +- author: deltanedas + changes: + - message: Tarantulas now use Mechanotoxin, a venom that slows you down over time. + type: Tweak + id: 6757 + time: '2024-06-16T11:26:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29066 +- author: Cojoke-dot + changes: + - message: Musicians can now select instruments in their loadout + type: Add + id: 6758 + time: '2024-06-16T11:27:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29059 +- author: ElectroJr + changes: + - message: Fixed pianos, office chairs & other objects not rotating while being + pulled. + type: Fix + id: 6759 + time: '2024-06-16T11:30:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29032 +- author: deltanedas + changes: + - message: Added the Carp Hardsuit to the uplink which is spaceproof and makes carp + think you are one of them. + type: Add + id: 6760 + time: '2024-06-16T11:57:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25155 diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index f240c952475..15d75d4487a 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, Afrokada, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlexUm418, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, Baptr0b0t, BasedUser, beck-thompson, BellwetherLogic, BGare, bhenrich, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blueDev2, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, Callmore, CaptainSqrBeard, Carbonhell, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, Ciac32, clement-or, Clyybber, Cojoke-dot, ColdAutumnRain, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, deepy, Delete69, deltanedas, DerbyX, DexlerXD, Doctor-Cpu, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DoutorWhite, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, DuskyJay, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, freeman2651, Froffy025, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Ghagliiarghii, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, gusxyz, Gyrandola, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, hitomishirichan, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, Jark255, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, K-Dynamic, KaiShibaa, kalane15, kalanosh, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, LetterN, Level10Cybermancer, lever1209, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, luckyshotpictures, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Mangohydra, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, pigeonpeas, pissdemon, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, PursuitInAshes, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, RamZ, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, RumiTiger, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, shampunj, SignalWalker, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, snebl, Snowni, snowsignal, SonicHDC, SoulFN, SoulSloth, SpaceManiac, SpeltIncorrectyl, SphiraI, spoogemonster, ssdaniel24, Stealthbomber16, StrawberryMoses, superjj18, SweptWasTaken, Szunti, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, Terraspark4941, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UBlueberry, UKNOWH, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, volundr-, Voomra, Vordenburg, vulppine, wafehling, waylon531, weaversam8, whateverusername0, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aeshus, Aexxie, Afrokada, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlexUm418, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, Baptr0b0t, BasedUser, beck-thompson, BellwetherLogic, BGare, bhenrich, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blueDev2, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, Callmore, CaptainSqrBeard, Carbonhell, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, Ciac32, clement-or, Clyybber, Cojoke-dot, ColdAutumnRain, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, deepy, Delete69, deltanedas, DerbyX, DexlerXD, dffdff2423, Doctor-Cpu, DoctorBeard, DogZeroX, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, freeman2651, Froffy025, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Ghagliiarghii, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, gusxyz, Gyrandola, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, hitomishirichan, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, Jackal298, Jackrost, jamessimo, janekvap, Jark255, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTrotter, K-Dynamic, KaiShibaa, kalane15, kalanosh, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, LetterN, Level10Cybermancer, lever1209, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, luckyshotpictures, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Mangohydra, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, MjrLandWhale, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, pigeonpeas, pissdemon, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, PursuitInAshes, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, RamZ, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, RumiTiger, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, shampunj, SignalWalker, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, snebl, Snowni, snowsignal, SonicHDC, SoulFN, SoulSloth, SpaceManiac, SpeltIncorrectyl, SphiraI, spoogemonster, ssdaniel24, Stealthbomber16, StrawberryMoses, superjj18, SweptWasTaken, Szunti, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, Terraspark4941, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UBlueberry, UKNOWH, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, volundr-, Voomra, Vordenburg, vulppine, wafehling, waylon531, weaversam8, whateverusername0, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zonespace27, Zumorica, Zymem diff --git a/Resources/Locale/en-US/cargo/bounties.ftl b/Resources/Locale/en-US/cargo/bounties.ftl index b332517c70d..09424e49097 100644 --- a/Resources/Locale/en-US/cargo/bounties.ftl +++ b/Resources/Locale/en-US/cargo/bounties.ftl @@ -89,7 +89,7 @@ bounty-description-instrument = The hottest new band in the galaxy, Cindy Kate a bounty-description-knife = One of our top commanders recently won a brand new set of knives on an official Nanotrasen gameshow. Unforunately, we don't have a set on hand. Send us a bunch of sharp things so we can throw something together, bounty-description-lemon = Dr Jones's kid is starting up a lemonade stand. Small issue: lemons don't get shipped to this sector. Fix that for a nice reward. bounty-description-lime = After a heavy drinking session, Admiral Pastich developed a strong addiction to fresh lime wedges. Send us some limes so we can prepare him his new favorite snack. -bounty-description-lung = The pro-smoking league has been fighting to keep cigarettes on our stations for millennia. Unfortunately, they're lungs aren't fighting so hard anymore. Send them some new ones. +bounty-description-lung = The pro-smoking league has been fighting to keep cigarettes on our stations for millennia. Unfortunately, their lungs aren't fighting so hard anymore. Send them some new ones. bounty-description-monkey-cube = Due to a recent genetics accident, Central Command is in serious need of monkeys. Your mission is to ship monkey cubes. bounty-description-mouse = Station 13 ran out of freeze-dried mice. Ship some fresh ones so their janitor doesn't go on strike. bounty-description-pancake = Here at Nanotrasen we consider employees to be family. And you know what families love? Pancakes. Ship a baker's dozen. diff --git a/Resources/Locale/en-US/machine/machine.ftl b/Resources/Locale/en-US/machine/machine.ftl index ce8873df6f8..13d9e76b9d2 100644 --- a/Resources/Locale/en-US/machine/machine.ftl +++ b/Resources/Locale/en-US/machine/machine.ftl @@ -1,4 +1,4 @@ -machine-insert-item = {THE($user)} inserted {THE($item)} into {THE($machine)}. +machine-insert-item = {CAPITALIZE(THE($user))} inserted {THE($item)} into {THE($machine)}. machine-upgrade-examinable-verb-text = Upgrades machine-upgrade-examinable-verb-message = Examine the machine upgrades. diff --git a/Resources/Locale/en-US/preferences/loadout-groups.ftl b/Resources/Locale/en-US/preferences/loadout-groups.ftl index 28863268dfc..a107ee24f84 100644 --- a/Resources/Locale/en-US/preferences/loadout-groups.ftl +++ b/Resources/Locale/en-US/preferences/loadout-groups.ftl @@ -2,6 +2,7 @@ loadout-group-trinkets = Trinkets loadout-group-glasses = Glasses loadout-group-backpack = Backpack +loadout-group-instruments = Instruments # Command loadout-group-captain-head = Captain head diff --git a/Resources/Locale/en-US/reagents/meta/toxins.ftl b/Resources/Locale/en-US/reagents/meta/toxins.ftl index 09b135e7f54..85dd9a3b6fb 100644 --- a/Resources/Locale/en-US/reagents/meta/toxins.ftl +++ b/Resources/Locale/en-US/reagents/meta/toxins.ftl @@ -78,3 +78,6 @@ reagent-desc-tazinide = A highly dangerous metallic mixture which can interfere reagent-name-lipolicide = lipolicide reagent-desc-lipolicide = A powerful toxin that will destroy fat cells, massively reducing body weight in a short time. Deadly to those without nutriment in their body. + +reagent-name-mechanotoxin = mechanotoxin +reagent-desc-mechanotoxin = A neurotoxin used as venom by some species of spider. Degrades movement when built up. diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 78c094926f1..2598970cefb 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -312,6 +312,9 @@ uplink-clothing-shoes-boots-mag-syndie-desc = A pair of boots that prevent slipp uplink-eva-syndie-name = Syndicate EVA Bundle uplink-eva-syndie-desc = A simple EVA suit that offers no protection other than what's needed to survive in space. +uplink-hardsuit-carp-name = Carp Hardsuit +uplink-hardsuit-carp-desc = Looks like an ordinary carp suit, except fully spaceproof and tricks space carp into thinking you are one of them. + uplink-hardsuit-syndie-name = Syndicate Hardsuit uplink-hardsuit-syndie-desc = The Syndicate's well known armored blood red hardsuit, capable of space walks and bullet resistant. diff --git a/Resources/Locale/ru-RU/_sunrise/preferences/loadout-groups.ftl b/Resources/Locale/ru-RU/_sunrise/preferences/loadout-groups.ftl index 5041b7df693..93b5872bcf4 100644 --- a/Resources/Locale/ru-RU/_sunrise/preferences/loadout-groups.ftl +++ b/Resources/Locale/ru-RU/_sunrise/preferences/loadout-groups.ftl @@ -8,3 +8,5 @@ loadout-group-blueshield-jumpsuit = Офицер «Синий Щит», комб loadout-group-bodycam = Бодикамера loadout-group-security-trinkets = Безделушки СБ loadout-group-corporate-law = Корпоративный Закон +loadout-group-centcomm-operator-jumpsuit = Униформа ОЦК +loadout-group-centcomm-operator-head-hat = Головой убор ОЦК diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index b8cd6e61328..3717116c36d 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -1276,6 +1276,17 @@ categories: - UplinkWearables +- type: listing + id: UplinkHardsuitCarp + name: uplink-hardsuit-carp-name + description: uplink-hardsuit-carp-desc + icon: { sprite: /Textures/Clothing/OuterClothing/Suits/carpsuit.rsi, state: icon } + productEntity: ClothingOuterHardsuitCarp + cost: + Telecrystal: 4 + categories: + - UplinkWearables + - type: listing id: UplinkHardsuitSyndie name: uplink-hardsuit-syndie-name diff --git a/Resources/Prototypes/Entities/Clothing/Head/hoods.yml b/Resources/Prototypes/Entities/Clothing/Head/hoods.yml index b62834dd98e..db187069123 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hoods.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hoods.yml @@ -206,6 +206,22 @@ slots: - Hair +- type: entity + parent: ClothingHeadHatHoodCarp + id: ClothingHeadHelmetHardsuitCarp + noSpawn: true + components: + - type: PressureProtection + highPressureMultiplier: 0.6 + lowPressureMultiplier: 1000 + - type: TemperatureProtection + coefficient: 0.2 + - type: BreathMask + # this is on the hood so you only fool the fish if you wear the whole set + # wear carp suit and security helmet, they'll know you are fake + - type: FactionClothing + faction: Dragon + - type: entity parent: ClothingHeadBase id: ClothingHeadHatHoodMoth diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml index ccf6f09b194..79c116b3cad 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml @@ -257,3 +257,16 @@ - type: ContainerContainer containers: toggleable-clothing: !type:ContainerSlot {} + +- type: entity + parent: ClothingOuterSuitCarp + id: ClothingOuterHardsuitCarp + suffix: Hardsuit, DO NOT MAP + components: + - type: PressureProtection + highPressureMultiplier: 0.6 + lowPressureMultiplier: 1000 + - type: TemperatureProtection + coefficient: 0.01 + - type: ToggleableClothing + clothingPrototype: ClothingHeadHelmetHardsuitCarp diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml b/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml index e80ed74305c..d934a8b97e1 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml @@ -81,7 +81,7 @@ price: 3000 - type: entity - parent: ClothingShoesBase + parent: [ClothingShoesBootsMag, BaseJetpack] id: ClothingShoesBootsMagSyndie name: blood-red magboots description: Reverse-engineered magnetic boots that have a heavy magnetic pull and integrated thrusters. @@ -106,27 +106,9 @@ moles: - 0.153853429 # oxygen - 0.153853429 # nitrogen - - type: ActivatableUI - key: enum.SharedGasTankUiKey.Key - - type: UserInterface - interfaces: - enum.SharedGasTankUiKey.Key: - type: GasTankBoundUserInterface - - type: Explosive - explosionType: Default - maxIntensity: 20 - - type: Jetpack - moleUsage: 0.00085 - - type: CanMoveInAir - - type: InputMover - toParent: true - - type: MovementSpeedModifier - weightlessAcceleration: 1 - weightlessFriction: 0.3 - weightlessModifier: 1.2 - - type: Tag - tags: - - WhitelistChameleon + - type: Item + sprite: null + size: Normal - type: entity id: ActionBaseToggleMagboots diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index e73856e34c6..519835265ec 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -2229,7 +2229,7 @@ solution: melee generated: reagents: - - ReagentId: Toxin + - ReagentId: Mechanotoxin Quantity: 1 - type: MeleeChemicalInjector transferAmount: 0.75 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 3a77dbab4c9..10bc7861fac 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -15,7 +15,7 @@ true - type: NpcFactionMember factions: - - SimpleHostile + - Dragon - type: Sprite drawdepth: Mobs sprite: Mobs/Aliens/Carps/space.rsi diff --git a/Resources/Prototypes/Entities/Structures/Power/apc.yml b/Resources/Prototypes/Entities/Structures/Power/apc.yml index 71e45064954..1621ac858cd 100644 --- a/Resources/Prototypes/Entities/Structures/Power/apc.yml +++ b/Resources/Prototypes/Entities/Structures/Power/apc.yml @@ -35,21 +35,26 @@ - state: display-charging shader: unshaded map: ["enum.ApcVisualLayers.ChargeState"] - - state: lock0-unlocked + - state: lock0-locked shader: unshaded map: ["enum.ApcVisualLayers.InterfaceLock"] - - state: lock1-unlocked + visible: false + - state: lock1-locked shader: unshaded map: ["enum.ApcVisualLayers.PanelLock"] - - state: channel0-auto_on + visible: false + - state: lock1-locked #when these are implemented get actual sprites. shader: unshaded map: ["enum.ApcVisualLayers.Equipment"] - - state: channel1-auto_on + visible: false + - state: lock1-locked shader: unshaded map: ["enum.ApcVisualLayers.Lighting"] - - state: channel2-auto_on + visible: false + - state: lock1-locked shader: unshaded map: ["enum.ApcVisualLayers.Environment"] + visible: false - type: Appearance - type: ApcVisuals - type: Battery diff --git a/Resources/Prototypes/Entities/Structures/Power/substation.yml b/Resources/Prototypes/Entities/Structures/Power/substation.yml index 347b18ecaee..692f027386b 100644 --- a/Resources/Prototypes/Entities/Structures/Power/substation.yml +++ b/Resources/Prototypes/Entities/Structures/Power/substation.yml @@ -23,8 +23,8 @@ - type: ExaminableBattery - type: PointLight radius: 1.5 - energy: 1.6 - color: "#3db83b" + energy: 1 + color: "#ff6900" castShadows: false - type: NodeContainer examinable: true @@ -126,10 +126,11 @@ path: /Audio/Ambience/Objects/buzzing.ogg - type: PointLight radius: 1.5 - energy: 1.6 - color: "#3db83b" + energy: 1 + color: "#ff6900" netsync: false castShadows: false + offset: 0, -0.2 - type: Clickable - type: AccessReader access: [["Engineering"]] @@ -151,7 +152,7 @@ sprite: Structures/Power/substation.rsi layers: - state: substation_wall - - state: screen + - state: screen_wall shader: unshaded - type: Battery maxCharge: 2000000 diff --git a/Resources/Prototypes/Loadouts/Jobs/Civilian/musician.yml b/Resources/Prototypes/Loadouts/Jobs/Civilian/musician.yml index c26da03628e..486ff25d47c 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Civilian/musician.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Civilian/musician.yml @@ -6,4 +6,4 @@ - type: startingGear id: MusicianWintercoat equipment: - outerClothing: ClothingOuterWinterMusician \ No newline at end of file + outerClothing: ClothingOuterWinterMusician diff --git a/Resources/Prototypes/Loadouts/Miscellaneous/instruments.yml b/Resources/Prototypes/Loadouts/Miscellaneous/instruments.yml new file mode 100644 index 00000000000..5b7e46151fe --- /dev/null +++ b/Resources/Prototypes/Loadouts/Miscellaneous/instruments.yml @@ -0,0 +1,280 @@ +# Instruments +- type: loadout + id: Glockenspiel + equipment: Glockenspiel + +- type: startingGear + id: Glockenspiel + storage: + back: + - GlockenspielInstrument + +- type: loadout + id: MusicBox + equipment: MusicBox + +- type: startingGear + id: MusicBox + storage: + back: + - MusicBoxInstrument + +- type: loadout + id: Xylophone + equipment: Xylophone + +- type: startingGear + id: Xylophone + storage: + back: + - XylophoneInstrument + +- type: loadout + id: Microphone + equipment: Microphone + +- type: startingGear + id: Microphone + storage: + back: + - MicrophoneInstrument + +- type: loadout + id: Synthesizer + equipment: Synthesizer + +- type: startingGear + id: Synthesizer + storage: + back: + - SynthesizerInstrument + +- type: loadout + id: Kalimba + equipment: Kalimba + +- type: startingGear + id: Kalimba + storage: + back: + - KalimbaInstrument + +- type: loadout + id: Woodblock + equipment: Woodblock + +- type: startingGear + id: Woodblock + storage: + back: + - WoodblockInstrument + +- type: loadout + id: ElectricGuitar + equipment: ElectricGuitar + +- type: startingGear + id: ElectricGuitar + storage: + back: + - ElectricGuitarInstrument + +- type: loadout + id: BassGuitar + equipment: BassGuitar + +- type: startingGear + id: BassGuitar + storage: + back: + - BassGuitarInstrument + +- type: loadout + id: RockGuitar + equipment: RockGuitar + +- type: startingGear + id: RockGuitar + storage: + back: + - RockGuitarInstrument + +- type: loadout + id: AcousticGuitar + equipment: AcousticGuitar + +- type: startingGear + id: AcousticGuitar + storage: + back: + - AcousticGuitarInstrument + +- type: loadout + id: Banjo + equipment: Banjo + +- type: startingGear + id: Banjo + storage: + back: + - BanjoInstrument + +- type: loadout + id: Violin + equipment: Violin + +- type: startingGear + id: Violin + storage: + back: + - ViolinInstrument + +- type: loadout + id: Viola + equipment: Viola + +- type: startingGear + id: Viola + storage: + back: + - ViolaInstrument + +- type: loadout + id: Cello + equipment: Cello + +- type: startingGear + id: Cello + storage: + back: + - CelloInstrument + +- type: loadout + id: Trumpet + equipment: Trumpet + +- type: startingGear + id: Trumpet + storage: + back: + - TrumpetInstrument + +- type: loadout + id: Trombone + equipment: Trombone + +- type: startingGear + id: Trombone + storage: + back: + - TromboneInstrument + +- type: loadout + id: FrenchHorn + equipment: FrenchHorn + +- type: startingGear + id: FrenchHorn + storage: + back: + - FrenchHornInstrument + +- type: loadout + id: Euphonium + equipment: Euphonium + +- type: startingGear + id: Euphonium + storage: + back: + - EuphoniumInstrument + +- type: loadout + id: Saxophone + equipment: Saxophone + +- type: startingGear + id: Saxophone + storage: + back: + - SaxophoneInstrument + +- type: loadout + id: Accordion + equipment: Accordion + +- type: startingGear + id: Accordion + storage: + back: + - AccordionInstrument + +- type: loadout + id: Harmonica + equipment: Harmonica + +- type: startingGear + id: Harmonica + storage: + back: + - HarmonicaInstrument + +- type: loadout + id: Clarinet + equipment: Clarinet + +- type: startingGear + id: Clarinet + storage: + back: + - ClarinetInstrument + +- type: loadout + id: Flute + equipment: Flute + +- type: startingGear + id: Flute + storage: + back: + - FluteInstrument + +- type: loadout + id: Recorder + equipment: Recorder + +- type: startingGear + id: Recorder + storage: + back: + - RecorderInstrument + +- type: loadout + id: PanFlute + equipment: PanFlute + +- type: startingGear + id: PanFlute + storage: + back: + - PanFluteInstrument + +- type: loadout + id: Ocarina + equipment: Ocarina + +- type: startingGear + id: Ocarina + storage: + back: + - OcarinaInstrument + +- type: loadout + id: Bagpipe + equipment: Bagpipe + +- type: startingGear + id: Bagpipe + storage: + back: + - BagpipeInstrument diff --git a/Resources/Prototypes/Loadouts/loadout_groups.yml b/Resources/Prototypes/Loadouts/loadout_groups.yml index 8695566d6b9..f15045d8166 100644 --- a/Resources/Prototypes/Loadouts/loadout_groups.yml +++ b/Resources/Prototypes/Loadouts/loadout_groups.yml @@ -437,6 +437,41 @@ loadouts: - MusicianWintercoat +- type: loadoutGroup + id: Instruments + name: loadout-group-instruments + minLimit: 0 + maxLimit: 2 + loadouts: + - Glockenspiel + - MusicBox + - Xylophone + - Microphone + - Synthesizer + - Kalimba + - Woodblock + - ElectricGuitar + - BassGuitar + - RockGuitar + - AcousticGuitar + - Banjo + - Violin + - Viola + - Cello + - Trumpet + - Trombone + - FrenchHorn + - Euphonium + - Saxophone + - Accordion + - Harmonica + - Clarinet + - Flute + - Recorder + - PanFlute + - Ocarina + - Bagpipe + # Cargo - type: loadoutGroup id: QuartermasterHead diff --git a/Resources/Prototypes/Loadouts/role_loadouts.yml b/Resources/Prototypes/Loadouts/role_loadouts.yml index 7082d0f609d..c118f089027 100644 --- a/Resources/Prototypes/Loadouts/role_loadouts.yml +++ b/Resources/Prototypes/Loadouts/role_loadouts.yml @@ -206,6 +206,7 @@ - MusicianOuterClothing - Glasses - Trinkets + - Instruments # Sunrise-start - Bra - Pants diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index 9665de7b099..7f4ebc1a751 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -662,3 +662,46 @@ Poison: 2 - !type:SatiateHunger factor: -6 + +# inspired by the spider neurotoxin GsMtx-4 +# poisons non-spiders and slows you down at high doses +- type: reagent + id: Mechanotoxin + name: reagent-name-mechanotoxin + group: Toxins + desc: reagent-desc-mechanotoxin + flavor: sweet + color: "#00b408" + physicalDesc: reagent-physical-desc-nondescript + metabolisms: + Poison: + metabolismRate: 0.2 # Slower metabolism so it can build up over time for slowdown + effects: + - !type:HealthChange + conditions: + - !type:OrganType + type: Arachnid + shouldHave: false + damage: + types: + Poison: 1.6 + - !type:MovespeedModifier + conditions: + - !type:ReagentThreshold + reagent: Mechanotoxin + min: 2 + - !type:OrganType + type: Arachnid + shouldHave: false + walkSpeedModifier: 0.8 + sprintSpeedModifier: 0.8 + - !type:MovespeedModifier + conditions: + - !type:ReagentThreshold + reagent: Mechanotoxin + min: 4 + - !type:OrganType + type: Arachnid + shouldHave: false + walkSpeedModifier: 0.4 + sprintSpeedModifier: 0.4 diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml b/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml index 3a810c8f56c..f9b37209368 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml @@ -25,5 +25,3 @@ storage: back: - BoxSurvival - - AcousticGuitarInstrument - - SaxophoneInstrument diff --git a/Resources/Prototypes/_Sunrise/Loadouts/Jobs/CentComm/centcom_operator.yml b/Resources/Prototypes/_Sunrise/Loadouts/Jobs/CentComm/centcom_operator.yml new file mode 100644 index 00000000000..9944eb8b06a --- /dev/null +++ b/Resources/Prototypes/_Sunrise/Loadouts/Jobs/CentComm/centcom_operator.yml @@ -0,0 +1,65 @@ +- type: loadout + id: CentCommOfficerJumpsuit + equipment: CentCommOfficerJumpsuit + effects: + - !type:GroupLoadoutEffect + proto: MaleMoment + +- type: startingGear + id: CentCommOfficerJumpsuit + equipment: + jumpsuit: ClothingUniformJumpsuitCentcomOfficer + +- type: loadout + id: CentCommOfficerJumpskirt + equipment: CentCommOfficerJumpskirt + effects: + - !type:GroupLoadoutEffect + proto: WomanMoment + +- type: startingGear + id: CentCommOfficerJumpskirt + equipment: + jumpsuit: ClothingUniformJumpskirtCentcomOfficer + +- type: loadout + id: CentCommOfficialJumpsuit + equipment: CentCommOfficialJumpsuit + effects: + - !type:GroupLoadoutEffect + proto: MaleMoment + +- type: startingGear + id: CentCommOfficialJumpsuit + equipment: + jumpsuit: ClothingUniformJumpsuitCentcomOfficial + +- type: loadout + id: CentCommOfficialJumpskirt + equipment: CentCommOfficialJumpskirt + effects: + - !type:GroupLoadoutEffect + proto: WomanMoment + +- type: startingGear + id: CentCommOfficialJumpskirt + equipment: + jumpsuit: ClothingUniformJumpskirtCentcomOfficial + +- type: loadout + id: HeadHatBeretCentcomNaval + equipment: HeadHatBeretCentcomNaval + +- type: startingGear + id: HeadHatBeretCentcomNaval + equipment: + head: ClothingHeadHatBeretCentcomNaval + +- type: loadout + id: HeadHatCentcomcap + equipment: HeadHatCentcomcap + +- type: startingGear + id: HeadHatCentcomcap + equipment: + head: ClothingHeadHatCentcomcap diff --git a/Resources/Prototypes/_Sunrise/Loadouts/loadout_groups.yml b/Resources/Prototypes/_Sunrise/Loadouts/loadout_groups.yml index 6df6866a2d7..b24b5c8acb4 100644 --- a/Resources/Prototypes/_Sunrise/Loadouts/loadout_groups.yml +++ b/Resources/Prototypes/_Sunrise/Loadouts/loadout_groups.yml @@ -122,13 +122,6 @@ - BlueShieldJumpsuit - BlueShieldJumpskirt -- type: loadoutGroup - id: Bodycam - name: loadout-group-bodycam - minLimit: 0 - loadouts: - - SecurityBodycam - - type: loadoutGroup id: SecurityTrinkets name: loadout-group-security-trinkets @@ -148,3 +141,19 @@ minLimit: 0 loadouts: - CorporateLaw + +- type: loadoutGroup + id: CentCommOperatorJumpsuit + name: loadout-group-centcomm-operator-jumpsuit + loadouts: + - CentCommOfficerJumpsuit + - CentCommOfficerJumpskirt + - CentCommOfficialJumpsuit + - CentCommOfficialJumpskirt + +- type: loadoutGroup + id: CentCommOperatorHats + name: loadout-group-centcomm-operator-head-hat + loadouts: + - HeadHatBeretCentcomNaval + - HeadHatCentcomcap \ No newline at end of file diff --git a/Resources/Prototypes/_Sunrise/Loadouts/role_loadouts.yml b/Resources/Prototypes/_Sunrise/Loadouts/role_loadouts.yml index fd0d1f28de2..b2f45143c97 100644 --- a/Resources/Prototypes/_Sunrise/Loadouts/role_loadouts.yml +++ b/Resources/Prototypes/_Sunrise/Loadouts/role_loadouts.yml @@ -41,8 +41,9 @@ - type: roleLoadout id: JobCentCommOperator groups: + - CentCommOperatorJumpsuit + - CentCommOperatorHats - Trinkets - - Bodycam - Bra - Pants - Socks diff --git a/Resources/Prototypes/_Sunrise/Maps/centcomm.yml b/Resources/Prototypes/_Sunrise/Maps/centcomm.yml index 77cbd20121a..ad43c7fb0d3 100644 --- a/Resources/Prototypes/_Sunrise/Maps/centcomm.yml +++ b/Resources/Prototypes/_Sunrise/Maps/centcomm.yml @@ -15,4 +15,3 @@ - type: StationJobs availableJobs: CentCommOperator: [ 1, 1 ] - CentCommOfficial: [ 1, 1 ] diff --git a/Resources/Prototypes/_Sunrise/Roles/Jobs/CentralCommand/centcom_official.yml b/Resources/Prototypes/_Sunrise/Roles/Jobs/CentralCommand/centcom_official.yml index 4387642e83b..b59943ae4d2 100644 --- a/Resources/Prototypes/_Sunrise/Roles/Jobs/CentralCommand/centcom_official.yml +++ b/Resources/Prototypes/_Sunrise/Roles/Jobs/CentralCommand/centcom_official.yml @@ -32,5 +32,8 @@ id: CentcomPDA ears: ClothingHeadsetAltCentCom belt: WeaponPistolN1984 - pocket1: BoxFolderBlack - pocket2: PenCentcom + storage: + back: + - BoxSurvival + - PenCentcom + - BoxFolderBlack diff --git a/Resources/Prototypes/_Sunrise/Roles/Jobs/CentralCommand/centcom_operator.yml b/Resources/Prototypes/_Sunrise/Roles/Jobs/CentralCommand/centcom_operator.yml index 0a9d63e7435..a394ad3ce06 100644 --- a/Resources/Prototypes/_Sunrise/Roles/Jobs/CentralCommand/centcom_operator.yml +++ b/Resources/Prototypes/_Sunrise/Roles/Jobs/CentralCommand/centcom_operator.yml @@ -23,13 +23,14 @@ - type: startingGear id: CentCommOperatorGear equipment: - jumpsuit: ClothingUniformJumpsuitCentcomAdmiral - shoes: ClothingShoesBootsJack - head: ClothingHeadCapCentcomNaval + shoes: ClothingShoesBootsCombatFilled eyes: ClothingEyesGlassesSunglasses - gloves: ClothingHandsGlovesCentcomNaval - outerClothing: ClothingOuterArmorCentcomCarapace - neck: ClothingNeckCloakCentcomAdmiral + gloves: ClothingHandsGlovesColorBlack + outerClothing: ClothingOuterArmorBasic id: CentcomPDA ears: ClothingHeadsetCentCom - pocket1: RubberStampCentcom + belt: WeaponPistolN1984 + storage: + back: + - BoxSurvival + - RubberStampCentcom diff --git a/Resources/Textures/Structures/Power/substation.rsi/charging.png b/Resources/Textures/Structures/Power/substation.rsi/charging.png index 538dc2b7a84..7675535164c 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/charging.png and b/Resources/Textures/Structures/Power/substation.rsi/charging.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/dead.png b/Resources/Textures/Structures/Power/substation.rsi/dead.png index 9fbff744ca7..27440c1c770 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/dead.png and b/Resources/Textures/Structures/Power/substation.rsi/dead.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/full.png b/Resources/Textures/Structures/Power/substation.rsi/full.png index d1797426699..d0b9726cacf 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/full.png and b/Resources/Textures/Structures/Power/substation.rsi/full.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/meta.json b/Resources/Textures/Structures/Power/substation.rsi/meta.json index 0125458641c..d19066274d1 100644 --- a/Resources/Textures/Structures/Power/substation.rsi/meta.json +++ b/Resources/Textures/Structures/Power/substation.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Drawn by Ubaser.", + "license": "CC0-1.0", + "copyright": "Created by EmoGarbage404 (github)", "size": { "x": 32, "y": 32 @@ -13,8 +13,39 @@ { "name": "substation_static" }, - { - "name": "substation_wall" + { + "name": "substation_wall", + "directions": 4 + }, + { + "name": "screen_wall", + "directions": 4, + "delays": [ + [ + 5.0, + 0.5, + 0.5, + 0.5 + ], + [ + 5.0, + 0.5, + 0.5, + 0.5 + ], + [ + 5.0, + 0.5, + 0.5, + 0.5 + ], + [ + 5.0, + 0.5, + 0.5, + 0.5 + ] + ] }, { "name": "substation_wall_static" @@ -23,21 +54,31 @@ "name": "full" }, { - "name": "charging" + "name": "charging", + "delays": [ + [ + 0.1, + 0.1 + ] + ] }, { - "name": "dead" + "name": "dead", + "delays": [ + [ + 0.3, + 0.1 + ] + ] }, { "name": "screen", "delays": [ [ - 0.15, - 0.15, - 0.15, - 0.15, - 0.15, - 0.15 + 5.0, + 0.5, + 0.5, + 0.5 ] ] } diff --git a/Resources/Textures/Structures/Power/substation.rsi/screen.png b/Resources/Textures/Structures/Power/substation.rsi/screen.png index 60c922c53f6..24420ec31ca 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/screen.png and b/Resources/Textures/Structures/Power/substation.rsi/screen.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/screen_wall.png b/Resources/Textures/Structures/Power/substation.rsi/screen_wall.png new file mode 100644 index 00000000000..c1dfb87b1c1 Binary files /dev/null and b/Resources/Textures/Structures/Power/substation.rsi/screen_wall.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/substation.png b/Resources/Textures/Structures/Power/substation.rsi/substation.png index b9d1eb18d8f..68ef981ae5f 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/substation.png and b/Resources/Textures/Structures/Power/substation.rsi/substation.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/substation_static.png b/Resources/Textures/Structures/Power/substation.rsi/substation_static.png index 9d5b8598f4b..eee995843f1 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/substation_static.png and b/Resources/Textures/Structures/Power/substation.rsi/substation_static.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/substation_wall.png b/Resources/Textures/Structures/Power/substation.rsi/substation_wall.png index 155ced7128a..ab250c6747d 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/substation_wall.png and b/Resources/Textures/Structures/Power/substation.rsi/substation_wall.png differ diff --git a/Resources/Textures/Structures/Power/substation.rsi/substation_wall_static.png b/Resources/Textures/Structures/Power/substation.rsi/substation_wall_static.png index e810e6a5a4a..f4cc933b4a5 100644 Binary files a/Resources/Textures/Structures/Power/substation.rsi/substation_wall_static.png and b/Resources/Textures/Structures/Power/substation.rsi/substation_wall_static.png differ diff --git a/RobustToolbox b/RobustToolbox index 2fa83181e2f..a3a8912f428 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 2fa83181e2f4472120fe280f4598197f436faf22 +Subproject commit a3a8912f4280efe701958fcd00079fffcfc4efee