diff --git a/Content.Client/_White/PolymorphableCanister/PolymorphableCanisterSystem.cs b/Content.Client/_White/PolymorphableCanister/PolymorphableCanisterSystem.cs new file mode 100644 index 0000000000..b71a122c71 --- /dev/null +++ b/Content.Client/_White/PolymorphableCanister/PolymorphableCanisterSystem.cs @@ -0,0 +1,36 @@ +using Content.Shared._White.PolymorphableCanister; +using Robust.Client.GameObjects; +using Robust.Shared.Prototypes; + +namespace Content.Client._White.PolymorphableCanister; + +public sealed class PolymorphableCanisterSystem : SharedPolymorphableCanisterSystem +{ + [Dependency] private readonly IComponentFactory _componentFactory = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(HandleState); + } + + private void HandleState(EntityUid uid, + PolymorphableCanisterComponent component, + ref AfterAutoHandleStateEvent args) + { + UpdateAppearance(uid, component.CurrentPrototype); + } + + protected override void UpdateSprite(EntityUid uid, EntityPrototype proto) + { + base.UpdateSprite(uid, proto); + + if (!TryComp(uid, out SpriteComponent? sprite) || + !proto.TryGetComponent(out SpriteComponent? otherSprite, _componentFactory)) + { + return; + } + + sprite.CopyFrom(otherSprite); + } +} diff --git a/Content.Client/_White/PolymorphableCanister/UI/PolymorphableCanisterBUI.cs b/Content.Client/_White/PolymorphableCanister/UI/PolymorphableCanisterBUI.cs new file mode 100644 index 0000000000..65ac68ec24 --- /dev/null +++ b/Content.Client/_White/PolymorphableCanister/UI/PolymorphableCanisterBUI.cs @@ -0,0 +1,37 @@ +using Content.Shared._White.PolymorphableCanister; +using JetBrains.Annotations; + +namespace Content.Client._White.PolymorphableCanister.UI; + +[UsedImplicitly] +// ReSharper disable once InconsistentNaming +public sealed class PolymorphableCanisterBUI : BoundUserInterface +{ + private PolymorphableCanisterMenu? _menu; + + public PolymorphableCanisterBUI(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + IoCManager.InjectDependencies(this); + } + + protected override void Open() + { + _menu = new PolymorphableCanisterMenu(Owner, this); + _menu.OnClose += Close; + _menu.OpenCentered(); + } + + public void SendMessage(string protoId) + { + SendMessage(new PolymorphableCanisterMessage(protoId)); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + + _menu?.Dispose(); + } +} diff --git a/Content.Client/_White/PolymorphableCanister/UI/PolymorphableCanisterMenu.xaml b/Content.Client/_White/PolymorphableCanister/UI/PolymorphableCanisterMenu.xaml new file mode 100644 index 0000000000..4aa72be7ce --- /dev/null +++ b/Content.Client/_White/PolymorphableCanister/UI/PolymorphableCanisterMenu.xaml @@ -0,0 +1,12 @@ + + + + + diff --git a/Content.Client/_White/PolymorphableCanister/UI/PolymorphableCanisterMenu.xaml.cs b/Content.Client/_White/PolymorphableCanister/UI/PolymorphableCanisterMenu.xaml.cs new file mode 100644 index 0000000000..dfbbbf7551 --- /dev/null +++ b/Content.Client/_White/PolymorphableCanister/UI/PolymorphableCanisterMenu.xaml.cs @@ -0,0 +1,57 @@ +using System.Numerics; +using Content.Client.UserInterface.Controls; +using Content.Shared._White.PolymorphableCanister; +using Robust.Client.AutoGenerated; +using Robust.Client.GameObjects; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Prototypes; + +namespace Content.Client._White.PolymorphableCanister.UI; + +[GenerateTypedNameReferences] +public sealed partial class PolymorphableCanisterMenu : RadialMenu +{ + [Dependency] private readonly EntityManager _entManager = default!; + [Dependency] private readonly IPrototypeManager _protoManager = default!; + + public PolymorphableCanisterMenu(EntityUid owner, PolymorphableCanisterBUI bui) + { + IoCManager.InjectDependencies(this); + RobustXamlLoader.Load(this); + + if (!_entManager.TryGetComponent(owner, out var canister)) + return; + + var spriteSystem = _entManager.System(); + + var main = FindControl("Main"); + // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract + if (main is null) + return; + + foreach (var protoId in canister.Prototypes) + { + if (canister.CurrentPrototype == protoId) + continue; + + if (!_protoManager.TryIndex(protoId, out var proto)) + continue; + + var button = new RadialMenuTextureButton + { + ToolTip = Loc.GetString(proto.Name), + TextureNormal = spriteSystem.GetPrototypeIcon(protoId).Default, + StyleClasses = { "RadialMenuButton" }, + SetSize = new Vector2(64f, 64f) + }; + + button.OnButtonUp += _ => + { + bui.SendMessage(protoId); + Close(); + }; + + main.AddChild(button); + } + } +} \ No newline at end of file diff --git a/Content.Server/Chemistry/EntitySystems/ChemistrySystem.Patch.cs b/Content.Server/Chemistry/EntitySystems/ChemistrySystem.Patch.cs index 229890be30..e9b3ffba58 100644 --- a/Content.Server/Chemistry/EntitySystems/ChemistrySystem.Patch.cs +++ b/Content.Server/Chemistry/EntitySystems/ChemistrySystem.Patch.cs @@ -60,7 +60,7 @@ namespace Content.Server.Chemistry.EntitySystems { // Create a pop-up for the target var userName = Identity.Entity(user, EntityManager); - _popup.PopupEntity(Loc.GetString("injector-component-injecting-target", + _popup.PopupEntity(Loc.GetString("patch-component-injecting-target", ("user", userName)), user, target); } diff --git a/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs b/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs index 40ca051690..3cf9396574 100644 --- a/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs +++ b/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs @@ -37,8 +37,10 @@ using Content.Shared._White.Cult.Components; using Content.Shared._White.Cult.Runes; using Content.Shared._White.Cult.UI; using Content.Shared.Cuffs; +using Content.Shared.FixedPoint; using Content.Shared.GameTicking; using Content.Shared.Mindshield.Components; +using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Pulling.Systems; using Content.Shared.UserInterface; @@ -74,6 +76,8 @@ public sealed partial class CultSystem : EntitySystem [Dependency] private readonly PullingSystem _pulling = default!; [Dependency] private readonly SharedCuffableSystem _cuffable = default!; [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly MobThresholdSystem _thresholdSystem = default!; public override void Initialize() { @@ -821,8 +825,7 @@ public sealed partial class CultSystem : EntitySystem var targets = _lookup.GetEntitiesInRange(uid, component.RangeTarget, LookupFlags.Dynamic | LookupFlags.Sundries); - targets.RemoveWhere(x => - !_entityManager.HasComponent(x) || !HasComp(x)); + targets.RemoveWhere(x => !_entityManager.HasComponent(x)); if (targets.Count == 0) return; @@ -832,12 +835,7 @@ public sealed partial class CultSystem : EntitySystem if (victim == null) return; - _entityManager.TryGetComponent(victim.Value, out var state); - - if (state == null) - return; - - if (state.CurrentState != MobState.Dead && state.CurrentState != MobState.Critical) + if (_mobState.IsAlive(victim.Value)) { _popupSystem.PopupEntity(Loc.GetString("cult-revive-rune-already-alive"), args.User, args.User); return; @@ -850,15 +848,56 @@ public sealed partial class CultSystem : EntitySystem private bool Revive(EntityUid target, EntityUid user) { - if (CultRuneReviveComponent.ChargesLeft == 0) + if (HasComp(target)) { - _popupSystem.PopupEntity(Loc.GetString("cult-revive-rune-no-charges"), user, user); - return false; + if (CultRuneReviveComponent.ChargesLeft == 0) + { + _popupSystem.PopupEntity(Loc.GetString("cult-revive-rune-no-charges"), user, user); + return false; + } + + CultRuneReviveComponent.ChargesLeft--; + + _entityManager.EventBus.RaiseLocalEvent(target, new RejuvenateEvent()); } + else + { + if (!TryComp(target, out DamageableComponent? damageable) || + !TryComp(target, out MobThresholdsComponent? threshold) || + !TryComp(target, out MobStateComponent? mobState)) + return false; - CultRuneReviveComponent.ChargesLeft--; + if (!_mobState.IsDead(target, mobState)) + return false; - _entityManager.EventBus.RaiseLocalEvent(target, new RejuvenateEvent()); + var airlossGroup = _prototypeManager.Index("Airloss"); + + var deadThreshold = _thresholdSystem.GetThresholdForState(target, MobState.Dead, threshold); + + if (damageable.Damage.TryGetDamageInGroup(airlossGroup, out var toHeal)) + { + var afterHeal = damageable.TotalDamage - toHeal; + if (deadThreshold <= afterHeal) + return false; + + var asphyxType = _prototypeManager.Index("Asphyxiation"); + var bloodlossType = _prototypeManager.Index("Bloodloss"); + + var heal = new Action(type => + { + if (!damageable.Damage.DamageDict.TryGetValue(type.ID, out var damage)) + return; + + _damageableSystem.TryChangeDamage(target, new DamageSpecifier(type, -damage)); + }); + + heal(asphyxType); + heal(bloodlossType); + } + + if (damageable.TotalDamage < deadThreshold) + _mobState.ChangeMobState(target, MobState.Critical, mobState, user); + } EntityUid? transferTo = null; @@ -1383,4 +1422,4 @@ public sealed partial class CultSystem : EntitySystem /* * Helpers End ---- */ -} \ No newline at end of file +} diff --git a/Content.Server/_White/ERTRecruitment/ERTRecruitmentRule.cs b/Content.Server/_White/ERTRecruitment/ERTRecruitmentRule.cs index 150604dc2c..8f879bd7e2 100644 --- a/Content.Server/_White/ERTRecruitment/ERTRecruitmentRule.cs +++ b/Content.Server/_White/ERTRecruitment/ERTRecruitmentRule.cs @@ -121,8 +121,12 @@ public sealed class ERTRecruitmentRule : StationEventSystem(outpost); ertMap.MapId = mapId; diff --git a/Content.Server/_White/PolymorphableCanister/PolymorphableCanisterSystem.cs b/Content.Server/_White/PolymorphableCanister/PolymorphableCanisterSystem.cs new file mode 100644 index 0000000000..14b8ed5332 --- /dev/null +++ b/Content.Server/_White/PolymorphableCanister/PolymorphableCanisterSystem.cs @@ -0,0 +1,53 @@ +using Content.Server.Atmos.Piping.Unary.Components; +using Content.Shared._White.PolymorphableCanister; +using Content.Shared.Lock; +using Content.Shared.Verbs; +using Robust.Server.GameObjects; +using Robust.Shared.Player; +using Robust.Shared.Utility; + +namespace Content.Server._White.PolymorphableCanister; + +public sealed class PolymorphableCanisterSystem : SharedPolymorphableCanisterSystem +{ + [Dependency] private readonly UserInterfaceSystem _ui = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent>(GetVerb); + } + + private void GetVerb(EntityUid uid, PolymorphableCanisterComponent component, GetVerbsEvent args) + { + if (TryComp(uid, out LockComponent? lockComponent) && lockComponent.Locked) + { + return; + } + + if (TryComp(uid, out GasCanisterComponent? gasCanister) && gasCanister.Air.Pressure > 100) + { + return; + } + + var changeAppearanceVerb = new Verb + { + Text = Loc.GetString("polymorphable-canister-change-appearance-verb"), + Icon = new SpriteSpecifier.Rsi(new ResPath("Structures/Storage/canister.rsi"), "yellow"), + Act = () => TryOpenUi(uid, args.User, component) + }; + + args.Verbs.Add(changeAppearanceVerb); + } + + private void TryOpenUi(EntityUid uid, EntityUid user, PolymorphableCanisterComponent? component = null) + { + if (!Resolve(uid, ref component)) + return; + + if (!TryComp(user, out ActorComponent? actor)) + return; + + _ui.TryToggleUi(uid, PolymorphableCanisterUiKey.Key, actor.PlayerSession); + } +} \ No newline at end of file diff --git a/Content.Shared/Standing/Systems/SharedStandingStateSystem.cs b/Content.Shared/Standing/Systems/SharedStandingStateSystem.cs index d0384f7377..3ce16ff36e 100644 --- a/Content.Shared/Standing/Systems/SharedStandingStateSystem.cs +++ b/Content.Shared/Standing/Systems/SharedStandingStateSystem.cs @@ -2,6 +2,7 @@ using Content.Shared.DoAfter; using Content.Shared.Gravity; using Content.Shared.Hands.Components; using Content.Shared.Input; +using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Systems; using Content.Shared.Physics; using Content.Shared.Rotation; @@ -24,6 +25,7 @@ public abstract partial class SharedStandingStateSystem : EntitySystem [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; // WD EDIT [Dependency] private readonly MovementSpeedModifierSystem _movement = default!; // WD EDIT [Dependency] private readonly SharedStunSystem _stun = default!; // WD EDIT + [Dependency] private readonly MobStateSystem _mobState = default!; // WD EDIT // If StandingCollisionLayer value is ever changed to more than one layer, the logic needs to be edited. private const int StandingCollisionLayer = (int)CollisionGroup.MidImpassable; @@ -64,6 +66,11 @@ public abstract partial class SharedStandingStateSystem : EntitySystem return; } + if (!_mobState.IsAlive(uid)) + { + return; + } + if (IsDown(uid)) { TryStandUp(uid); @@ -123,13 +130,13 @@ public abstract partial class SharedStandingStateSystem : EntitySystem if (standingState.CurrentState is not StandingState.Lying) return false; - standingState.CurrentState = StandingState.GettingUp; var doargs = new DoAfterArgs(EntityManager, uid, standingState.StandingUpTime, new StandingUpDoAfterEvent(), uid) { BreakOnMove = false, BreakOnDamage = false, - BreakOnHandChange = false + BreakOnHandChange = false, + RequireCanInteract = false }; if (!_doAfter.TryStartDoAfter(doargs)) @@ -141,7 +148,7 @@ public abstract partial class SharedStandingStateSystem : EntitySystem public bool TryLieDown(EntityUid uid, StandingStateComponent? standingState = null, bool dropHeldItems = false) { - if (!Resolve(uid, ref standingState, false)) + if (!Resolve(uid, ref standingState, false) || !standingState.CanLieDown) return false; if (standingState.CurrentState is not StandingState.Standing) diff --git a/Content.Shared/Standing/Systems/StandingStateSystem.Colliding.cs b/Content.Shared/Standing/Systems/StandingStateSystem.Colliding.cs index af9c07f2bb..c70afa32a1 100644 --- a/Content.Shared/Standing/Systems/StandingStateSystem.Colliding.cs +++ b/Content.Shared/Standing/Systems/StandingStateSystem.Colliding.cs @@ -11,7 +11,6 @@ namespace Content.Shared.Standing.Systems; public abstract partial class SharedStandingStateSystem { [Dependency] protected readonly IRobustRandom Random = default!; - [Dependency] private readonly MobStateSystem _mobState = default!; private void InitializeColliding() { diff --git a/Content.Shared/_White/PolymorphableCanister/PolymorphableCanisterComponent.cs b/Content.Shared/_White/PolymorphableCanister/PolymorphableCanisterComponent.cs new file mode 100644 index 0000000000..ee37dc54be --- /dev/null +++ b/Content.Shared/_White/PolymorphableCanister/PolymorphableCanisterComponent.cs @@ -0,0 +1,46 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Shared._White.PolymorphableCanister; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +public sealed partial class PolymorphableCanisterComponent : Component +{ + [DataField] + public ResPath ResPath = new("Structures/Storage/canister.rsi"); + + [DataField, AutoNetworkedField] + public ProtoId? CurrentPrototype; + + [DataField, ViewVariables(VVAccess.ReadWrite)] + public int DoAfterTime = 3; + + [DataField] + public List> Prototypes = new() + { + "GasCanister", + "StorageCanister", + "AirCanister", + "OxygenCanister", + "NitrogenCanister", + "CarbonDioxideCanister", + "PlasmaCanister", + "TritiumCanister", + "WaterVaporCanister", + "AmmoniaCanister", + "NitrousOxideCanister", + "FrezonCanister", + "BZCanister", + "PluoxiumCanister", + "HydrogenCanister", + "NitriumCanister", + "HealiumCanister", + "HyperNobliumCanister", + "ProtoNitrateCanister", + "ZaukerCanister", + "HalonCanister", + "HeliumCanister", + "AntiNobliumCanister", + }; +} diff --git a/Content.Shared/_White/PolymorphableCanister/SharedPolymorphableCanisterSystem.cs b/Content.Shared/_White/PolymorphableCanister/SharedPolymorphableCanisterSystem.cs new file mode 100644 index 0000000000..617ec35876 --- /dev/null +++ b/Content.Shared/_White/PolymorphableCanister/SharedPolymorphableCanisterSystem.cs @@ -0,0 +1,106 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared._White.PolymorphableCanister; + +public abstract class SharedPolymorphableCanisterSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly MetaDataSystem _metaData = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnMessage); + SubscribeLocalEvent(OnDoAfter); + } + + private void OnInit(Entity ent, ref ComponentInit args) + { + var proto = MetaData(ent.Owner).EntityPrototype; + if (proto is null) + { + return; + } + + ent.Comp.CurrentPrototype = proto.ID; + Dirty(ent); + } + + private void OnMessage(Entity ent, ref PolymorphableCanisterMessage args) + { + if (!args.Session.AttachedEntity.HasValue) + { + return; + } + + var doAfterArgs = new DoAfterArgs(EntityManager, + args.Session.AttachedEntity.Value, + ent.Comp.DoAfterTime, + new PolymorphableCanisterDoAfterEvent(args.ProtoId), + ent.Owner + ) + { + BreakOnMove = true, + NeedHand = true + }; + + _doAfter.TryStartDoAfter(doAfterArgs); + } + + private void OnDoAfter(Entity ent, ref PolymorphableCanisterDoAfterEvent args) + { + if (args.Cancelled) + { + return; + } + + ent.Comp.CurrentPrototype = args.ProtoId; + UpdateAppearance(ent, args.ProtoId); + Dirty(ent); + } + + public void UpdateAppearance(EntityUid uid, ProtoId? protoId) + { + if (string.IsNullOrEmpty(protoId) || !_proto.TryIndex(protoId, out var proto)) + { + return; + } + + var metadata = MetaData(uid); + _metaData.SetEntityName(uid, proto.Name, metadata); + _metaData.SetEntityDescription(uid, proto.Description, metadata); + + UpdateSprite(uid, proto); + } + + protected virtual void UpdateSprite(EntityUid uid, EntityPrototype proto) + { + } +} + +[NetSerializable, Serializable] +public enum PolymorphableCanisterUiKey : byte +{ + Key +} + +[Serializable, NetSerializable] +public sealed class PolymorphableCanisterMessage(string protoId) : BoundUserInterfaceMessage +{ + public readonly ProtoId ProtoId = protoId; +} + +[Serializable, NetSerializable] +public sealed partial class PolymorphableCanisterDoAfterEvent : SimpleDoAfterEvent +{ + public readonly ProtoId ProtoId; + + public PolymorphableCanisterDoAfterEvent(string protoId) + { + ProtoId = protoId; + } +} \ No newline at end of file diff --git a/Resources/Changelog/ChangelogWhite.yml b/Resources/Changelog/ChangelogWhite.yml index a42274d277..c9eb876556 100644 --- a/Resources/Changelog/ChangelogWhite.yml +++ b/Resources/Changelog/ChangelogWhite.yml @@ -3804,3 +3804,93 @@ id: 267 time: '2024-05-22T23:54:27.0000000+00:00' url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/312 +- author: Aviu + changes: + - message: "\u0414\u043B\u044F \u0437\u0430\u043F\u0443\u0441\u043A\u0430 \u0440\ + \u0435\u0436\u0438\u043C\u0430 \u044F\u0434\u0435\u0440\u043D\u044B\u0445 \u043E\ + \u043F\u0435\u0440\u0430\u0442\u0438\u0432\u043D\u0438\u043A\u043E\u0432 \u0432\ + \u043D\u043E\u0432\u044C \u043D\u0443\u0436\u043D\u043E 20 \u0433\u043E\u0442\ + \u043E\u0432\u044B\u0445." + type: Tweak + id: 268 + time: '2024-05-28T14:13:17.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/313 +- author: ThereDrD + changes: + - message: "\u041D\u0430 \u0412\u0430\u043D\u0434\u0435\u0440\u0431\u043E\u043A\u0441\ + \ \u0438 \u0412\u0430\u0439\u0442\u0431\u043E\u043A\u0441 \u0434\u043E\u0431\ + \u0430\u0432\u043B\u0435\u043D\u044B \u0431\u043E\u0440\u0433\u0438" + type: Add + id: 269 + time: '2024-05-29T20:40:05.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/315 +- author: Aviu + changes: + - message: "\u0422\u0435\u043F\u0435\u0440\u044C \u043C\u043E\u0436\u043D\u043E\ + \ \u0432\u0441\u0442\u0430\u0442\u044C \u0431\u0443\u0434\u0443\u0447\u0438\ + \ \u0432 \u043D\u0430\u0440\u0443\u0447\u043D\u0438\u043A\u0430\u0445." + type: Fix + - message: "\u041A\u043B\u043E\u0443\u043D\u044B \u043C\u043E\u0433\u0443\u0442\ + \ \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0437\ + \u0430\u043B\u043F\u043E\u043C \u043A\u0440\u043E\u0432\u0430\u0432\u044B\u0445\ + \ \u0441\u043D\u0430\u0440\u044F\u0434\u043E\u0432." + type: Fix + - message: "\u041E\u0431\u0435\u0437\u044C\u044F\u043D\u044B \u043C\u043E\u0433\u0443\ + \u0442 \u0442\u0435\u043F\u0435\u0440\u044C \u043B\u043E\u0436\u0438\u0442\u044C\ + \u0441\u044F." + type: Add + - message: "\u0423\u0431\u0440\u0430\u043D \u0440\u0435\u0444\u043B\u0435\u043A\u0442\ + \ \u0443 \u0441\u0442\u0435\u043D \u0448\u0430\u0442\u0442\u043B\u0430." + type: Remove + id: 270 + time: '2024-05-30T12:12:24.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/314 +- author: Aviu + changes: + - message: "\u0420\u0443\u043D\u0430 \u0432\u043E\u0441\u043A\u0440\u0435\u0448\u0435\ + \u043D\u0438\u044F \u043C\u043E\u0436\u0435\u0442 \u0432\u043E\u0441\u043A\u0440\ + \u0435\u0448\u0430\u0442\u044C \u043D\u0435 \u043A\u0443\u043B\u044C\u0442\u0438\ + \u0441\u0442\u043E\u0432, \u043D\u0435 \u0442\u0440\u0430\u0442\u044F \u043F\ + \u0440\u0438 \u044D\u0442\u043E\u043C \u0437\u0430\u0440\u044F\u0434\u044B,\ + \ \u043D\u043E \u043E\u043D\u0430 \u0441\u043F\u043E\u0441\u043E\u0431\u043D\ + \u0430 \u0438\u0437\u043B\u0435\u0447\u0438\u0442\u044C \u0438\u0445 \u0442\u043E\ + \u043B\u044C\u043A\u043E \u043E\u0442 \u0443\u0434\u0443\u0448\u0435\u043D\u0438\ + \u044F \u0438 \u043A\u0440\u043E\u0432\u043E\u043F\u043E\u0442\u0435\u0440\u0438\ + ." + type: Add + id: 271 + time: '2024-05-30T12:27:13.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/318 +- author: Remuchi + changes: + - message: "\u0422\u0435\u043F\u0435\u0440\u044C \u0432\u043D\u0435\u0448\u043D\u0438\ + \u0439 \u0432\u0438\u0434 \u0433\u0430\u0437\u043E\u0432\u044B\u0445 \u043A\u0430\ + \u043D\u0438\u0441\u0442\u0440 \u043C\u043E\u0436\u043D\u043E \u043C\u0435\u043D\ + \u044F\u0442\u044C." + type: Add + id: 272 + time: '2024-05-30T14:28:53.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/317 +- author: RinKeeper + changes: + - message: "\u041E\u0411\u0420 \u0442\u0435\u043F\u0435\u0440\u044C \u0434\u043E\ + \u043B\u0436\u043D\u043E \u0440\u0430\u0431\u043E\u0442\u0430\u0442\u044C \u043A\ + \u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E(\u0432\u043E\u0437\u043C\u043E\ + \u0436\u043D\u043E)" + type: Fix + - message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D popup \u043F\u043B\ + \u0430\u0441\u0442\u044B\u0440\u044F" + type: Fix + id: 273 + time: '2024-05-30T14:48:15.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/282 +- author: S_k_R_i_M_e_X + changes: + - message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u043D\u043E\u0432\ + \u044B\u0435 \u0441\u043F\u0430\u0432\u043D\u0435\u0440\u044B \u0441\u0442\u0440\ + \u0443\u043A\u0442\u0443\u0440, \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\ + \u0432." + type: Add + id: 274 + time: '2024-05-30T18:56:18.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/319 diff --git a/Resources/Locale/en-US/_white/polymorphable-canister/polymorphable-canister.ftl b/Resources/Locale/en-US/_white/polymorphable-canister/polymorphable-canister.ftl new file mode 100644 index 0000000000..7f644d6e7e --- /dev/null +++ b/Resources/Locale/en-US/_white/polymorphable-canister/polymorphable-canister.ftl @@ -0,0 +1 @@ +polymorphable-canister-change-appearance-verb = Change appearance diff --git a/Resources/Locale/en-US/chemistry/components/patch-component.ftl b/Resources/Locale/en-US/chemistry/components/patch-component.ftl index f62ab45a35..4a838e9050 100644 --- a/Resources/Locale/en-US/chemistry/components/patch-component.ftl +++ b/Resources/Locale/en-US/chemistry/components/patch-component.ftl @@ -1,6 +1,5 @@ ## Entity -patch-component-target-getting-injected = Someone trying to put a patch on you patch-component-injecting-user = You are trying to put a patch on {$target}. patch-component-inject-other-message = You put a patch on {$other}. patch-component-inject-self-message = You put a patch on yourself. @@ -8,3 +7,6 @@ patch-component-empty-message = It's empty! patch-component-feel-prick-message = You feel a little sting patch-cant-inject = Can't put a patch on {$target}! patch-cant-inject-now = Can't put a patch now +## mob-inject doafter messages + +patch-component-injecting-target = {CAPITALIZE($user)} is trying to put a patch on you! diff --git a/Resources/Locale/ru-RU/_white/cult/entities.ftl b/Resources/Locale/ru-RU/_white/cult/entities.ftl index 0a232fb72f..978a589469 100644 --- a/Resources/Locale/ru-RU/_white/cult/entities.ftl +++ b/Resources/Locale/ru-RU/_white/cult/entities.ftl @@ -1,4 +1,4 @@ -ent-SoulShard = камень душ +ent-SoulShard = камень душ .desc = Мистический светящийся осколок. ent-SoulShardGhost = камень душ @@ -57,7 +57,7 @@ ent-SummoningRune = руна призыва .desc = Эта руна позволяет мгновенно призвать к руне любого несвязанного культиста. Для использования требуются 2 культиста, стоящих вокруг руны. ent-ReviveRune = руна воскрешения - .desc = Каждый раз, когда кого-то приносят в жертву на Руне Преподнесения, этой руне добавляется один глобальный заряд. Размещение трупа культиста на руне и её активация вернет его к жизни, расходуя при этом заряд. + .desc = Каждый раз, когда кого-то приносят в жертву на Руне Преподнесения, этой руне добавляется один глобальный заряд. Размещение трупа культиста на руне и её активация вернет его к жизни, расходуя при этом заряд. Руна воскрешения может воскрешать не культистов, не тратя при этом заряды, но она способна излечить их только от удушения и кровопотери. ent-BarrierRune = руна барьера .desc = При активации на создаёт барьер, блокирующую проход. Может быть повторно активирована, чтобы отменить заклинание. diff --git a/Resources/Locale/ru-RU/_white/polymorphable-canister/polymorphable-canister.ftl b/Resources/Locale/ru-RU/_white/polymorphable-canister/polymorphable-canister.ftl new file mode 100644 index 0000000000..edcd77f2b9 --- /dev/null +++ b/Resources/Locale/ru-RU/_white/polymorphable-canister/polymorphable-canister.ftl @@ -0,0 +1 @@ +polymorphable-canister-change-appearance-verb = Перекрасить diff --git a/Resources/Locale/ru-RU/chemistry/components/patch-component.ftl b/Resources/Locale/ru-RU/chemistry/components/patch-component.ftl index 86c4a12e47..4077093cfd 100644 --- a/Resources/Locale/ru-RU/chemistry/components/patch-component.ftl +++ b/Resources/Locale/ru-RU/chemistry/components/patch-component.ftl @@ -10,4 +10,4 @@ patch-cant-inject-now = Вы не можете наложить пластырь ## mob-inject doafter messages -injector-component-injecting-target = {CAPITALIZE(THE($user))} пытается приклеить пластырь на вас! +patch-component-injecting-target = {CAPITALIZE($user)} пытается приклеить пластырь на вас! diff --git a/Resources/Prototypes/Entities/Markers/Spawners/techspawner.yml b/Resources/Prototypes/Entities/Markers/Spawners/techspawner.yml new file mode 100644 index 0000000000..5ebc39f60b --- /dev/null +++ b/Resources/Prototypes/Entities/Markers/Spawners/techspawner.yml @@ -0,0 +1,620 @@ +# random book spawner +- type: entity + id: RandomBook + name: random book spawner + parent: MarkerBase + suffix: 85% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: book + - type: RandomSpawner + prototypes: + - BookBase + - BookSpaceEncyclopedia + - BookTheBookOfControl + - BookBartendersManual + - BookChefGaming + - BookLeafLoversSecret + - BookEngineersHandbook + - BookScientistsGuidebook + - BookSecurity + - BookHowToKeepStationClean + - BookHowToRockAndStone + - BookMedicalReferenceBook + - BookHowToSurvive + - BookChemicalCompendium + - BookEscalation + - BookEscalationSecurity + - BookAtmosDistro + - BookAtmosWaste + - BookAtmosAirAlarms + - BookAtmosVentsMore + chance: 0.85 + +# random barricade spawner +- type: entity + id: Random... + name: random barricade spawner + parent: MarkerBase + suffix: 55% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: barricade + - type: RandomSpawner + prototypes: + - Barricade + chance: 0.55 + +# random box spawner +- type: entity + id: RandomBox + name: random box spawner + parent: MarkerBase + suffix: 65% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: box + - type: RandomSpawner + prototypes: + - BigBox + chance: 0.65 + +# random cash spawner +- type: entity + id: RandomCash + name: random cash spawner + parent: MarkerBase + suffix: 95% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: cash + - type: RandomSpawner + prototypes: + - SpaceCash10 + - SpaceCash100 + - SpaceCash500 + chance: 0.95 + rarePrototypes: + - SpaceCash1000 + rareChance: 0.05 + +# random circuit spawner +- type: entity + id: RandomCircuit + name: random circuit spawner + parent: MarkerBase + suffix: 85% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: circuit + - type: RandomSpawner + prototypes: + - StationMapCircuitboard + - AlertsComputerCircuitboard + - PowerComputerCircuitboard + - MedicalRecordsComputerCircuitboard + - StationRecordsComputerCircuitboard + - SurveillanceCameraMonitorCircuitboard + - SurveillanceWirelessCameraMonitorCircuitboard + - ComputerTelevisionCircuitboard + - ResearchComputerCircuitboard + - CrewMonitoringComputerCircuitboard + - AnalysisComputerCircuitboard + - BodyScannerComputerCircuitboard + - RadarConsoleCircuitboard + - SolarControlComputerCircuitboard + - SpaceVillainArcadeComputerCircuitboard + - BlockGameArcadeComputerCircuitboard + - ComputerMassMediaCircuitboard + - SensorConsoleCircuitboard + - AutolatheMachineCircuitboard + - VaccinatorMachineCircuitboard + - DiagnoserMachineCircuitboard + - ArtifactAnalyzerMachineCircuitboard + - ThermomachineFreezerMachineCircuitBoard + - ThermomachineHeaterMachineCircuitBoard + - PortableScrubberMachineCircuitBoard + - HydroponicsTrayMachineCircuitboard + - SMESMachineCircuitboard + - SubstationMachineCircuitboard + - StasisBedMachineCircuitboard + chance: 0.85 + rarePrototypes: + - ShuttleConsoleCircuitboard + - ProtolatheMachineCircuitboard + - CloningPodMachineCircuitboard + - MedicalScannerMachineCircuitboard + - CrewMonitoringServerMachineCircuitboard + - BiomassReclaimerMachineCircuitboard + - GyroscopeMachineCircuitboard + - MicrowaveMachineCircuitboard + rareChance: 0.15 + +# random disabler spawner +- type: entity + id: RandomDisabler + name: random disabler spawner + parent: MarkerBase + suffix: 40% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: disabler + - type: RandomSpawner + prototypes: + - WeaponDisablerPractice + chance: 0.40 + rarePrototypes: + - WeaponDisabler + rareChance: 0.20 + +# random egun spawner +- type: entity + id: RandomEGun + name: random egun spawner + parent: MarkerBase + suffix: 10% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: e_gun + - type: RandomSpawner + prototypes: + - WeaponEgun + chance: 0.10 + +# random flashlight spawner +- type: entity + id: RandomFlashlight + name: random flashlight spawner + parent: MarkerBase + suffix: 90% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: flashlight + - type: RandomSpawner + prototypes: + - FlashlightLantern + - EmptyFlashlightLantern + - FlashlightSeclite + - Lamp + - LampGold + - Lantern + chance: 0.90 + rarePrototypes: + - LanternFlash + rareChance: 0.01 + +# random girder spawner +- type: entity + id: RandomGirder + name: random girder spawner + parent: MarkerBase + suffix: 70% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: girder + - type: RandomSpawner + prototypes: + - Girder + - ReinforcedGirder + chance: 0.70 + +# random handcuffs spawner +- type: entity + id: RandomHandcuffs + name: random handcuffs spawner + parent: MarkerBase + suffix: 50% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: handcuffs + - type: RandomSpawner + prototypes: + - Handcuffs + - Zipties + chance: 0.50 + +# random closed spawner +- type: entity + id: RandomCloset + name: random closet spawner + parent: MarkerBase + suffix: 80% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: locker + - type: RandomSpawner + prototypes: + - ClosetEmergencyFilledRandom + - ClosetFireFilled + - ClosetMaintenanceFilledRandom + - ClosetToolFilled + - LockerWeldingSuppliesFilled + - LockerElectricalSuppliesFilled + chance: 0.80 + rarePrototypes: + - ClosetEmergency + - ClosetFire + - ClosetMaintenance + - ClosetTool + - LockerWeldingSupplies + - LockerElectricalSupplies + rareChance: 0.20 + +# random medkit spawner +- type: entity + id: RandomMedkit + name: random medkit spawner + parent: MarkerBase + suffix: 70% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: medkit + - type: RandomSpawner + prototypes: + - MedkitFilled + - MedkitCombat + - MedkitRadiationFilled + - MedkilOxygenFilled + - MedkitBruteFilled + - MedkitToxinFilled + - MedkitBurnFilled + - MedkitAdvanced + chance: 0.70 + rarePrototypes: + - Medkit + - MedkitCombatFilled + - MedkitRadiation + - MedkilOxygen + - MedkitBrute + - MedkitToxin + - MedkitBurn + - MedkitAdvancedFilled + rareChance: 0.20 + +# random material spawner +- type: entity + id: RandomMaterial + name: random material spawner + parent: MarkerBase + suffix: 70% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: metal + - type: RandomSpawner + prototypes: + - SheetPlastic + - SheetGlass + - SheetRGlass + - SheetSteel + - SheetPaper + - SheetPlasteel + chance: 0.70 + rarePrototypes: + - SheetPlasma + - SheetUranium + - SheetPGlass + - SheetUGlass + - SheetRPGlass + - SheetRUGlass + rareChance: 0.15 + +# random peel spawner +- type: entity + id: RandomPeel + name: random peel spawner + parent: MarkerBase + suffix: 80% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: peel + - type: RandomSpawner + prototypes: + - TrashBananaPeel + - TrashBananiumPeel + - TrashMimanaPeel + - TrashBakedBananaPeel + chance: 0.80 + rarePrototypes: + - TrashBananaPeelExplosive + rareChance: 0.01 + +# random P.A.C.M.A.N spawner +- type: entity + id: RandomPower + name: random P.A.C.M.A.N spawner + parent: MarkerBase + suffix: 80% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: power + - type: RandomSpawner + prototypes: + - PortableGeneratorJrPacman + - PortableGeneratorPacman + - PortableGeneratorSuperPacman + chance: 0.80 + +# random rod spawner +- type: entity + id: RandomRods + name: random rod spawner + parent: MarkerBase + suffix: 90% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: rods + - type: RandomSpawner + prototypes: + - PartRodMetal1 + - PartRodMetal10 + - PartRodMetal + chance: 0.90 + +# random rollerbed spawner +- type: entity + id: RandomRollerBed + name: random rollerbed spawner + parent: MarkerBase + suffix: 60% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: rollerbed + - type: RandomSpawner + prototypes: + - RollerBed + - EmergencyRollerBed + - CheapRollerBed + chance: 0.60 + rarePrototypes: + - RollerBedSpawnFolded + - EmergencyRollerBedSpawnFolded + - CheapRollerBedSpawnFolded + rareChance: 0.20 + +# random shard spawner +- type: entity + id: RandomShard + name: random shard spawner + parent: MarkerBase + suffix: 80% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: shard + - type: RandomSpawner + prototypes: + - ShardGlass + - ShardGlassReinforced + chance: 0.80 + rarePrototypes: + - ShardGlassPlasma + - ShardGlassUranium + rareChance: 0.5 + +# random shiv spawner +- type: entity + id: RandomShiv + name: random shiv spawner + parent: MarkerBase + suffix: 50% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: shiv + - type: RandomSpawner + prototypes: + - Shiv + - ScalpelShiv + - ReinforcedShiv + chance: 0.50 + rarePrototypes: + - PlasmaShiv + - UraniumShiv + rareChance: 0.10 + +# random tank spawner +- type: entity + id: RandomTank + name: random tank spawner + parent: MarkerBase + suffix: 80% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: tank + - type: RandomSpawner + prototypes: + - WaterTank + - WaterTankFull + - WeldingFuelTank + - WeldingFuelTankFull + chance: 0.80 + rarePrototypes: + - WaterTankHighCapacity + - WeldingFuelTankHighCapacity + rareChance: 0.10 + +# random toolbox spawner +- type: entity + id: RandomToolbox + name: random toolbox spawner + parent: MarkerBase + suffix: 70% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: toolbox + - type: RandomSpawner + prototypes: + - ToolboxArtisticFilled + - ToolboxArtistic + - ToolboxEmergencyFilled + - ToolboxEmergency + - ToolboxMechanicalFilled + - ToolboxMechanical + - ToolboxElectricalFilled + - ToolboxElectrical + chance: 0.70 + rarePrototypes: + - CowToolboxFilled + - CowToolbox + - ToolboxGoldFilled + - ToolboxGold + rareChance: 0.5 + +# random vomit spawner +- type: entity + id: RandomVomit + name: random vomit spawner + parent: MarkerBase + suffix: 60% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: vomit + - type: RandomSpawner + prototypes: + - PuddleVomit + chance: 0.60 + +# random wood spawner +- type: entity + id: RandomWood + name: random wood spawner + parent: MarkerBase + suffix: 80% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: wood + - type: RandomSpawner + prototypes: + - MaterialWoodPlank + - MaterialWoodPlank1 + - MaterialWoodPlank10 + chance: 0.80 + +# random utility spawner +- type: entity + id: RandomUtility + name: random utility spawner + parent: MarkerBase + suffix: 80% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: wrench + - type: RandomSpawner + prototypes: + - Crowbar + - Wrench + - Wirecutter + - Screwdriver + - Welder + - NetworkConfigurator + chance: 0.80 + rarePrototypes: + - Multitool + rareChance: 0.10 + +# random syndie loot spawner +- type: entity + id: RandomSyndie + name: random syndie spawner + parent: MarkerBase + suffix: 1% + components: + - type: Sprite + layers: + - state: red + - sprite: /Textures/White/Specific/spawner.rsi + state: pistol + - type: RandomSpawner + prototypes: + - WeaponSniperMosin + - WeaponPistolViper + - WeaponPistolCobra + - C4 + - ExGrenade + - SyndieMiniBomb + - ClothingEyesNightVisionGogglesSyndie + - ClothingOuterVestWeb + - ClothingBackpackChameleonFill + - CigPackSyndicate + - ToolboxSyndicateFilled + chance: 0.01 + rarePrototypes: + - WeaponRevolverPythonAP + - EnergyCrossbowMini + - BetrayalKnife + - HypopenBox + - AgentIDCard + - Emag + - ExperimentalSyndicateTeleporter + - ClothingHandsGlovesNorthStar + rareChance: 0.001 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 44bc37db09..561f615922 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -1253,6 +1253,8 @@ tags: - VimPilot - DoorBumpOpener + - type: StandingState + canLieDown: true - type: entity name: monkey diff --git a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml index bf16d318f9..4b0b0e9b29 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml @@ -34,10 +34,12 @@ 1: { state: can-o1, shader: "unshaded" } 2: { state: can-o2, shader: "unshaded" } 3: { state: can-o3, shader: "unshaded" } - - type: UserInterface + - type: UserInterface # WhiteDream - Added PolymorphableCanisterUiKey interfaces: - key: enum.GasCanisterUiKey.Key type: GasCanisterBoundUserInterface + - key: enum.PolymorphableCanisterUiKey.Key + type: PolymorphableCanisterBUI - type: Destructible thresholds: - trigger: @@ -104,6 +106,7 @@ access: [["Atmospherics"], ["Engineering"], ["Research"]] - type: Lock locked: false + - type: PolymorphableCanister # WhiteDream - type: entity parent: GasCanister diff --git a/Resources/Prototypes/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/Entities/Structures/Walls/walls.yml index 3974a70fdb..44ffa057aa 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/walls.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/walls.yml @@ -782,8 +782,6 @@ damageModifierSet: StructuralMetallic - type: Physics bodyType: Static - - type: Reflect - reflectProb: 1 - type: Pullable - type: Airtight noAirWhenFullyAirBlocked: false @@ -858,8 +856,6 @@ 3: { state: shuttle_construct-3, visible: true} 4: { state: shuttle_construct-4, visible: true} 5: { state: shuttle_construct-5, visible: true} - - type: Reflect - reflectProb: 1 - type: entity parent: WallSolid @@ -877,8 +873,6 @@ - type: IconSmooth key: walls base: state - - type: Reflect - reflectProb: 1 - type: entity parent: BaseWall diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index 2737e65db6..e661846595 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -69,7 +69,7 @@ noSpawn: true components: - type: GameRule - minPlayers: 35 + minPlayers: 20 - type: NukeopsRule faction: Syndicate diff --git a/Resources/Prototypes/Maps/Whitebox.yml b/Resources/Prototypes/Maps/Whitebox.yml index 6561b98b96..176c892613 100644 --- a/Resources/Prototypes/Maps/Whitebox.yml +++ b/Resources/Prototypes/Maps/Whitebox.yml @@ -57,3 +57,4 @@ SeniorPhysician: [ 1, 1 ] SeniorEngineer: [ 1, 1 ] SeniorSalvageSpecialist: [ 1, 1 ] + Borg: [ 2, 2 ] diff --git a/Resources/Prototypes/Maps/WonderBox.yml b/Resources/Prototypes/Maps/WonderBox.yml index 4bcf039bb1..7ec108a195 100644 --- a/Resources/Prototypes/Maps/WonderBox.yml +++ b/Resources/Prototypes/Maps/WonderBox.yml @@ -59,4 +59,5 @@ SeniorOfficer: [ 1, 1 ] SeniorPhysician: [ 1, 1 ] SeniorEngineer: [ 1, 1 ] + Borg: [ 2, 2 ] diff --git a/Resources/Prototypes/_White/Entities/Cult/Items/blood_barrage.yml b/Resources/Prototypes/_White/Entities/Cult/Items/blood_barrage.yml index 2e0c5d4452..ef84377f52 100644 --- a/Resources/Prototypes/_White/Entities/Cult/Items/blood_barrage.yml +++ b/Resources/Prototypes/_White/Entities/Cult/Items/blood_barrage.yml @@ -19,6 +19,7 @@ soundEmpty: null soundGunshot: path: /Audio/White/Cult/wand_teleport.ogg + clumsyProof: true - type: BasicEntityAmmoProvider proto: BloodBolt capacity: 25 diff --git a/Resources/Textures/White/Specific/spawner.rsi/barricade.png b/Resources/Textures/White/Specific/spawner.rsi/barricade.png new file mode 100644 index 0000000000..fbb983f47b Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/barricade.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/book.png b/Resources/Textures/White/Specific/spawner.rsi/book.png new file mode 100644 index 0000000000..0cacd1c9ed Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/book.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/box.png b/Resources/Textures/White/Specific/spawner.rsi/box.png new file mode 100644 index 0000000000..b5721988de Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/box.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/briefcase.png b/Resources/Textures/White/Specific/spawner.rsi/briefcase.png new file mode 100644 index 0000000000..3d8e05779b Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/briefcase.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/cash.png b/Resources/Textures/White/Specific/spawner.rsi/cash.png new file mode 100644 index 0000000000..87f6979109 Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/cash.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/caution.png b/Resources/Textures/White/Specific/spawner.rsi/caution.png new file mode 100644 index 0000000000..aad22f00ab Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/caution.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/circuit.png b/Resources/Textures/White/Specific/spawner.rsi/circuit.png new file mode 100644 index 0000000000..c0a6fb9f1e Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/circuit.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/disabler.png b/Resources/Textures/White/Specific/spawner.rsi/disabler.png new file mode 100644 index 0000000000..6198f92386 Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/disabler.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/e_gun.png b/Resources/Textures/White/Specific/spawner.rsi/e_gun.png new file mode 100644 index 0000000000..989a0788bb Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/e_gun.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/flashlight.png b/Resources/Textures/White/Specific/spawner.rsi/flashlight.png new file mode 100644 index 0000000000..e01a7d247f Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/flashlight.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/girder.png b/Resources/Textures/White/Specific/spawner.rsi/girder.png new file mode 100644 index 0000000000..6bb01bb596 Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/girder.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/grille.png b/Resources/Textures/White/Specific/spawner.rsi/grille.png new file mode 100644 index 0000000000..3dbc7914e1 Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/grille.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/handcuffs.png b/Resources/Textures/White/Specific/spawner.rsi/handcuffs.png new file mode 100644 index 0000000000..14889a0c10 Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/handcuffs.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/locker.png b/Resources/Textures/White/Specific/spawner.rsi/locker.png new file mode 100644 index 0000000000..0c14d8d80b Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/locker.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/medkit.png b/Resources/Textures/White/Specific/spawner.rsi/medkit.png new file mode 100644 index 0000000000..30348f475e Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/medkit.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/meta.json b/Resources/Textures/White/Specific/spawner.rsi/meta.json new file mode 100644 index 0000000000..8a1f4f0185 --- /dev/null +++ b/Resources/Textures/White/Specific/spawner.rsi/meta.json @@ -0,0 +1,95 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/blob/master/icons/effects/random_spawners.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "barricade" + }, + { + "name": "book" + }, + { + "name": "power" + }, + { + "name": "box" + }, + { + "name": "briefcase" + }, + { + "name": "cash" + }, + { + "name": "caution" + }, + { + "name": "circuit" + }, + { + "name": "disabler" + }, + { + "name": "e_gun" + }, + { + "name": "flashlight" + }, + { + "name": "girder" + }, + { + "name": "grille" + }, + { + "name": "handcuffs" + }, + { + "name": "locker" + }, + { + "name": "medkit" + }, + { + "name": "metal" + }, + { + "name": "peel" + }, + { + "name": "pistol" + }, + { + "name": "rods" + }, + { + "name": "rollerbed" + }, + { + "name": "shard" + }, + { + "name": "shiv" + }, + { + "name": "tank" + }, + { + "name": "toolbox" + }, + { + "name": "vomit" + }, + { + "name": "wood" + }, + { + "name": "wrench" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/White/Specific/spawner.rsi/metal.png b/Resources/Textures/White/Specific/spawner.rsi/metal.png new file mode 100644 index 0000000000..50dee7569e Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/metal.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/peel.png b/Resources/Textures/White/Specific/spawner.rsi/peel.png new file mode 100644 index 0000000000..31205cdee9 Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/peel.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/pistol.png b/Resources/Textures/White/Specific/spawner.rsi/pistol.png new file mode 100644 index 0000000000..8f381b46ce Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/pistol.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/power.png b/Resources/Textures/White/Specific/spawner.rsi/power.png new file mode 100644 index 0000000000..40bd81efc1 Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/power.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/rods.png b/Resources/Textures/White/Specific/spawner.rsi/rods.png new file mode 100644 index 0000000000..08e48ecf53 Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/rods.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/rollerbed.png b/Resources/Textures/White/Specific/spawner.rsi/rollerbed.png new file mode 100644 index 0000000000..5db7fe5bb5 Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/rollerbed.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/shard.png b/Resources/Textures/White/Specific/spawner.rsi/shard.png new file mode 100644 index 0000000000..0ffec1b468 Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/shard.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/shiv.png b/Resources/Textures/White/Specific/spawner.rsi/shiv.png new file mode 100644 index 0000000000..9ddb68935e Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/shiv.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/tank.png b/Resources/Textures/White/Specific/spawner.rsi/tank.png new file mode 100644 index 0000000000..b7e2895b84 Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/tank.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/toolbox.png b/Resources/Textures/White/Specific/spawner.rsi/toolbox.png new file mode 100644 index 0000000000..58d6682041 Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/toolbox.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/vomit.png b/Resources/Textures/White/Specific/spawner.rsi/vomit.png new file mode 100644 index 0000000000..fbb9a57859 Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/vomit.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/wood.png b/Resources/Textures/White/Specific/spawner.rsi/wood.png new file mode 100644 index 0000000000..e497cd31bd Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/wood.png differ diff --git a/Resources/Textures/White/Specific/spawner.rsi/wrench.png b/Resources/Textures/White/Specific/spawner.rsi/wrench.png new file mode 100644 index 0000000000..d7ec27045d Binary files /dev/null and b/Resources/Textures/White/Specific/spawner.rsi/wrench.png differ