From edf9f243a100e406a8d5837bb7ac9428887a4c05 Mon Sep 17 00:00:00 2001 From: Aviu00 <93730715+Aviu00@users.noreply.github.com> Date: Sun, 28 Jul 2024 16:54:32 +0000 Subject: [PATCH 1/8] Blood (#507) * - tweak: Nerf spear. * - tweak: Blood bolt barrage. * - add: Cult stuff. * - fix: Cult fixes. * - remove: Garbage. * - fix: Multiple pylons. * - fix: Pylon placement fix. * - add: Lots of cult stuff. --- Content.Client/Chat/Managers/ChatManager.cs | 4 +- .../Systems/Chat/ChatUIController.cs | 5 +- .../_White/Cult/ShowCultHudSystem.cs | 11 ++- .../CultPylonPlacementHijack.cs | 48 +++---------- Content.Server/Chat/Commands/CultCommand.cs | 4 +- .../Damage/Systems/DamageOtherOnHitSystem.cs | 4 +- .../_White/Cult/GameRule/CultRuleComponent.cs | 9 +++ .../_White/Cult/GameRule/CultRuleSystem.cs | 20 +++++- .../Items/Components/CultStunHandComponent.cs | 20 ++++++ .../Cult/Items/Systems/CultStunHandSystem.cs | 56 +++++++++++++++ .../_White/Cult/Pylon/PylonSystem.cs | 11 ++- .../Cult/Runes/Comps/CultRuneBaseComponent.cs | 5 ++ .../Cult/Runes/Systems/CultSystem.Actions.cs | 59 ++++++++-------- .../Cult/Runes/Systems/CultSystem.Rune.cs | 12 ++-- .../_White/Wizard/Magic/WizardSpellsSystem.cs | 13 ++-- .../SharedHandsSystem.Interactions.cs | 2 +- .../Projectiles/SharedProjectileSystem.cs | 3 + .../Weapons/Melee/MeleeWeaponComponent.cs | 23 ++++-- .../Weapons/Melee/SharedMeleeWeaponSystem.cs | 24 +++++++ .../_White/Cult/Actions/CultActions.cs | 43 ++++++++---- .../Cult/Components/CultistComponent.cs | 4 +- .../DeleteOnDropAttemptComponent.cs | 8 +++ .../_White/Cult/Pylon/SharedPylonComponent.cs | 22 +++++- .../_White/Cult/Systems/BloodSpearSystem.cs | 19 ++++- .../_White/Cult/Systems/CultistSystem.cs | 12 ++-- .../Cult/Systems/DeleteOnDropAttemptSystem.cs | 19 +++++ .../Locale/ru-RU/_white/cult/abilities.ftl | 4 +- .../Locale/ru-RU/_white/cult/bolt-barrage.ftl | 3 +- Resources/Locale/ru-RU/_white/cult/cult.ftl | 2 +- .../Locale/ru-RU/_white/cult/entities.ftl | 18 +++-- .../Locale/ru-RU/_white/cult/factory.ftl | 16 +++-- .../Locale/ru-RU/_white/cult/messages.ftl | 3 + .../Locale/ru-RU/_white/wizard/wizard.ftl | 1 + .../Weapons/Guns/Projectiles/projectiles.yml | 2 +- .../_White/Actions/cult_actions.yml | 19 +++-- .../_White/Entities/Cult/Effects/effects.yml | 17 ++++- .../Entities/Cult/Items/blood_barrage.yml | 2 + .../_White/Entities/Cult/Items/stun_hand.yml | 34 +++++++++ .../_White/Entities/Cult/Items/tome_craft.yml | 10 +++ .../_White/Entities/Cult/Runes/cult_runes.yml | 1 + .../Entities/Cult/Weapons/blood_spear.yml | 2 +- .../Objects/Weapons/chaplain_weapons.yml | 2 +- .../Prototypes/_White/Wizard/magic_items.yml | 2 + .../Entities/arcane_barrage.rsi/bullet.png | Bin 545 -> 489 bytes .../White/Cult/Entities/stun.rsi/icon.png | Bin 0 -> 1428 bytes .../Cult/Entities/stun.rsi/inhand-left.png | Bin 0 -> 845 bytes .../Cult/Entities/stun.rsi/inhand-right.png | Bin 0 -> 843 bytes .../White/Cult/Entities/stun.rsi/meta.json | 66 ++++++++++++++++++ 48 files changed, 514 insertions(+), 150 deletions(-) create mode 100644 Content.Server/_White/Cult/Items/Components/CultStunHandComponent.cs create mode 100644 Content.Server/_White/Cult/Items/Systems/CultStunHandSystem.cs create mode 100644 Content.Shared/_White/Cult/Components/DeleteOnDropAttemptComponent.cs create mode 100644 Content.Shared/_White/Cult/Systems/DeleteOnDropAttemptSystem.cs create mode 100644 Resources/Locale/ru-RU/_white/cult/messages.ftl create mode 100644 Resources/Prototypes/_White/Entities/Cult/Items/stun_hand.yml create mode 100644 Resources/Textures/White/Cult/Entities/stun.rsi/icon.png create mode 100644 Resources/Textures/White/Cult/Entities/stun.rsi/inhand-left.png create mode 100644 Resources/Textures/White/Cult/Entities/stun.rsi/inhand-right.png create mode 100644 Resources/Textures/White/Cult/Entities/stun.rsi/meta.json diff --git a/Content.Client/Chat/Managers/ChatManager.cs b/Content.Client/Chat/Managers/ChatManager.cs index 55e1b0a5c6..7120dd202f 100644 --- a/Content.Client/Chat/Managers/ChatManager.cs +++ b/Content.Client/Chat/Managers/ChatManager.cs @@ -1,5 +1,6 @@ using Content.Client.Administration.Managers; using Content.Client.Ghost; +using Content.Shared._White.Cult.Components; using Content.Shared.Administration; using Content.Shared.Changeling; using Content.Shared.Chat; @@ -54,7 +55,8 @@ namespace Content.Client.Chat.Managers case ChatSelectChannel.Cult: var localEnt = _player.LocalPlayer != null ? _player.LocalPlayer.ControlledEntity : null; - if (_entityManager.TryGetComponent(localEnt, out CultistComponent? comp)) + if (_entityManager.HasComponent(localEnt) || + _entityManager.HasComponent(localEnt)) _consoleHost.ExecuteCommand($"csay \"{CommandParsing.Escape(text)}\""); break; diff --git a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs index b366449eee..1200fa0d96 100644 --- a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs +++ b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs @@ -20,6 +20,7 @@ using Content.Shared.Damage.ForceSay; using Content.Shared.Input; using Content.Shared.Radio; using Content.Shared._White; +using Content.Shared._White.Cult.Components; using Content.Shared._White.Utils; using Content.Shared._White.Cult.Systems; using Robust.Client.Graphics; @@ -235,8 +236,8 @@ public sealed class ChatUIController : UIController _input.SetInputCommand(ContentKeyFunctions.CycleChatChannelBackward, InputCmdHandler.FromDelegate(_ => CycleChatChannel(false))); - SubscribeLocalEvent(OnUpdateChangelingChat); // WD EDIT + SubscribeLocalEvent(OnUpdateChangelingChat); SubscribeLocalEvent(OnUpdateCultState); // WD EDIT END @@ -563,7 +564,7 @@ public sealed class ChatUIController : UIController // WD EDIT var localEnt = _player.LocalEntity; - if (_entities.HasComponent(localEnt)) + if (_entities.HasComponent(localEnt) || _entities.HasComponent(localEnt)) { FilterableChannels |= ChatChannel.Cult; CanSendChannels |= ChatSelectChannel.Cult; diff --git a/Content.Client/_White/Cult/ShowCultHudSystem.cs b/Content.Client/_White/Cult/ShowCultHudSystem.cs index 6c845f468d..5edccd14e0 100644 --- a/Content.Client/_White/Cult/ShowCultHudSystem.cs +++ b/Content.Client/_White/Cult/ShowCultHudSystem.cs @@ -1,5 +1,4 @@ -using Content.Shared._White.Cult; -using Content.Shared._White.Cult.Components; +using Content.Shared._White.Cult.Components; using Robust.Client.Graphics; using Robust.Client.Player; using Robust.Shared.Player; @@ -29,7 +28,7 @@ public sealed class ShowCultHudSystem : EntitySystem _overlay = new CultHudOverlay(EntityManager); } - private void OnComponentInit(EntityUid uid, ShowCultHudComponent component, ComponentInit args) + private void OnComponentInit(EntityUid uid, T component, ComponentInit args) { if (_player.LocalSession?.AttachedEntity != uid) return; @@ -38,7 +37,7 @@ public sealed class ShowCultHudSystem : EntitySystem } - private void OnComponentRemoved(EntityUid uid, ShowCultHudComponent component, ComponentRemove args) + private void OnComponentRemoved(EntityUid uid, T component, ComponentRemove args) { if (_player.LocalSession?.AttachedEntity != uid) return; @@ -47,7 +46,7 @@ public sealed class ShowCultHudSystem : EntitySystem } - private void OnPlayerAttached(EntityUid uid, ShowCultHudComponent component, PlayerAttachedEvent args) + private void OnPlayerAttached(EntityUid uid, T component, PlayerAttachedEvent args) { if (_player.LocalSession != args.Player) return; @@ -55,7 +54,7 @@ public sealed class ShowCultHudSystem : EntitySystem _overlayManager.AddOverlay(_overlay); } - private void OnPlayerDetached(EntityUid uid, ShowCultHudComponent component, PlayerDetachedEvent args) + private void OnPlayerDetached(EntityUid uid, T component, PlayerDetachedEvent args) { if (_player.LocalSession != args.Player) return; diff --git a/Content.Client/_White/Cult/UI/StructureRadial/CultPylonPlacementHijack.cs b/Content.Client/_White/Cult/UI/StructureRadial/CultPylonPlacementHijack.cs index bf3f349560..c6a12e6e0c 100644 --- a/Content.Client/_White/Cult/UI/StructureRadial/CultPylonPlacementHijack.cs +++ b/Content.Client/_White/Cult/UI/StructureRadial/CultPylonPlacementHijack.cs @@ -1,5 +1,6 @@ using System.Linq; using Content.Client.Construction; +using Content.Shared._White.Cult.Pylon; using Content.Shared.Construction.Prototypes; using Content.Shared.Popups; using Robust.Client.Placement; @@ -8,60 +9,33 @@ using Robust.Shared.Map; namespace Content.Client._White.Cult.UI.StructureRadial; -public sealed class CultPylonPlacementHijack : PlacementHijack +public sealed class CultPylonPlacementHijack(ConstructionPrototype? prototype, IEntityManager entMan, EntityUid player) + : PlacementHijack { - private readonly ConstructionSystem _constructionSystem; - private readonly IEntityManager _entMan; - private readonly ConstructionPrototype? _prototype; - private readonly EntityUid _player; + private readonly ConstructionSystem _constructionSystem = entMan.System(); - public override bool CanRotate { get; } - - public CultPylonPlacementHijack(ConstructionPrototype? prototype, IEntityManager entMan, EntityUid player) - { - _prototype = prototype; - _entMan = entMan; - _player = player; - _constructionSystem = entMan.System(); - CanRotate = prototype?.CanRotate ?? true; - } + public override bool CanRotate { get; } = prototype?.CanRotate ?? true; /// public override bool HijackPlacementRequest(EntityCoordinates coordinates) { - if (_prototype == null) + if (prototype == null) return true; - if (CheckForStructure(coordinates)) + if (SharedPylonComponent.CheckForStructure(coordinates, entMan, 10f)) { - var popup = _entMan.System(); - popup.PopupClient(Loc.GetString("cult-structure-craft-another-structure-nearby"), _player, _player); + var popup = entMan.System(); + popup.PopupClient(Loc.GetString("cult-structure-craft-another-structure-nearby"), player, player); return true; } _constructionSystem.ClearAllGhosts(); var dir = Manager.Direction; - _constructionSystem.SpawnGhost(_prototype, coordinates, dir); + _constructionSystem.SpawnGhost(prototype, coordinates, dir); return true; } - private bool CheckForStructure(EntityCoordinates coordinates) - { - var lookupSystem = _entMan.System(); - var entities = lookupSystem.GetEntitiesInRange(coordinates, 10f); - foreach (var ent in entities) - { - if (!_entMan.TryGetComponent(ent, out var metadata)) - continue; - - if (metadata.EntityPrototype?.ID is "CultPylon") - return true; - } - - return false; - } - /// public override bool HijackDeletion(EntityUid entity) { @@ -77,6 +51,6 @@ public sealed class CultPylonPlacementHijack : PlacementHijack public override void StartHijack(PlacementManager manager) { base.StartHijack(manager); - manager.CurrentTextures = _prototype?.Layers.Select(sprite => sprite.DirFrame0()).ToList(); + manager.CurrentTextures = prototype?.Layers.Select(sprite => sprite.DirFrame0()).ToList(); } } diff --git a/Content.Server/Chat/Commands/CultCommand.cs b/Content.Server/Chat/Commands/CultCommand.cs index d10fc376ee..35763c2f6c 100644 --- a/Content.Server/Chat/Commands/CultCommand.cs +++ b/Content.Server/Chat/Commands/CultCommand.cs @@ -1,6 +1,7 @@ using Content.Server.Chat.Systems; using Content.Shared.Administration; using Content.Shared._White.Cult; +using Content.Shared._White.Cult.Components; using Robust.Shared.Console; using Robust.Shared.Enums; using CultistComponent = Content.Shared._White.Cult.Components.CultistComponent; @@ -35,7 +36,8 @@ namespace Content.Server.Chat.Commands var entityManager = IoCManager.Resolve(); - if (!entityManager.HasComponent(entity)) + if (!entityManager.HasComponent(entity) && + !entityManager.HasComponent(entity)) { return; } diff --git a/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs b/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs index 7447271526..4183ae243d 100644 --- a/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs +++ b/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs @@ -3,6 +3,7 @@ using Content.Server.Damage.Components; using Content.Server.Weapons.Ranged.Systems; using Content.Shared.Camera; using Content.Server._White.Crossbow; +using Content.Shared._White.Cult.Systems; using Content.Shared.Damage; using Content.Shared.Damage.Events; using Content.Shared.Damage.Systems; @@ -30,7 +31,8 @@ namespace Content.Server.Damage.Systems public override void Initialize() { SubscribeLocalEvent(OnDoHit, - before: new[] {typeof(MeleeThrowOnHitSystem)}); // WD EDIT + before: new[] {typeof(MeleeThrowOnHitSystem)}, + after: new[] {typeof(BloodSpearSystem)}); // WD EDIT SubscribeLocalEvent(OnDamageExamine); } diff --git a/Content.Server/_White/Cult/GameRule/CultRuleComponent.cs b/Content.Server/_White/Cult/GameRule/CultRuleComponent.cs index e16d943501..e253305772 100644 --- a/Content.Server/_White/Cult/GameRule/CultRuleComponent.cs +++ b/Content.Server/_White/Cult/GameRule/CultRuleComponent.cs @@ -50,6 +50,8 @@ public sealed partial class CultRuleComponent : Component public List Constructs = new(); public CultWinCondition WinCondition = CultWinCondition.Draw; + + public CultStage Stage = CultStage.Normal; } public enum CultWinCondition : byte @@ -59,4 +61,11 @@ public enum CultWinCondition : byte Failure, } +public enum CultStage : byte +{ + Normal, + RedEyes, + Pentagram, +} + public sealed class CultNarsieSummoned : EntityEventArgs; diff --git a/Content.Server/_White/Cult/GameRule/CultRuleSystem.cs b/Content.Server/_White/Cult/GameRule/CultRuleSystem.cs index 4ad0a2047a..5ba8bb2e3c 100644 --- a/Content.Server/_White/Cult/GameRule/CultRuleSystem.cs +++ b/Content.Server/_White/Cult/GameRule/CultRuleSystem.cs @@ -6,6 +6,7 @@ using Content.Server.Bible.Components; using Content.Server.GameTicking; using Content.Server.GameTicking.Rules; using Content.Server.GameTicking.Rules.Components; +using Content.Server.Hands.Systems; using Content.Server.Objectives.Components; using Content.Server.Roles; using Content.Server.RoundEnd; @@ -53,6 +54,7 @@ public sealed class CultRuleSystem : GameRuleSystem [Dependency] private readonly GulagSystem _gulag = default!; [Dependency] private readonly BloodSpearSystem _bloodSpear = default!; [Dependency] private readonly ContainerSystem _container = default!; + [Dependency] private readonly HandsSystem _hands = default!; private const int PlayerPerCultist = 10; private int _minStartingCultists; @@ -175,6 +177,8 @@ public sealed class CultRuleSystem : GameRuleSystem if (TryComp(uid, out var actor)) { cult.CultistsCache.TryAdd(name, actor.PlayerSession.Name); + _mindSystem.TryGetMind(actor.PlayerSession.UserId, out var mind); + component.OriginalMind = mind; } UpdateCultistsAppearance(cult); @@ -339,7 +343,12 @@ public sealed class CultRuleSystem : GameRuleSystem var cultistsCount = cultRuleComponent.CurrentCultists.Count; var constructsCount = cultRuleComponent.Constructs.Count; var totalCultMembers = cultistsCount + constructsCount; - if (totalCultMembers < cultRuleComponent.ReadEyeThreshold) + if (totalCultMembers >= cultRuleComponent.PentagramThreshold) + cultRuleComponent.Stage = CultStage.Pentagram; + else if (totalCultMembers >= cultRuleComponent.ReadEyeThreshold && cultRuleComponent.Stage == CultStage.Normal) + cultRuleComponent.Stage = CultStage.RedEyes; + + if (cultRuleComponent.Stage == CultStage.Normal) return; foreach (var cultistComponent in cultRuleComponent.CurrentCultists) @@ -350,7 +359,7 @@ public sealed class CultRuleSystem : GameRuleSystem Dirty(cultistComponent.Owner, appearanceComponent); } - if (totalCultMembers < cultRuleComponent.PentagramThreshold) + if (cultRuleComponent.Stage != CultStage.Pentagram) return; EnsureComp(cultistComponent.Owner); @@ -458,6 +467,13 @@ public sealed class CultRuleSystem : GameRuleSystem _container.Remove(container.ContainedEntity.Value, container, true, true); } } + + foreach (var item in _hands.EnumerateHeld(uid)) + { + if (TryComp(item, out CultItemComponent? cultItem) && !cultItem.CanPickUp && + !_hands.TryDrop(uid, item, null, false, false)) + QueueDel(item); + } } public void TransferRole(EntityUid transferFrom, EntityUid transferTo) diff --git a/Content.Server/_White/Cult/Items/Components/CultStunHandComponent.cs b/Content.Server/_White/Cult/Items/Components/CultStunHandComponent.cs new file mode 100644 index 0000000000..e7e43a730e --- /dev/null +++ b/Content.Server/_White/Cult/Items/Components/CultStunHandComponent.cs @@ -0,0 +1,20 @@ +namespace Content.Server._White.Cult.Items.Components; + +[RegisterComponent] +public sealed partial class CultStunHandComponent : Component +{ + [DataField] + public TimeSpan Duration = TimeSpan.FromSeconds(16); + + [DataField] + public TimeSpan HaloDuration = TimeSpan.FromSeconds(1.5); + + [DataField] + public TimeSpan MuteDuration = TimeSpan.FromSeconds(12); + + [DataField] + public TimeSpan HaloMuteDuration = TimeSpan.FromSeconds(1); + + [DataField] + public string Speech = "Fuu ma'jin!"; +} diff --git a/Content.Server/_White/Cult/Items/Systems/CultStunHandSystem.cs b/Content.Server/_White/Cult/Items/Systems/CultStunHandSystem.cs new file mode 100644 index 0000000000..57b4006d7a --- /dev/null +++ b/Content.Server/_White/Cult/Items/Systems/CultStunHandSystem.cs @@ -0,0 +1,56 @@ +using Content.Server._White.Cult.Items.Components; +using Content.Server.Body.Components; +using Content.Server.Body.Systems; +using Content.Server.Chat.Systems; +using Content.Server.Popups; +using Content.Server.Stunnable; +using Content.Shared._White.Chaplain; +using Content.Shared.Popups; +using Content.Shared.StatusEffect; +using Content.Shared.Weapons.Melee.Events; + +namespace Content.Server._White.Cult.Items.Systems; + +public sealed class CultStunHandSystem : EntitySystem +{ + [Dependency] private readonly StunSystem _stun = default!; + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly HolyWeaponSystem _holyWeapon = default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly BloodstreamSystem _bloodstream = default!; + [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnHit); + } + + private void OnHit(Entity ent, ref MeleeHitEvent args) + { + if (args.HitEntities.Count == 0) + return; + + var target = args.HitEntities[0]; + var (uid, comp) = ent; + + QueueDel(uid); + Spawn("CultStunFlashEffect", Transform(target).Coordinates); + _chat.TrySendInGameICMessage(args.User, comp.Speech, InGameICChatType.Whisper, false); + if (TryComp(args.User, out BloodstreamComponent? bloodstream)) + _bloodstream.TryModifyBloodLevel(args.User, -10, bloodstream, createPuddle: false); + + if (_holyWeapon.IsHoldingHolyWeapon(target)) + { + _popupSystem.PopupEntity(Loc.GetString("cult-magic-holy"), args.User, args.User, PopupType.MediumCaution); + return; + } + + var halo = HasComp(args.User); + + _statusEffects.TryAddStatusEffect(target, "Muted", halo ? comp.HaloMuteDuration : comp.MuteDuration, true, + "Muted"); + _stun.TryParalyze(target, halo ? comp.HaloDuration : comp.Duration, true); + } +} diff --git a/Content.Server/_White/Cult/Pylon/PylonSystem.cs b/Content.Server/_White/Cult/Pylon/PylonSystem.cs index 1673a4ca90..4f47481227 100644 --- a/Content.Server/_White/Cult/Pylon/PylonSystem.cs +++ b/Content.Server/_White/Cult/Pylon/PylonSystem.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using System.Numerics; using Content.Server.Atmos.Piping.Other.Components; using Content.Server.Body.Components; @@ -61,6 +61,15 @@ public sealed class PylonSystem : EntitySystem private void OnInit(EntityUid uid, SharedPylonComponent component, ComponentInit args) { + var coords = Transform(uid).Coordinates; + if (SharedPylonComponent.CheckForStructure(coords, EntityManager, 9f, uid)) + { + QueueDel(uid); + _popupSystem.PopupCoordinates(Loc.GetString("cult-structure-craft-another-structure-nearby"), + coords, PopupType.MediumCaution); + Spawn("CultRunicMetal4", coords); + return; + } UpdateAppearance(uid, component); } diff --git a/Content.Server/_White/Cult/Runes/Comps/CultRuneBaseComponent.cs b/Content.Server/_White/Cult/Runes/Comps/CultRuneBaseComponent.cs index 5e26945c34..5164b5ff43 100644 --- a/Content.Server/_White/Cult/Runes/Comps/CultRuneBaseComponent.cs +++ b/Content.Server/_White/Cult/Runes/Comps/CultRuneBaseComponent.cs @@ -1,3 +1,5 @@ +using Content.Server.Chat.Systems; + namespace Content.Server._White.Cult.Runes.Comps; [RegisterComponent] @@ -14,4 +16,7 @@ public sealed partial class CultRuneBaseComponent : Component [ViewVariables(VVAccess.ReadWrite), DataField("invokePhrase")] public string InvokePhrase = ""; + + [DataField] + public InGameICChatType InvokeChatType = InGameICChatType.Whisper; } diff --git a/Content.Server/_White/Cult/Runes/Systems/CultSystem.Actions.cs b/Content.Server/_White/Cult/Runes/Systems/CultSystem.Actions.cs index 6004d21a1b..4e900eaae4 100644 --- a/Content.Server/_White/Cult/Runes/Systems/CultSystem.Actions.cs +++ b/Content.Server/_White/Cult/Runes/Systems/CultSystem.Actions.cs @@ -5,6 +5,8 @@ using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Emp; using Content.Server.EUI; using Content.Server._White.Cult.UI; +using Content.Server._White.Wizard.Magic; +using Content.Server.Chat.Systems; using Content.Shared._White.Chaplain; using Content.Shared.Chemistry.Components; using Content.Shared.Damage; @@ -50,6 +52,7 @@ public partial class CultSystem [Dependency] private readonly PhysicsSystem _physics = default!; [Dependency] private readonly HolyWeaponSystem _holyWeapon = default!; [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; + [Dependency] private readonly WizardSpellsSystem _spells = default!; private const string TileId = "CultFloor"; private const string ConcealedTileId = "CultFloorConcealed"; @@ -66,7 +69,7 @@ public partial class CultSystem SubscribeLocalEvent(OnBloodRites); SubscribeLocalEvent(OnBloodSpearRecall); SubscribeLocalEvent(OnTeleport); - SubscribeLocalEvent(OnStunTarget); + SubscribeLocalEvent(OnStun); SubscribeLocalEvent(OnActionRemoved); SubscribeLocalEvent(OnShackles); } @@ -84,6 +87,11 @@ public partial class CultSystem if (_cuffable.TryAddNewCuffs(args.Target.Value, args.User, cuffs, cuffable, handcuffComponent)) { SharedCuffableSystem.SetUsed(handcuffComponent, true); + if (_statusEffectsSystem.TryAddStatusEffect(args.Target.Value, "Muted", TimeSpan.FromSeconds(10), + true, "Muted")) + { + _popupSystem.PopupEntity("Цель обезмолвлена.", args.User, args.User); + } return; } @@ -96,32 +104,16 @@ public partial class CultSystem Dirty(ent); } - private void OnStunTarget(EntityUid uid, CultistComponent component, CultStunTargetActionEvent args) + private void OnStun(EntityUid uid, CultistComponent component, CultStunActionEvent args) { - if (args.Target == uid || !TryComp(args.Performer, out var bloodstream) || - !TryComp(args.Target, out var status)) - return; - - if (_holyWeapon.IsHoldingHolyWeapon(args.Target)) + var entity = Spawn("StunHand", Transform(uid).Coordinates); + if (!_handsSystem.TryPickupAnyHand(uid, entity)) { - _popupSystem.PopupEntity("Сила священного оружия препятствует магии.", args.Performer, args.Performer, - PopupType.MediumCaution); + _popupSystem.PopupEntity(Loc.GetString("cult-magic-no-empty-hand"), uid, uid); + QueueDel(entity); + _actionsSystem.SetCooldown(args.Action, TimeSpan.FromSeconds(1)); return; } - - if (HasComp(args.Target)) - { - _popupSystem.PopupEntity("Он имплантирован чипом защиты разума.", args.Performer, args.Performer, - PopupType.MediumCaution); - return; - } - - if (!_stunSystem.TryParalyze(args.Target, TimeSpan.FromSeconds(6), true, status) & - !_statusEffectsSystem.TryAddStatusEffect(args.Target, "Muted", TimeSpan.FromSeconds(12), true, "Muted", - status)) - return; - - _bloodstreamSystem.TryModifyBloodLevel(uid, -10, bloodstream, createPuddle: false); args.Handled = true; } @@ -133,7 +125,7 @@ public partial class CultSystem if (_holyWeapon.IsHoldingHolyWeapon(args.Target)) { - _popupSystem.PopupEntity("Сила священного оружия препятствует магии.", args.Performer, args.Performer, + _popupSystem.PopupEntity(Loc.GetString("cult-magic-holy"), args.Performer, args.Performer, PopupType.MediumCaution); return; } @@ -152,6 +144,7 @@ public partial class CultSystem _euiManager.OpenEui(eui, actor.PlayerSession); eui.StateDirty(); + Speak(args); args.Handled = true; } @@ -210,6 +203,7 @@ public partial class CultSystem _popupSystem.PopupEntity(Loc.GetString("verb-blood-rites-message", ("blood", component.RitesBloodAmount)), uid, uid); + Speak(args); args.Handled = true; } @@ -342,6 +336,7 @@ public partial class CultSystem _audio.PlayPvs(conceal ? "/Audio/White/Cult/smoke.ogg" : "/Audio/White/Cult/enter_blood.ogg", uid, AudioParams.Default.WithMaxDistance(5f)); _bloodstreamSystem.TryModifyBloodLevel(uid, -2, bloodstream, createPuddle: false); + Speak(args); args.Handled = true; } @@ -420,6 +415,7 @@ public partial class CultSystem _empSystem.EmpPulse(_transform.GetMapCoordinates(uid), 5, 100000, 10f); + Speak(args); args.Handled = true; } @@ -430,13 +426,6 @@ public partial class CultSystem _bloodstreamSystem.TryModifyBloodLevel(uid, -5, bloodstream, createPuddle: false); - if (!_holyWeapon.IsHoldingHolyWeapon(args.Target) && - _statusEffectsSystem.TryAddStatusEffect(args.Target, "Muted", TimeSpan.FromSeconds(10), true, "Muted")) - { - _popupSystem.PopupEntity("Цель обезмолвлена.", args.Performer, args.Performer); - args.Handled = true; - } - if (!TryComp(args.Target, out CuffableComponent? cuffs) || cuffs.Container.ContainedEntities.Count > 0) return; @@ -447,6 +436,7 @@ public partial class CultSystem BreakOnDamage = true }); + Speak(args); args.Handled = true; } @@ -482,6 +472,7 @@ public partial class CultSystem stackNew.Count = count; _popupSystem.PopupEntity("Конвертируем сталь в руинический металл!", args.Performer, args.Performer); + Speak(args); args.Handled = true; } @@ -498,6 +489,12 @@ public partial class CultSystem _bloodstreamSystem.TryModifyBloodLevel(args.Performer, -10, bloodstreamComponent, false); _handsSystem.TryPickupAnyHand(args.Performer, dagger); + Speak(args); args.Handled = true; } + + private void Speak(BaseActionEvent args) + { + _spells.Speak(args, InGameICChatType.Whisper); + } } diff --git a/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs b/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs index 919974f7d5..1c5ceb6e7e 100644 --- a/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs +++ b/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs @@ -16,6 +16,7 @@ using Content.Server.Chemistry.Components; using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Fluids.Components; using Content.Server.Ghost; +using Content.Server.Pinpointer; using Content.Server.Revenant.Components; using Content.Shared.Chemistry.Components.SolutionManager; using Content.Shared.Cuffs.Components; @@ -51,6 +52,7 @@ using Robust.Shared.Map; using Robust.Shared.Physics.Events; using Robust.Shared.Player; using Robust.Shared.Random; +using Robust.Shared.Utility; using CultistComponent = Content.Shared._White.Cult.Components.CultistComponent; namespace Content.Server._White.Cult.Runes.Systems; @@ -77,6 +79,7 @@ public sealed partial class CultSystem : EntitySystem [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly MobThresholdSystem _thresholdSystem = default!; + [Dependency] private readonly NavMapSystem _navMap = default!; public override void Initialize() { @@ -404,7 +407,7 @@ public sealed partial class CultSystem : EntitySystem foreach (var cultist in cultists) { - _chat.TrySendInGameICMessage(cultist, component.InvokePhrase, InGameICChatType.Speak, false, false, null, + _chat.TrySendInGameICMessage(cultist, component.InvokePhrase, component.InvokeChatType, false, false, null, null, null, false); } } @@ -1347,11 +1350,8 @@ public sealed partial class CultSystem : EntitySystem } damage = 40; - var pos = _transform.GetMapCoordinates(uid, transComp); - var x = (int) pos.X; - var y = (int) pos.Y; - var posText = $"(x = {x}, y = {y})"; - _chat.DispatchGlobalAnnouncement(Loc.GetString("cult-narsie-summon-drawn-position", ("posText", posText)), + _chat.DispatchGlobalAnnouncement(Loc.GetString("cult-narsie-summon-drawn-position", + ("location", FormattedMessage.RemoveMarkup(_navMap.GetNearestBeaconString((uid, transComp))))), "CULT", true, _apocRuneEndDrawing, colorOverride: Color.DarkRed); } diff --git a/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs b/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs index e648bcdf94..a08f8af110 100644 --- a/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs +++ b/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs @@ -174,6 +174,12 @@ public sealed class WizardSpellsSystem : EntitySystem return; } + if (HasComp(target)) + { + _popupSystem.PopupEntity(Loc.GetString("mindswap-cultist-failed"), uid, uid, PopupType.MediumCaution); + return; + } + var userHasMind = _mindSystem.TryGetMind(uid, out var mindId, out var mind); var targetHasMind = _mindSystem.TryGetMind(target, out var targetMindId, out var targetMind); @@ -183,8 +189,6 @@ public sealed class WizardSpellsSystem : EntitySystem SwapComponent(uid, target); SwapComponent(uid, target); SwapComponent(uid, target); - SwapComponent(uid, target); - SwapComponent(uid, target); SwapComponent(uid, target); _mindSystem.TransferTo(mindId, target, mind: mind); @@ -854,13 +858,12 @@ public sealed class WizardSpellsSystem : EntitySystem !_statusEffectsSystem.HasStatusEffect(msg.Performer, "Incorporeal"); } - private void Speak(BaseActionEvent args) + public void Speak(BaseActionEvent args, InGameICChatType type = InGameICChatType.Speak) { if (args is not ISpeakSpell speak || string.IsNullOrWhiteSpace(speak.Speech)) return; - _chat.TrySendInGameICMessage(args.Performer, Loc.GetString(speak.Speech), - InGameICChatType.Speak, false); + _chat.TrySendInGameICMessage(args.Performer, Loc.GetString(speak.Speech), type, false); } private void SetCooldown(EntityUid action, ActionUseType useType) diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Interactions.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Interactions.cs index 3a8f086ba2..e2cb96fe65 100644 --- a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Interactions.cs +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Interactions.cs @@ -101,7 +101,7 @@ public abstract partial class SharedHandsSystem : EntitySystem if (TryComp(session?.AttachedEntity, out HandsComponent? hands) && hands.ActiveHand != null) // WD EDIT START { - if (HasComp(hands.ActiveHandEntity)) + if (HasComp(hands.ActiveHandEntity)) { if (_net.IsServer) QueueDel(hands.ActiveHandEntity.Value); diff --git a/Content.Shared/Projectiles/SharedProjectileSystem.cs b/Content.Shared/Projectiles/SharedProjectileSystem.cs index ba54be37b7..5fe5c7b208 100644 --- a/Content.Shared/Projectiles/SharedProjectileSystem.cs +++ b/Content.Shared/Projectiles/SharedProjectileSystem.cs @@ -116,6 +116,9 @@ public abstract partial class SharedProjectileSystem : EntitySystem return; // WD START + if (args.Handled) + return; + if (component is {Penetrate: true, PenetratedUid: null} && TryComp(args.Target, out PenetratedComponent? penetrated) && penetrated is {ProjectileUid: null, IsPinned: false} && diff --git a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs index ca1e074944..c19cc5edfa 100644 --- a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs +++ b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs @@ -1,5 +1,6 @@ using Content.Shared.Damage; using Content.Shared.FixedPoint; +using Content.Shared.Whitelist; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; @@ -62,19 +63,31 @@ public sealed partial class MeleeWeaponComponent : Component public bool Attacking = false; // WD START - [ViewVariables(VVAccess.ReadWrite), DataField] + [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] public bool CanHeavyAttack = true; - [ViewVariables(VVAccess.ReadWrite), DataField] + [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + public bool CanAttackSelf = true; + + [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + public bool CanMiss = true; + + [DataField] + public EntityWhitelist? AttackWhitelist; + + [DataField] + public EntityWhitelist? AttackBlacklist; + + [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] public bool IgnoreResistances; - [ViewVariables(VVAccess.ReadWrite), DataField] + [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] public float HeavyAttackStaminaCost = 8; - [ViewVariables(VVAccess.ReadWrite), DataField] + [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] public EntProtoId MissAnimation = "WeaponArcPunch"; - [ViewVariables(VVAccess.ReadWrite), DataField] + [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] public EntProtoId DisarmAnimation = "WeaponArcDisarm"; // WD END diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index 29772d804d..85e6edfa49 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -365,6 +365,30 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem if (weaponUid == lightTarget) return false; + // WD START + if (user == lightTarget && !weapon.CanAttackSelf) + return false; + + if (lightTarget == null) + { + if (weapon.CanMiss) + break; + return false; + } + + if (weapon.AttackWhitelist != null) + { + if (!weapon.AttackWhitelist.IsValid(lightTarget.Value, EntityManager)) + return false; + } + + if (weapon.AttackBlacklist != null) + { + if (weapon.AttackBlacklist.IsValid(lightTarget.Value, EntityManager)) + return false; + } + // WD END + break; case DisarmAttackEvent disarm: var disarmTarget = GetEntity(disarm.Target); diff --git a/Content.Shared/_White/Cult/Actions/CultActions.cs b/Content.Shared/_White/Cult/Actions/CultActions.cs index b3924e0046..eedcf82029 100644 --- a/Content.Shared/_White/Cult/Actions/CultActions.cs +++ b/Content.Shared/_White/Cult/Actions/CultActions.cs @@ -1,29 +1,40 @@ using Content.Shared.Actions; +using Content.Shared.Magic; namespace Content.Shared._White.Cult.Actions; -public sealed partial class CultTwistedConstructionActionEvent : EntityTargetActionEvent +public sealed partial class CultTwistedConstructionActionEvent : EntityTargetActionEvent, ISpeakSpell +{ + [DataField("speech")] + public string? Speech { get; private set; } +} + +public sealed partial class CultSummonDaggerActionEvent : InstantActionEvent, ISpeakSpell +{ + [DataField("speech")] + public string? Speech { get; private set; } +} + +public sealed partial class CultStunActionEvent : InstantActionEvent { } -public sealed partial class CultSummonDaggerActionEvent : InstantActionEvent +public sealed partial class CultTeleportTargetActionEvent : EntityTargetActionEvent, ISpeakSpell { + [DataField("speech")] + public string? Speech { get; private set; } } -public sealed partial class CultStunTargetActionEvent : EntityTargetActionEvent +public sealed partial class CultElectromagneticPulseInstantActionEvent : InstantActionEvent, ISpeakSpell { + [DataField("speech")] + public string? Speech { get; private set; } } -public sealed partial class CultTeleportTargetActionEvent : EntityTargetActionEvent -{ -} - -public sealed partial class CultElectromagneticPulseInstantActionEvent : InstantActionEvent -{ -} - -public sealed partial class CultShadowShacklesTargetActionEvent : EntityTargetActionEvent +public sealed partial class CultShadowShacklesTargetActionEvent : EntityTargetActionEvent, ISpeakSpell { + [DataField("speech")] + public string? Speech { get; private set; } } public sealed partial class CultSummonCombatEquipmentTargetActionEvent : EntityTargetActionEvent @@ -31,8 +42,10 @@ public sealed partial class CultSummonCombatEquipmentTargetActionEvent : EntityT } [Virtual] -public partial class CultConcealPresenceInstantActionEvent : InstantActionEvent +public partial class CultConcealPresenceInstantActionEvent : InstantActionEvent, ISpeakSpell { + [DataField("speech")] + public string? Speech { get; private set; } } public sealed partial class CultConcealInstantActionEvent : CultConcealPresenceInstantActionEvent @@ -43,8 +56,10 @@ public sealed partial class CultRevealInstantActionEvent : CultConcealPresenceIn { } -public sealed partial class CultBloodRitesInstantActionEvent : InstantActionEvent +public sealed partial class CultBloodRitesInstantActionEvent : InstantActionEvent, ISpeakSpell { + [DataField("speech")] + public string? Speech { get; private set; } } public sealed partial class CultBloodSpearRecallInstantActionEvent : InstantActionEvent diff --git a/Content.Shared/_White/Cult/Components/CultistComponent.cs b/Content.Shared/_White/Cult/Components/CultistComponent.cs index 758c61cd1c..a61f3a5f83 100644 --- a/Content.Shared/_White/Cult/Components/CultistComponent.cs +++ b/Content.Shared/_White/Cult/Components/CultistComponent.cs @@ -11,7 +11,7 @@ namespace Content.Shared._White.Cult.Components; /// This is used for tagging a mob as a cultist. /// [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] -public sealed partial class CultistComponent : ShowCultHudComponent +public sealed partial class CultistComponent : Component { [DataField("greetSound", customTypeSerializer: typeof(SoundSpecifierTypeSerializer))] public SoundSpecifier? CultistGreetSound = new SoundPathSpecifier("/Audio/CultSounds/fart.ogg"); @@ -41,7 +41,7 @@ public sealed partial class CultistComponent : ShowCultHudComponent public static string CultSummonCombatEquipmentAction = "ActionCultSummonCombatEquipment"; - public static string CultStunAction = "ActionCultStun"; + public static string CultStunAction = "InstantActionCultStun"; public static string CultShadowShacklesAction = "ActionCultShadowShackles"; diff --git a/Content.Shared/_White/Cult/Components/DeleteOnDropAttemptComponent.cs b/Content.Shared/_White/Cult/Components/DeleteOnDropAttemptComponent.cs new file mode 100644 index 0000000000..c6609123a2 --- /dev/null +++ b/Content.Shared/_White/Cult/Components/DeleteOnDropAttemptComponent.cs @@ -0,0 +1,8 @@ +namespace Content.Shared._White.Cult.Components; + +[RegisterComponent] +public sealed partial class DeleteOnDropAttemptComponent : Component +{ + [DataField] + public string Message = string.Empty; +} diff --git a/Content.Shared/_White/Cult/Pylon/SharedPylonComponent.cs b/Content.Shared/_White/Cult/Pylon/SharedPylonComponent.cs index 53964dd247..ab8597ae54 100644 --- a/Content.Shared/_White/Cult/Pylon/SharedPylonComponent.cs +++ b/Content.Shared/_White/Cult/Pylon/SharedPylonComponent.cs @@ -1,5 +1,6 @@ -using Content.Shared.Damage; +using Content.Shared.Damage; using Robust.Shared.Audio; +using Robust.Shared.Map; using Robust.Shared.Serialization; namespace Content.Shared._White.Cult.Pylon; @@ -64,6 +65,25 @@ public sealed partial class SharedPylonComponent : Component [DataField("wallConvertEffect")] public string WallConvertEffect = "CultWallGlow"; + + public static bool CheckForStructure(EntityCoordinates coordinates, IEntityManager entMan, float range, EntityUid? pylon = null) + { + var lookupSystem = entMan.System(); + var entities = lookupSystem.GetEntitiesInRange(coordinates, range); + foreach (var ent in entities) + { + if (ent == pylon) + continue; + + if (!entMan.TryGetComponent(ent, out var metadata)) + continue; + + if (metadata.EntityPrototype?.ID is "CultPylon") + return true; + } + + return false; + } } [Serializable, NetSerializable] diff --git a/Content.Shared/_White/Cult/Systems/BloodSpearSystem.cs b/Content.Shared/_White/Cult/Systems/BloodSpearSystem.cs index 35be109b81..523e8b576d 100644 --- a/Content.Shared/_White/Cult/Systems/BloodSpearSystem.cs +++ b/Content.Shared/_White/Cult/Systems/BloodSpearSystem.cs @@ -1,7 +1,9 @@ +using Content.Shared._White.Chaplain; using Content.Shared._White.Cult.Components; using Content.Shared.Actions; using Content.Shared.Examine; using Content.Shared.Hands; +using Content.Shared.Projectiles; using Content.Shared.StatusEffect; using Content.Shared.Stunnable; using Content.Shared.Throwing; @@ -15,6 +17,7 @@ public sealed class BloodSpearSystem : EntitySystem [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; [Dependency] private readonly SharedStunSystem _stunSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly HolyWeaponSystem _holy = default!; [Dependency] private readonly INetManager _net = default!; public override void Initialize() @@ -23,7 +26,8 @@ public sealed class BloodSpearSystem : EntitySystem SubscribeLocalEvent(OnRemove); SubscribeLocalEvent(OnEquip); - SubscribeLocalEvent(OnThrowDoHit); + SubscribeLocalEvent(OnThrowDoHit, + before: new[] {typeof(SharedProjectileSystem)}); SubscribeLocalEvent(OnExamine); } @@ -34,11 +38,20 @@ public sealed class BloodSpearSystem : EntitySystem private void OnThrowDoHit(Entity ent, ref ThrowDoHitEvent args) { + if (HasComp(args.Target) || HasComp(args.Target)) + { + args.Handled = true; + return; + } + if (!TryComp(args.Target, out StatusEffectsComponent? status)) return; - if(!_stunSystem.TryParalyze(args.Target, TimeSpan.FromSeconds(6), true, status)) - return; + if (!_holy.IsHoldingHolyWeapon(args.Target)) + { + if(!_stunSystem.TryParalyze(args.Target, TimeSpan.FromSeconds(4), true, status)) + return; + } if (_net.IsClient) return; diff --git a/Content.Shared/_White/Cult/Systems/CultistSystem.cs b/Content.Shared/_White/Cult/Systems/CultistSystem.cs index 57dc4661cf..12a8e1e387 100644 --- a/Content.Shared/_White/Cult/Systems/CultistSystem.cs +++ b/Content.Shared/_White/Cult/Systems/CultistSystem.cs @@ -1,3 +1,5 @@ +using Content.Shared._White.Cult.Components; + namespace Content.Shared._White.Cult.Systems; /// @@ -9,16 +11,18 @@ public sealed class CultistSystem : EntitySystem { base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnRemove); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnRemove); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnRemove); } - private void OnInit(EntityUid uid, Components.CultistComponent component, ComponentStartup args) + private void OnInit(EntityUid uid, T component, ComponentStartup args) { RaiseLocalEvent(new EventCultistComponentState(true)); } - private void OnRemove(EntityUid uid, Components.CultistComponent component, ComponentShutdown args) + private void OnRemove(EntityUid uid, T component, ComponentShutdown args) { RaiseLocalEvent(new EventCultistComponentState(false)); } diff --git a/Content.Shared/_White/Cult/Systems/DeleteOnDropAttemptSystem.cs b/Content.Shared/_White/Cult/Systems/DeleteOnDropAttemptSystem.cs new file mode 100644 index 0000000000..ab6b419e12 --- /dev/null +++ b/Content.Shared/_White/Cult/Systems/DeleteOnDropAttemptSystem.cs @@ -0,0 +1,19 @@ +using Content.Shared._White.Cult.Components; +using Content.Shared.Examine; + +namespace Content.Shared._White.Cult.Systems; + +public sealed class DeleteOnDropAttemptSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnExamine); + } + + private void OnExamine(Entity ent, ref ExaminedEvent args) + { + args.PushMarkup(Loc.GetString(ent.Comp.Message)); + } +} diff --git a/Resources/Locale/ru-RU/_white/cult/abilities.ftl b/Resources/Locale/ru-RU/_white/cult/abilities.ftl index fa6414e8fa..11f07a834f 100644 --- a/Resources/Locale/ru-RU/_white/cult/abilities.ftl +++ b/Resources/Locale/ru-RU/_white/cult/abilities.ftl @@ -34,8 +34,8 @@ ent-InstantActionSummonCultDagger = Призыв Ритуального Кинж ent-InstantActionBloodRites = Кровавые Обряды .desc = Высасывает кровь и исцеляет вас. -ent-ActionCultStun = Оглушение - .desc = Сильное заклинание, которое оглушает и обезмолвливает жертв. Не работает на цели со священным оружием в руках или с чипом защиты разума. +ent-InstantActionCultStun = Оглушение + .desc = Сильное заклинание, которое оглушает и обезмолвливает жертв. Не работает на цели со священным оружием в руках. При наличии пентаграммы над головой эффект сильно ослабевает. ent-ActionCultShadowShackles = Теневые Узы .desc = Бесшумное заклинание, которое наложит на человека теневые наручники и заставит вашу жертву замолчать на 10 секунд. diff --git a/Resources/Locale/ru-RU/_white/cult/bolt-barrage.ftl b/Resources/Locale/ru-RU/_white/cult/bolt-barrage.ftl index 0aa68a47a8..4812e36b20 100644 --- a/Resources/Locale/ru-RU/_white/cult/bolt-barrage.ftl +++ b/Resources/Locale/ru-RU/_white/cult/bolt-barrage.ftl @@ -1,3 +1,4 @@ bolt-barrage-component-no-empty-hand = Вам нужно иметь свободную руку, чтобы стрелять. bolt-barrage-component-not-cultist = Вы не умеете пользоваться магией. -bolt-barrage-component-extra-desc = [color=darkgray]Для стрельбы залпом необходимо иметь свободную руку. Вобросите залп, чтобы навсегда избавиться от него.[/color] +bolt-barrage-component-extra-desc = [color=darkgray]Для стрельбы залпом необходимо иметь свободную руку.[/color] +bolt-barrage-component-extra-message = [color=darkgray]Выбросите залп, чтобы навсегда избавиться от него.[/color] diff --git a/Resources/Locale/ru-RU/_white/cult/cult.ftl b/Resources/Locale/ru-RU/_white/cult/cult.ftl index ff9eb49c64..3b0b78375e 100644 --- a/Resources/Locale/ru-RU/_white/cult/cult.ftl +++ b/Resources/Locale/ru-RU/_white/cult/cult.ftl @@ -32,7 +32,7 @@ cult-blood-boil-rune-need-minimum = Необходимо минимум 3 кул cult-blood-boil-rune-no-blood = Кому-то из культистов не хватает крови. cult-blood-boil-rune-no-targets = Нет целей. cult-teleport-rune-default-label = безымянная метка -cult-narsie-summon-drawn-position = Культ закончил рисовать руну ритуала разрыва измерений! Координаты: { $posText } +cult-narsie-summon-drawn-position = Культ закончил рисовать руну ритуала разрыва измерений! Локация: { $location } cult-cant-draw-rune = Нельзя рисовать руну в космосе. runes-window-title = Руны diff --git a/Resources/Locale/ru-RU/_white/cult/entities.ftl b/Resources/Locale/ru-RU/_white/cult/entities.ftl index 81c08d879e..1c16bb87ab 100644 --- a/Resources/Locale/ru-RU/_white/cult/entities.ftl +++ b/Resources/Locale/ru-RU/_white/cult/entities.ftl @@ -5,11 +5,11 @@ ent-SoulShardGhost = камень душ .desc = Мистический светящийся осколок. .suffix = Роль призраков -ent-WetStone = точильный камень - .desc = Используется для заточки кромок стальных инструментов. +ent-StunHand = оглушающая аура + .desc = Оглушит и обезмолвит жертву при ударе. -ent-CultSharpener = древний точильный камень - .desc = Используется для заточки кромок стальных инструментов. +ent-ShadowShackles = теневые оковы + .desc = Оковы, сковывающие запястья с помощью зловещей магии. ent-CultRunicMetal = рунический металл .desc = Необычный лист металла с пульсирующей руной. @@ -19,10 +19,17 @@ ent-CultRunicMetal1 = рунический металл .desc = Необычный лист металла с пульсирующей руной. .suffix = Один +ent-CultRunicMetal4 = рунический металл + .desc = Необычный лист металла с пульсирующей руной. + .suffix = 4 + ent-CultRunicMetal20 = рунический металл .desc = Необычный лист металла с пульсирующей руной. .suffix = 20 +ent-AltarTome = архивы + .desc = Стол, заваленный тайными рукописями и книгами на неизвестных языках. + ent-CultBloodAltar = алтарь .desc = Кровавый алтарь, посвященный какому-то существу. @@ -38,9 +45,6 @@ ent-AirlockGlassCult = рунический шлюз ent-WallForceCult = светящаяся стена .desc = Нечестивый щит, блокирующий все атаки. -ent-CultClothingBlindfold = повязка Зилота - .desc = Повязка, наделенная странной силой. - ent-OfferingRune = руна предпонесения .desc = Мгновенно превращает обычного члена экипажа в культиста, для чего требуется 2 культиста вокруг руны. Члена экипажа с имплантом защиты разума нельзя перевоплотить, можно только принести в жертву, для чего нужно 3 культиста, которые встанут вокруг руны. Если цель мертва, то она будет принесена в жертву, для чего требуется 1 культист. diff --git a/Resources/Locale/ru-RU/_white/cult/factory.ftl b/Resources/Locale/ru-RU/_white/cult/factory.ftl index 177d2764cf..157e1b87a1 100644 --- a/Resources/Locale/ru-RU/_white/cult/factory.ftl +++ b/Resources/Locale/ru-RU/_white/cult/factory.ftl @@ -2,9 +2,6 @@ cultist-factory-charging = { $name } будут заряжаться ещё { $s cultist-factory-create = Создать { $itemName } cultist-factory-too-far = Слишком далеко -ent-AltarTome = архивы - .desc = Стол, заваленный тайными рукописями и книгами на неизвестных языках. - ent-CultRobeModify = одеяние флагелланта .desc = Какая-то религиозная роба. @@ -13,9 +10,18 @@ ent-CultMirrorShield = зеркальный щит ent-CultOuterArmor = бронированная мантия .desc = С первого взгляда кажется, что это простая мантия, но на ней имеется элементы брони. -ent-ShadowShackles = теневые оковы - .desc = Оковы, сковывающие запястья с помощью зловещей магии. + +ent-WetStone = точильный камень + .desc = Используется для заточки кромок стальных инструментов. + +ent-CultSharpener = древний точильный камень + .desc = Используется для заточки кромок стальных инструментов. + +ent-CultClothingBlindfold = повязка Зилота + .desc = Повязка, наделенная странной силой. + ent-BloodSpear = кровавое копьё .desc = Ужасающее копьё, полностью состоящее из кристаллизованной крови. + ent-BloodBarrage = залп кровавых снарядов .desc = Кровь за кровь. diff --git a/Resources/Locale/ru-RU/_white/cult/messages.ftl b/Resources/Locale/ru-RU/_white/cult/messages.ftl new file mode 100644 index 0000000000..560d37bedf --- /dev/null +++ b/Resources/Locale/ru-RU/_white/cult/messages.ftl @@ -0,0 +1,3 @@ +cult-stun-component-extra-message = [color=darkgray]Выбросите ауру, чтобы навсегда избавиться от неё.[/color] +cult-magic-holy = Сила священного предмета в руках цели препятствует магии! +cult-magic-no-empty-hand = Вам нужна свободная рука для использования заклинания! diff --git a/Resources/Locale/ru-RU/_white/wizard/wizard.ftl b/Resources/Locale/ru-RU/_white/wizard/wizard.ftl index f704e32454..bf8c6b9332 100644 --- a/Resources/Locale/ru-RU/_white/wizard/wizard.ftl +++ b/Resources/Locale/ru-RU/_white/wizard/wizard.ftl @@ -43,6 +43,7 @@ arcane-barrage-no-empty-hand = Вам нужна свободная рука д mindswap-success = Ваш разум подменили! mindswap-borer-failed = Его разумом кто-то управляет. +mindswap-cultist-failed = Нечестивая сила препятствует подмене сознания. store-currency-display-spell-point = Очки заклинаний diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index 9100b5bf2e..f79e9222fe 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -1442,7 +1442,7 @@ - type: Projectile damage: types: - Piercing: 25 + Piercing: 20 - type: entity name: arcane bolt diff --git a/Resources/Prototypes/_White/Actions/cult_actions.yml b/Resources/Prototypes/_White/Actions/cult_actions.yml index fd5098ee21..864f0f93cd 100644 --- a/Resources/Prototypes/_White/Actions/cult_actions.yml +++ b/Resources/Prototypes/_White/Actions/cult_actions.yml @@ -10,6 +10,7 @@ sprite: /Textures/Objects/Materials/Sheets/metal.rsi state: steel event: !type:CultTwistedConstructionActionEvent + speech: "Ethra p'ni dedol!" itemIconStyle: BigAction charges: 1 temporary: true @@ -31,6 +32,7 @@ sprite: /Textures/White/Cult/actions_cult.rsi state: teleport event: !type:CultTeleportTargetActionEvent + speech: "Sas'so c'arta forbici!" itemIconStyle: BigAction charges: 1 temporary: true @@ -58,20 +60,16 @@ removeOnNoCharges: true - type: entity - id: ActionCultStun + id: InstantActionCultStun name: Stun description: A potent spell that will stun and mute victims. noSpawn: true components: - - type: EntityTargetAction - whitelist: - components: - - HumanoidAppearance - canTargetSelf: false + - type: InstantAction icon: sprite: /Textures/White/Cult/actions_cult.rsi state: stun - event: !type:CultStunTargetActionEvent + event: !type:CultStunActionEvent itemIconStyle: BigAction charges: 1 temporary: true @@ -92,6 +90,7 @@ sprite: /Textures/White/Cult/actions_cult.rsi state: shackles event: !type:CultShadowShacklesTargetActionEvent + speech: "In'totum Lig'abis!" itemIconStyle: BigAction charges: 4 temporary: true @@ -108,6 +107,7 @@ sprite: /Textures/White/Cult/interface.rsi state: icon event: !type:CultSummonDaggerActionEvent + speech: "Wur d'dai leev'mai k'sagan!" charges: 1 temporary: true removeOnNoCharges: true @@ -123,6 +123,7 @@ sprite: /Textures/White/Cult/actions_cult.rsi state: blood_rites event: !type:CultBloodRitesInstantActionEvent + speech: "Fel'th Dol Ab'orod!" charges: 5 temporary: true removeOnNoCharges: true @@ -138,6 +139,7 @@ sprite: /Textures/White/Cult/actions_cult.rsi state: emp event: !type:CultElectromagneticPulseInstantActionEvent + speech: "Ta'gh fara'qha fel d'amar det!" charges: 1 temporary: true removeOnNoCharges: true @@ -153,12 +155,15 @@ sprite: /Textures/White/Cult/actions_cult.rsi state: gone event: !type:CultConcealInstantActionEvent + speech: "Kla'atu barada nikt'o!" charges: 10 temporary: true removeOnNoCharges: true - type: ConcealPresenceSpell concealEvent: !type:CultConcealInstantActionEvent + speech: "Kla'atu barada nikt'o!" revealEvent: !type:CultRevealInstantActionEvent + speech: "Kla'atu barada nikt'o!" concealIcon: sprite: /Textures/White/Cult/actions_cult.rsi state: gone diff --git a/Resources/Prototypes/_White/Entities/Cult/Effects/effects.yml b/Resources/Prototypes/_White/Entities/Cult/Effects/effects.yml index 5b6a66c0c1..885844e63b 100644 --- a/Resources/Prototypes/_White/Entities/Cult/Effects/effects.yml +++ b/Resources/Prototypes/_White/Entities/Cult/Effects/effects.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: CultTileSpawnEffect name: Sparkle placement: @@ -103,3 +103,18 @@ drawdepth: Effects - type: PointLight color: "#FF0000" + +- type: entity + id: CultStunFlashEffect + noSpawn: true + components: + - type: PointLight + enabled: true + radius: 5 + energy: 8 + netsync: false + color: Red + - type: LightFade + duration: 0.5 + - type: TimedDespawn + lifetime: 0.5 diff --git a/Resources/Prototypes/_White/Entities/Cult/Items/blood_barrage.yml b/Resources/Prototypes/_White/Entities/Cult/Items/blood_barrage.yml index 00914aa8e4..7e36f2df5a 100644 --- a/Resources/Prototypes/_White/Entities/Cult/Items/blood_barrage.yml +++ b/Resources/Prototypes/_White/Entities/Cult/Items/blood_barrage.yml @@ -24,6 +24,8 @@ proto: BloodBolt capacity: 25 - type: BoltBarrage + - type: DeleteOnDropAttempt + message: bolt-barrage-component-extra-message - type: GiftIgnore - type: CultItem canPickUp: false diff --git a/Resources/Prototypes/_White/Entities/Cult/Items/stun_hand.yml b/Resources/Prototypes/_White/Entities/Cult/Items/stun_hand.yml new file mode 100644 index 0000000000..c73620a53f --- /dev/null +++ b/Resources/Prototypes/_White/Entities/Cult/Items/stun_hand.yml @@ -0,0 +1,34 @@ +- type: entity + parent: BaseItem + id: StunHand + name: stunning aura + description: Will stun and mute a weak-minded victim on hit. + components: + - type: Sprite + sprite: White/Cult/Entities/stun.rsi + state: icon + - type: Item + size: Ginormous + sprite: White/Cult/Entities/stun.rsi + - type: MeleeWeapon + canHeavyAttack: false + canAttackSelf: false + canMiss: false + attackWhitelist: + components: + - StatusEffects + attackBlacklist: + components: + - Cultist + - Construct + wideAnimationRotation: 180 + damage: + types: + Heat: 0 + - type: CultStunHand + - type: DeleteOnDropAttempt + message: cult-stun-component-extra-message + - type: Unremoveable + deleteOnDrop: true + - type: CultItem + canPickUp: false diff --git a/Resources/Prototypes/_White/Entities/Cult/Items/tome_craft.yml b/Resources/Prototypes/_White/Entities/Cult/Items/tome_craft.yml index 4cd0e39620..1baf08e5f1 100644 --- a/Resources/Prototypes/_White/Entities/Cult/Items/tome_craft.yml +++ b/Resources/Prototypes/_White/Entities/Cult/Items/tome_craft.yml @@ -187,6 +187,16 @@ - type: Stack count: 1 +- type: entity + parent: CultRunicMetal + id: CultRunicMetal4 + suffix: 4 + components: + - type: Sprite + state: runic + - type: Stack + count: 4 + - type: entity parent: CultRunicMetal id: CultRunicMetal20 diff --git a/Resources/Prototypes/_White/Entities/Cult/Runes/cult_runes.yml b/Resources/Prototypes/_White/Entities/Cult/Runes/cult_runes.yml index 0ab3d8e9ed..262acf8e10 100644 --- a/Resources/Prototypes/_White/Entities/Cult/Runes/cult_runes.yml +++ b/Resources/Prototypes/_White/Entities/Cult/Runes/cult_runes.yml @@ -165,4 +165,5 @@ - type: CultRuneBase invokePhrase: "TOK-LYR RQA-NAP G'OLT-ULOFT!" cultistGatheringRange: 1.5 + invokeChatType: Speak - type: CultRuneApocalypse diff --git a/Resources/Prototypes/_White/Entities/Cult/Weapons/blood_spear.yml b/Resources/Prototypes/_White/Entities/Cult/Weapons/blood_spear.yml index 14de56bd1a..d617be4e60 100644 --- a/Resources/Prototypes/_White/Entities/Cult/Weapons/blood_spear.yml +++ b/Resources/Prototypes/_White/Entities/Cult/Weapons/blood_spear.yml @@ -19,7 +19,7 @@ - 0.30,0.40 density: 20 mask: - - ItemMask + - BulletImpassable restitution: 0.3 friction: 0.2 - type: Sharp diff --git a/Resources/Prototypes/_White/Entities/Objects/Weapons/chaplain_weapons.yml b/Resources/Prototypes/_White/Entities/Objects/Weapons/chaplain_weapons.yml index 28848c007b..8242662c74 100644 --- a/Resources/Prototypes/_White/Entities/Objects/Weapons/chaplain_weapons.yml +++ b/Resources/Prototypes/_White/Entities/Objects/Weapons/chaplain_weapons.yml @@ -65,7 +65,7 @@ types: Heat: 18 - type: Item - size: Normal + size: Ginormous sprite: White/Objects/Weapons/Chaplain/godhand.rsi - type: Unremoveable deleteOnDrop: true diff --git a/Resources/Prototypes/_White/Wizard/magic_items.yml b/Resources/Prototypes/_White/Wizard/magic_items.yml index 4adfd2e9c8..52953f32ef 100644 --- a/Resources/Prototypes/_White/Wizard/magic_items.yml +++ b/Resources/Prototypes/_White/Wizard/magic_items.yml @@ -133,5 +133,7 @@ - type: BasicEntityAmmoProvider proto: ArcaneBolt capacity: 30 + - type: DeleteOnDropAttempt + message: bolt-barrage-component-extra-message - type: BoltBarrage - type: GiftIgnore diff --git a/Resources/Textures/White/Cult/Entities/arcane_barrage.rsi/bullet.png b/Resources/Textures/White/Cult/Entities/arcane_barrage.rsi/bullet.png index 98351139f28048670f233063a4bc9f4dca0aa139..f1184e4e7b9fa0cdfe952b24241a591acfc9a27f 100644 GIT binary patch delta 463 zcmV;=0Wkid1nC2iB!2;OQb$4nuFf3k0004_Nkl>^6dDk3k%8%UKR1-<1RxN+{xn}euhZl()jZ4*r52uU2-8g4RutqMqm za1aFLy{q0+l7BdY|N8QCj4dADKdin6$JDn{0k!yC4AIw4Kq`c@FG}pb+S_~fwgmt@ zJUv@q{jv2||670%LI@#*5JCtcgpif7`u_y!59lLKf4~CK_6Nvqsb-s6#gzVlA^JxC z0J&4F>e&P1`U7PBx+{D*xBUY;^iF`P4gFcg)784RMMzjwrVNE4Lrw$$95u%@s(>bA zPkc-k=MU&>l%PMrMu7AO&>!#{q{(>yO`i}#2q9zc)8iYQFKYL%tdFVp-@hYI zYd_1Wg$x?)ObcYV8j3U+PJI+An6j+$>TCbiS2=72jP_5hXArL0_WN)0=F6IsR(s3L zkAJeSm1pXE9fw2w$CYK?_|*A*lGL-gcUNim%*RjuDe~(ohSg25b#U?(biSZ^-?L$3 z{PC|zos!Su`^~*gc(-vSJ!AhZI^luh$Ft>PAFSpjsKWHguMM4FQH z#kwHdJ9_U_PdDA;K62*y+6}KAibbCk-kmD&IZcO2SbP6fE(2lyuki|Q`>uyCSZ{Az z`=pp3>|GSUBRDtY9|)iM$51WwjlF(@{R986>>|m*OaC(Nox^wg%G{g(*`v5O@P^O5 zdHm29^(p;_&o0v_72P_c>e|f9bKty|1V?g zr%LTNRuld*Ce%ADUoc^Vy@G-W!_xqUDb9=me5?+Z@)u@@xZSbbDa!x^p00i_>zoo8 Fn*i7_<{JP2 diff --git a/Resources/Textures/White/Cult/Entities/stun.rsi/icon.png b/Resources/Textures/White/Cult/Entities/stun.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d19d7ff79743e193749ae85a274a6a6c6267734e GIT binary patch literal 1428 zcmV;F1#9|=P)6TWEncKxrAUNrA9Arffmn79@%xOZ`F; zgYjW%I(_hI4|{@#J(xY}6H9#F*aMoVF&UCf2{SQS zuiG~R5CExgjUGD_z#RncG*hWodi#YxUa36^>?H38qZ2UKzZre#m=Po@5`N2B3v%?i zI!bCWY4Sy=XS8@p325v^jfwdXAb!NgKcw$*e)29_+CxtEoz6Od+e>rs>U1W0v_%x< ztOj12Qz*!>S|8U|AC9Uw}dn@~vs~ zKmB53=~y3=xZ#(Bkd+WP0al2wm%497%N1wa2*lSo%UTfgcaQeMU*QmqG&tHyj8BRv?eMasOa>jY)4rIN(F1q6E_&UAS}m zCtP?qa7~5j+_MR}!D^{y49?71%DTEUs1DfS9vH&#iW`0c3drk_NrffPJT?N$u%@PA zeANeiN;E9{B{e4Zhec7oNo?jV1mYX)Gd%C)+Hn)zT$n;<*LOJeej`HjqyiCOAU2aE zVbS9Tj5^4fsmMo$@E1B>#$4ZBq|SQ5y|R;SQ(#DKHYOpSa~ho7<(mA)!*&!5?a0z9D&JY%+r#%;1#ia+&uCbtntoO`Wf+2kLl zaKdawxFlaR8XHT_;13A=kv{u~C#r$5%#I1kaItx$$NgSq zLreTRjwuk^T58=j<9Sw&+Qqnq+-|IswDQ6tl(lv7J%eXhtm@)}&e_aM4F$g*F535!(UCCYgAW)GI`k6^=M5;fM5 z0`bx(v&`p?A#-pX0|UQ6qRG(f=tJsWJyIH5$w|jBRswYdPo6%7;Mf!lPmwaz1FN3R z%vg3Ub5Q~^R)QFE32n3S8cwuw|H60<0r5S9@;zN|s9(F| z&x$EXbRda|_7b{8Ix$%={O)~ zV^iI>WM{uJo4-(RCu0fhVEg);kh5sAT8rac#XB600qzFAZvu${o74@s+nK%WFa2Y( iAE1APz~5p26ZivF`k%Q&KNws90000O=u<5X=vX$A(S z|DG<6Ar*7p-rblL94OQ9vHoD_g;0TCEKMe}7wmSKe?VO$t)QT&sGz7|$D`&e57s>h z(|p3J!x5|fgJI+UDcUn9&Hggy_tRtVx4#hh@%+yFdD9M@e7jcQ6oUct0UicphBG)A z0SDha{QR?d^W^4l_e0mO6-$_GzR`bku=VcK*{fMH_}sf6+Q;vk`~T-Z(0l(Y)0G+f_xvmEVn6Y4?aMF4U)Ii@FaF^5 zQ&uzkr@jK|>e}(~HV$!L)XU$;^3VTP&sdgOH(h!|MZ?LTFCB%$?b+6e&Hvv&k2kk& zYW$%ihuW>~pJycCcC6mYdCnZ*er9_5^%{O{<_pi??4GxA{nFU#>CW43N9|_L+TU1O zR90MRsNN^NEqi_CncCcj8s_qOc7179ul_1M`S__&=4iM7d*#0P^DB+#f4{%C>)DQT zz8j1jsu_dkRnM=n;pH;i-~V;}UB+4=naFSkvqw==hy?LT#&pX0)XXTL2O(imniCa^U~lEw%#IiP3rx;|rbH><+@ zulu?CZ_Ibqxwb#ELy2+L;lQuY-;_JPZHoE6?e+e`hCM%iW_)*<;}h5Cf6o8*8U0Pn zpZIP5RDD*|u$+IV);zL)BE$auHQbjbJil*o;E~OrFTcbEzV`fAJP%ZO=u<5X=vX$A(S zzn(6RAr*7p-Zjj-93a#1(OyVfC{|msu*pl~uGU0ZR=)#+9}Wmg%#did@Q~ivd}Xah zklqEq$nGPIPV*0jPE*_Xb>99Xf9tqs{(9Hb{!(dFDQ(ED;#B+beSo>+E=KQp|Bs0p%#J&v;)!qC1ylpkl z=k4nlUY-8F@yz#fhBFKX%m;WFj7ecg=QJE`%vr53lpz1@>w0v&-}5iY&;0j0KmO78@AFUey)yZK^m+f+Kd~wN z0rqD;$QLqRdoFxyUi~+Quk(I!6BF>=3 z9Sd9e9P%yYZyA{N^Y zVT>KuFRq{6c>CdGA#;b-438H-?wEbx!e{S2LjMxr4#e)z4*}Q$iB}-A-Y; literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Cult/Entities/stun.rsi/meta.json b/Resources/Textures/White/Cult/Entities/stun.rsi/meta.json new file mode 100644 index 0000000000..489466f74a --- /dev/null +++ b/Resources/Textures/White/Cult/Entities/stun.rsi/meta.json @@ -0,0 +1,66 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/pull/49264/commits/d0dffe7ca643db2624424fdcebf45863f85c0448", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "inhand-right", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} From 935663cb59d52f27375032dc16d4d43db550a1e0 Mon Sep 17 00:00:00 2001 From: Trest <144359854+trest100@users.noreply.github.com> Date: Sun, 28 Jul 2024 19:54:49 +0300 Subject: [PATCH 2/8] Update mannequin_inventory_template.yml (#505) --- .../mannequin_inventory_template.yml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Resources/Prototypes/InventoryTemplates/mannequin_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/mannequin_inventory_template.yml index 80b9c6eea4..92d8fa4227 100644 --- a/Resources/Prototypes/InventoryTemplates/mannequin_inventory_template.yml +++ b/Resources/Prototypes/InventoryTemplates/mannequin_inventory_template.yml @@ -62,3 +62,23 @@ uiWindowPos: 3,0 strippingWindowPos: 0,2 displayName: Back + - name: underwearb #WD slot + slotTexture: underwearb + slotFlags: UNDERWEARB + stripTime: 6 + uiWindowPos: 3,0 + strippingWindowPos: 2,1 + displayName: Panties + whitelist: + tags: + - underwearb + - name: underweart #WD slot + slotTexture: underweart + slotFlags: UNDERWEART + stripTime: 6 + uiWindowPos: 3,1 + strippingWindowPos: 2,0 + displayName: Bra + whitelist: + tags: + - underweart From 5854304cc410b5d86d115c217601bfe2235dfbc2 Mon Sep 17 00:00:00 2001 From: RavmorganButOnCocaine Date: Sun, 28 Jul 2024 16:55:36 +0000 Subject: [PATCH 3/8] Automatic changelog update --- Resources/Changelog/ChangelogWhite.yml | 57 ++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/Resources/Changelog/ChangelogWhite.yml b/Resources/Changelog/ChangelogWhite.yml index a7cacd3861..03ccd0a9ed 100644 --- a/Resources/Changelog/ChangelogWhite.yml +++ b/Resources/Changelog/ChangelogWhite.yml @@ -6814,3 +6814,60 @@ id: 422 time: '2024-07-27T15:48:25.0000000+00:00' url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/492 +- author: Aviu + changes: + - message: "\u041F\u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043E\ + \ \u0437\u0430\u043A\u043B\u0438\u043D\u0430\u043D\u0438\u0435 \u043E\u0433\u043B\ + \u0443\u0448\u0435\u043D\u0438\u044F \u0443 \u043A\u0443\u043B\u044C\u0442\u0430\ + . \u0422\u0435\u043F\u0435\u0440\u044C \u043E\u043D\u043E \u0434\u0430\u0451\ + \u0442 \u0432 \u0440\u0443\u043A\u0443 \u0430\u0443\u0440\u0443, \u043A\u043E\ + \u0442\u043E\u0440\u043E\u0439 \u043D\u0430\u0434\u043E \u0443\u0434\u0430\u0440\ + \u0438\u0442\u044C \u043A\u043E\u0441\u043C\u043E\u043D\u0430\u0432\u0442\u0438\ + \u043A\u0430, \u0447\u0442\u043E\u0431\u044B \u043E\u0433\u043B\u0443\u0448\u0438\ + \u0442\u044C. \u0412\u0440\u0435\u043C\u044F \u0441\u0442\u0430\u043D\u0430\ + : 16 \u0441\u0435\u043A\u0443\u043D\u0434, 1.5 \u0441\u0435\u043A\u0443\u043D\ + \u0434\u044B \u0441 \u043F\u0435\u043D\u0442\u0430\u0433\u0440\u0430\u043C\u043C\ + \u043E\u0439 \u043D\u0430\u0434 \u0433\u043E\u043B\u043E\u0432\u043E\u0439.\ + \ \u0422\u0435\u043F\u0435\u0440\u044C \u0440\u0430\u0431\u043E\u0442\u0430\u0435\ + \u0442 \u043D\u0430 \u0447\u0438\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u043D\ + \u044B\u0445." + type: Add + - message: "\u041A\u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u044B \u0442\u0435\ + \u043F\u0435\u0440\u044C \u043C\u043E\u0433\u0443\u0442 \u043E\u0431\u0449\u0430\ + \u0442\u044C\u0441\u044F \u0432 \u0447\u0430\u0442\u0435 \u043A\u0443\u043B\u044C\ + \u0442\u0430." + type: Add + - message: "\u041A\u0443\u043B\u044C\u0442\u0438\u0441\u0442\u044B \u0442\u0435\u043F\ + \u0435\u0440\u044C \u0448\u0435\u043F\u0447\u0443\u0442 \u0441\u043C\u0435\u0448\ + \u043D\u044B\u0435 \u0444\u0440\u0430\u0437\u044B \u043F\u0440\u0438 \u043A\u0430\ + \u0441\u0442\u0435 \u0437\u0430\u043A\u043B\u0438\u043D\u0430\u043D\u0438\u0439\ + ." + type: Add + - message: "\u0422\u0435\u043F\u0435\u0440\u044C \u043F\u0440\u0438 \u0430\u043A\ + \u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0431\u043E\u043B\u044C\u0448\u0438\ + \u043D\u0441\u0442\u0432\u0430 \u0440\u0443\u043D \u043A\u0443\u043B\u044C\u0442\ + \u0438\u0441\u0442\u044B \u0448\u0435\u043F\u0447\u0443\u0442, \u0430 \u043D\ + \u0435 \u0433\u043E\u0432\u043E\u0440\u044F\u0442." + type: Tweak + - message: "\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u043E \u0432\u0440\u0435\ + \u043C\u044F \u0441\u0442\u0430\u043D\u0430 \u043A\u0440\u043E\u0432\u0430\u0432\ + \u043E\u0433\u043E \u043A\u043E\u043F\u044C\u044F \u0434\u043E 4 \u0441\u0435\ + \u043A\u0443\u043D\u0434, \u0442\u0435\u043F\u0435\u0440\u044C \u043E\u043D\u043E\ + \ \u043E\u0442\u0441\u043A\u0430\u043A\u0438\u0432\u0430\u0435\u0442 \u043E\u0442\ + \ \u043A\u0443\u043B\u044C\u0442\u0438\u0441\u0442\u043E\u0432 \u0438 \u043A\ + \u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u043E\u0432 \u0438 \u043D\u0435\ + \ \u0441\u0442\u0430\u043D\u0438\u0442 \u043A\u043E\u0441\u043C\u043E\u043D\u0430\ + \u0432\u0442\u0438\u043A\u043E\u0432 \u0441\u043E \u0441\u0432\u044F\u0449\u0435\ + \u043D\u043D\u044B\u043C \u043E\u0440\u0443\u0436\u0438\u0435\u043C \u0432 \u0440\ + \u0443\u043A\u0430\u0445." + type: Tweak + - message: "\u041E\u0442\u043A\u0430\u0442 \u0431\u0430\u0444\u0444\u0430 \u043A\ + \u0440\u043E\u0432\u0430\u0432\u043E\u0433\u043E \u0437\u0430\u043B\u043F\u0430\ + ." + type: Tweak + - message: "\u0411\u0430\u0433\u0444\u0438\u043A\u0441\u044B \u043A\u0443\u043B\u044C\ + \u0442\u0430." + type: Fix + id: 423 + time: '2024-07-28T16:54:32.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/507 From bd7537f56844c80834267623ae342222bd0c2044 Mon Sep 17 00:00:00 2001 From: Spatison <137375981+Spatison@users.noreply.github.com> Date: Sun, 28 Jul 2024 21:02:54 +0300 Subject: [PATCH 4/8] Fix (#508) --- Content.Shared/Blocking/BlockingSystem.cs | 1 + Content.Shared/Damage/Systems/StaminaSystem.cs | 3 +-- .../Structures/Machines/surveillance_camera_routers.yml | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Content.Shared/Blocking/BlockingSystem.cs b/Content.Shared/Blocking/BlockingSystem.cs index 3e1ff4284c..e52cbd622c 100644 --- a/Content.Shared/Blocking/BlockingSystem.cs +++ b/Content.Shared/Blocking/BlockingSystem.cs @@ -212,6 +212,7 @@ public sealed partial class BlockingSystem : EntitySystem hard: true, collisionLayer: (int) CollisionGroup.WallLayer, body: physicsComponent); + _physics.SetBodyType(user, BodyType.Static, body: physicsComponent); } component.IsBlocking = true; diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index 1324e4f822..31c8689bac 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -38,7 +38,6 @@ public sealed partial class StaminaSystem : EntitySystem [Dependency] private readonly SharedColorFlashEffectSystem _color = default!; [Dependency] private readonly SharedStunSystem _stunSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; // WD EDIT /// /// How much of a buffer is there between the stun duration and when stuns can be re-applied. @@ -365,7 +364,7 @@ public sealed partial class StaminaSystem : EntitySystem continue; // We were in crit so come out of it and continue. - if (!_statusEffectsSystem.HasStatusEffect(uid, "Stun") && comp.Critical) // WD EIT + if (comp.Critical) { ExitStamCrit(uid, comp); continue; diff --git a/Resources/Prototypes/Entities/Structures/Machines/surveillance_camera_routers.yml b/Resources/Prototypes/Entities/Structures/Machines/surveillance_camera_routers.yml index 662c01118b..890d7d734e 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/surveillance_camera_routers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/surveillance_camera_routers.yml @@ -164,3 +164,4 @@ components: - type: SurveillanceCameraRouter subnetFrequency: SurveillanceCameraSecurity + subnetColor: "#DE3A3AFF" From e69a0c3a4995db00189ce49ecebfb9df0ea65c99 Mon Sep 17 00:00:00 2001 From: RavmorganButOnCocaine Date: Sun, 28 Jul 2024 18:03:58 +0000 Subject: [PATCH 5/8] Automatic changelog update --- Resources/Changelog/ChangelogWhite.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Resources/Changelog/ChangelogWhite.yml b/Resources/Changelog/ChangelogWhite.yml index 03ccd0a9ed..1064a8664d 100644 --- a/Resources/Changelog/ChangelogWhite.yml +++ b/Resources/Changelog/ChangelogWhite.yml @@ -6871,3 +6871,22 @@ id: 423 time: '2024-07-28T16:54:32.0000000+00:00' url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/507 +- author: Spatison + changes: + - message: "\u041F\u043E\u0434\u043D\u044F\u0442\u044B\u0439 \u0449\u0438\u0442\ + \ \u0441\u043D\u043E\u0432\u0430 \u043D\u0435 \u0434\u0430\u0435\u0442 \u043F\ + \u0440\u043E\u0439\u0442\u0438" + type: Fix + - message: "\u0411\u043E\u0434\u0438\u043A\u0430\u043C\u0435\u0440\u044B \u0442\u0435\ + \u043F\u0435\u0440\u044C \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\ + \u0442\u0441\u044F \u043D\u0430 \u043C\u043E\u043D\u0438\u0442\u043E\u0440\u0438\ + \u043D\u0433\u0435 \u0431\u0435\u0441\u043F\u0440\u043E\u0432\u043E\u0434\u043D\ + \u044B\u0445 \u043A\u0430\u043C\u0435\u0440 \u043F\u0440\u0438 \u043D\u0430\u043B\ + \u0438\u0447\u0438\u0438 \u043D\u0430 \u0441\u0442\u0430\u043D\u0446\u0438\u0438\ + \ \u0431\u0435\u0441\u043F\u0440\u043E\u0432\u043E\u0434\u043D\u043E\u0433\u043E\ + \ \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043E\u0440\ + \u0430 \u0421\u0411" + type: Fix + id: 424 + time: '2024-07-28T18:02:55.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/508 From 0f641a46d2cd90ca88561695c636d248a591f220 Mon Sep 17 00:00:00 2001 From: Trest <144359854+trest100@users.noreply.github.com> Date: Sun, 28 Jul 2024 23:44:04 +0300 Subject: [PATCH 6/8] added Shelf (#509) --- .../Objects/Consumable/Drinks/drinks.yml | 4 +- .../Objects/Consumable/Food/ingredients.yml | 9 + .../Entities/Structures/Wallmounts/shelfs.yml | 475 ++++++++++++++++++ .../Construction/Graphs/furniture/shelfs.yml | 268 ++++++++++ .../Recipes/Construction/storage.yml | 147 ++++++ Resources/Prototypes/tags.yml | 6 + .../Medical/chemistry.rsi/base.png | Bin 0 -> 692 bytes .../Medical/chemistry.rsi/chem-0.png | Bin 0 -> 108 bytes .../Medical/chemistry.rsi/chem-1.png | Bin 0 -> 233 bytes .../Medical/chemistry.rsi/chem-2.png | Bin 0 -> 311 bytes .../Medical/chemistry.rsi/chem-3.png | Bin 0 -> 393 bytes .../Medical/chemistry.rsi/chem-4.png | Bin 0 -> 520 bytes .../Medical/chemistry.rsi/chem-5.png | Bin 0 -> 605 bytes .../Medical/chemistry.rsi/chem-6.png | Bin 0 -> 710 bytes .../Medical/chemistry.rsi/closed.png | Bin 0 -> 267 bytes .../Medical/chemistry.rsi/locked.png | Bin 0 -> 109 bytes .../Medical/chemistry.rsi/meta.json | 47 ++ .../Medical/chemistry.rsi/open.png | Bin 0 -> 267 bytes .../Medical/chemistry.rsi/unlocked.png | Bin 0 -> 107 bytes .../Departments/Service/bar.rsi/bar-0.png | Bin 0 -> 170 bytes .../Departments/Service/bar.rsi/bar-1.png | Bin 0 -> 238 bytes .../Departments/Service/bar.rsi/bar-10.png | Bin 0 -> 652 bytes .../Departments/Service/bar.rsi/bar-11.png | Bin 0 -> 690 bytes .../Departments/Service/bar.rsi/bar-12.png | Bin 0 -> 729 bytes .../Departments/Service/bar.rsi/bar-2.png | Bin 0 -> 306 bytes .../Departments/Service/bar.rsi/bar-3.png | Bin 0 -> 305 bytes .../Departments/Service/bar.rsi/bar-4.png | Bin 0 -> 417 bytes .../Departments/Service/bar.rsi/bar-5.png | Bin 0 -> 445 bytes .../Departments/Service/bar.rsi/bar-6.png | Bin 0 -> 489 bytes .../Departments/Service/bar.rsi/bar-7.png | Bin 0 -> 546 bytes .../Departments/Service/bar.rsi/bar-8.png | Bin 0 -> 577 bytes .../Departments/Service/bar.rsi/bar-9.png | Bin 0 -> 613 bytes .../Departments/Service/bar.rsi/base.png | Bin 0 -> 672 bytes .../Departments/Service/bar.rsi/meta.json | 53 ++ .../Departments/Service/kitchen.rsi/base.png | Bin 0 -> 420 bytes .../Service/kitchen.rsi/kitchen-0.png | Bin 0 -> 108 bytes .../Service/kitchen.rsi/kitchen-1.png | Bin 0 -> 188 bytes .../Service/kitchen.rsi/kitchen-10.png | Bin 0 -> 741 bytes .../Service/kitchen.rsi/kitchen-11.png | Bin 0 -> 804 bytes .../Service/kitchen.rsi/kitchen-12.png | Bin 0 -> 818 bytes .../Service/kitchen.rsi/kitchen-2.png | Bin 0 -> 275 bytes .../Service/kitchen.rsi/kitchen-3.png | Bin 0 -> 342 bytes .../Service/kitchen.rsi/kitchen-4.png | Bin 0 -> 387 bytes .../Service/kitchen.rsi/kitchen-5.png | Bin 0 -> 465 bytes .../Service/kitchen.rsi/kitchen-6.png | Bin 0 -> 547 bytes .../Service/kitchen.rsi/kitchen-7.png | Bin 0 -> 564 bytes .../Service/kitchen.rsi/kitchen-8.png | Bin 0 -> 585 bytes .../Service/kitchen.rsi/kitchen-9.png | Bin 0 -> 650 bytes .../Departments/Service/kitchen.rsi/meta.json | 53 ++ .../Storage/Shelfs/glass.rsi/base.png | Bin 0 -> 223 bytes .../Storage/Shelfs/glass.rsi/closed.png | Bin 0 -> 267 bytes .../Storage/Shelfs/glass.rsi/locked.png | Bin 0 -> 109 bytes .../Storage/Shelfs/glass.rsi/meta.json | 29 ++ .../Storage/Shelfs/glass.rsi/open.png | Bin 0 -> 267 bytes .../Storage/Shelfs/glass.rsi/rbase.png | Bin 0 -> 549 bytes .../Storage/Shelfs/glass.rsi/unlocked.png | Bin 0 -> 107 bytes .../Storage/Shelfs/metal.rsi/base.png | Bin 0 -> 352 bytes .../Storage/Shelfs/metal.rsi/closed.png | Bin 0 -> 267 bytes .../Storage/Shelfs/metal.rsi/locked.png | Bin 0 -> 109 bytes .../Storage/Shelfs/metal.rsi/meta.json | 29 ++ .../Storage/Shelfs/metal.rsi/open.png | Bin 0 -> 267 bytes .../Storage/Shelfs/metal.rsi/rbase.png | Bin 0 -> 352 bytes .../Storage/Shelfs/metal.rsi/unlocked.png | Bin 0 -> 107 bytes .../Storage/Shelfs/wood.rsi/base.png | Bin 0 -> 525 bytes .../Storage/Shelfs/wood.rsi/closed.png | Bin 0 -> 375 bytes .../Storage/Shelfs/wood.rsi/locked.png | Bin 0 -> 108 bytes .../Storage/Shelfs/wood.rsi/meta.json | 29 ++ .../Storage/Shelfs/wood.rsi/open.png | Bin 0 -> 483 bytes .../Storage/Shelfs/wood.rsi/rbase.png | Bin 0 -> 525 bytes .../Storage/Shelfs/wood.rsi/unlocked.png | Bin 0 -> 107 bytes 70 files changed, 1148 insertions(+), 1 deletion(-) create mode 100644 Resources/Prototypes/Entities/Structures/Wallmounts/shelfs.yml create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/furniture/shelfs.yml create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/base.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-0.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-1.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-2.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-3.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-4.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-5.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-6.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/closed.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/locked.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/meta.json create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/open.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/unlocked.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-0.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-1.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-10.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-11.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-12.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-2.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-3.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-4.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-5.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-6.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-7.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-8.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-9.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/base.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/meta.json create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/base.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-0.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-1.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-10.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-11.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-12.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-2.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-3.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-4.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-5.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-6.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-7.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-8.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-9.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/meta.json create mode 100644 Resources/Textures/Structures/Storage/Shelfs/glass.rsi/base.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/glass.rsi/closed.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/glass.rsi/locked.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/glass.rsi/meta.json create mode 100644 Resources/Textures/Structures/Storage/Shelfs/glass.rsi/open.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/glass.rsi/rbase.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/glass.rsi/unlocked.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/metal.rsi/base.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/metal.rsi/closed.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/metal.rsi/locked.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/metal.rsi/meta.json create mode 100644 Resources/Textures/Structures/Storage/Shelfs/metal.rsi/open.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/metal.rsi/rbase.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/metal.rsi/unlocked.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/wood.rsi/base.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/wood.rsi/closed.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/wood.rsi/locked.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/wood.rsi/meta.json create mode 100644 Resources/Textures/Structures/Storage/Shelfs/wood.rsi/open.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/wood.rsi/rbase.png create mode 100644 Resources/Textures/Structures/Storage/Shelfs/wood.rsi/unlocked.png diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml index b5951c44ad..bd822396e7 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml @@ -82,7 +82,9 @@ - type: EmitSoundOnDrop sound: path: /Audio/White/Items/handling/drinkglass_drop.ogg - + - type: Tag + tags: + - DrinkGlass # Transformable container - normal glass - type: entity name: metamorphic glass diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml index 1df6615a9f..86cf0afa8e 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml @@ -34,6 +34,9 @@ solution: food - type: TrashOnSolutionEmpty solution: food + - type: Tag + tags: + - Ingredient - type: entity abstract: true @@ -272,6 +275,9 @@ reagents: - ReagentId: Nutriment Quantity: 15 + - type: Tag + tags: + - Ingredient - type: entity name: dough @@ -648,3 +654,6 @@ reagents: - ReagentId: CocoaPowder Quantity: 2 + - type: Tag + tags: + - Ingredient diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/shelfs.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/shelfs.yml new file mode 100644 index 0000000000..b715056702 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/shelfs.yml @@ -0,0 +1,475 @@ +# Parents +- type: entity + abstract: true + id: ShelfBase + parent: BaseStructure + name: shelf + description: a strange place to place, well, anything really. You feel like you shouldn't be seeing this.' + components: + - type: Sprite + drawdepth: WallMountedItems + sprite: Structures/Storage/Shelfs/wood.rsi + state: base + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.35,-0.35,0.35,0.35" + density: 35 + layer: + - BulletImpassable + - type: Transform + - type: Damageable + damageModifierSet: Wood + damageContainer: Inorganic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 60 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: WoodDestroyHeavy + - !type:DoActsBehavior + acts: ["Destruction"] + - type: WallMount + arc: 175 + - type: Storage + grid: + - 0,0,3,1 + - 0,3,3,4 + maxItemSize: Normal + - type: UserInterface + interfaces: + - key: enum.StorageUiKey.Key + type: StorageBoundUserInterface + - type: InteractionOutline + - type: ContainerContainer + containers: + storagebase: !type:Container + - type: Tag + tags: + - Structure + +- type: entity + abstract: true + id: ShelfBaseReinforced + parent: ShelfBase + name: reinforced shelf + description: It looks as strong as reality itself. + components: + - type: Lock + - type: LockVisuals + - type: Sprite + sprite: Structures/Storage/Shelfs/wood.rsi + state: base + layers: + - state: rbase + map: ["enum.StorageVisualLayers.Base"] + - state: unlocked + shader: unshaded + # used to keep the unlocked light visible while open. + - state: closed + map: ["enum.StorageVisualLayers.Door"] + - state: locked + map: ["enum.LockVisualLayers.Lock"] + shader: unshaded + - type: Appearance + - type: EntityStorageVisuals + stateDoorOpen: open + stateDoorClosed: closed + + - type: AccessReader + +# Normal +- type: entity + id: ShelfWood + parent: ShelfBase + name: wooden shelf + description: A convenient place to place, well, anything really. + components: + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 60 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: WoodDestroyHeavy + - !type:SpawnEntitiesBehavior + spawn: + MaterialWoodPlank1: + min: 1 + max: 3 + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Tag + tags: + - Structure + - Wooden + - type: Construction + graph: Shelf + node: ShelfWood + +- type: entity + id: ShelfMetal + parent: ShelfBase + name: metal shelf + description: A sturdy place to place, well, anything really. + components: + - type: Sprite + sprite: Structures/Storage/Shelfs/metal.rsi + state: base + - type: Damageable + damageModifierSet: Metallic + damageContainer: Inorganic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 120 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:SpawnEntitiesBehavior + spawn: + SheetSteel1: + min: 2 + max: 4 + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Tag + tags: + - Structure + - type: Construction + graph: Shelf + node: ShelfMetal + +- type: entity + id: ShelfGlass + parent: ShelfBase + name: glass shelf + description: A fragile place to place, well, anything really. + components: + - type: Sprite + sprite: Structures/Storage/Shelfs/glass.rsi + state: base + - type: Damageable + damageModifierSet: Glass + damageContainer: Inorganic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 50 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: WindowShatter + - !type:SpawnEntitiesBehavior + spawn: + ShardGlass: + min: 0 + max: 2 + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Tag + tags: + - Structure + - type: Construction + graph: Shelf + node: ShelfGlass + +# Reinforced +- type: entity + id: ShelfRWood + parent: ShelfBaseReinforced + name: sturdy wood shelf + description: A safe place to put your favorite bottle of whiskey + components: + - type: Sprite + sprite: Structures/Storage/Shelfs/wood.rsi + state: base + layers: + - state: rbase + map: ["enum.StorageVisualLayers.Base"] + - state: closed + map: ["enum.StorageVisualLayers.Door"] + - state: locked + map: ["enum.LockVisualLayers.Lock"] + shader: unshaded + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 215 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: WoodDestroyHeavy + - !type:SpawnEntitiesBehavior + spawn: + MaterialWoodPlank: + min: 2 + max: 5 + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Construction + graph: Shelf + node: ShelfRWood + +- type: entity + id: ShelfRMetal + parent: ShelfBaseReinforced + name: sturdy metal shelf + description: A strong & shiny place to keep all your vials safe + components: + - type: Sprite + sprite: Structures/Storage/Shelfs/metal.rsi + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 450 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:SpawnEntitiesBehavior + spawn: + SheetPlasteel1: + min: 2 + max: 3 + ShardGlass: + min: 1 + max: 2 + PartRodMetal1: + min: 1 + max: 2 + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Construction + graph: Shelf + node: ShelfRMetal + +- type: entity + id: ShelfRGlass + parent: ShelfBaseReinforced + name: sturdy glass shelf + description: Crystal clear reinforced glass doors to show off all your fancy bottles you definitely didn't sell a co-worker's favorite mothroach for. + components: + - type: Sprite + sprite: Structures/Storage/Shelfs/glass.rsi + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 250 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: WindowShatter + - !type:SpawnEntitiesBehavior + spawn: + SheetPlastic1: + min: 1 + max: 3 + ShardGlass: + min: 1 + max: 2 + PartRodMetal1: + min: 0 + max: 1 + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Construction + graph: Shelf + node: ShelfRGlass + +# Departmental +- type: entity + id: ShelfBar + parent: ShelfBase + name: bar shelf + description: Made out of the finest synthetic wood for all alcohol holding needs. + components: + - type: Sprite + sprite: Structures/Storage/Shelfs/Departments/Service/bar.rsi + state: base + layers: + - state: base + - state: bar-0 + - map: ["enum.StorageFillLayers.Fill"] + - type: Appearance + - type: StorageFillVisualizer + maxFillLevels: 13 + fillBaseName: bar + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: WoodDestroyHeavy + - !type:SpawnEntitiesBehavior + spawn: + MaterialWoodPlank1: + min: 1 + max: 4 + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Storage + grid: + - 0,0,5,1 + - 0,3,5,4 + maxItemSize: Normal + whitelist: + tags: + - DrinkGlass + - DrinkBottle + - DrinkCan + - Beer + - type: Construction + graph: Shelf + node: ShelfBar + +- type: entity + id: ShelfKitchen + parent: ShelfBase + name: cooking shelf + description: Holds knifes, spice, and everything nice! + components: + - type: Sprite + sprite: Structures/Storage/Shelfs/Departments/Service/kitchen.rsi + state: base + layers: + - state: base + - state: kitchen-0 + - map: ["enum.StorageFillLayers.Fill"] + - type: Appearance + - type: StorageFillVisualizer + maxFillLevels: 13 + fillBaseName: kitchen + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 150 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:SpawnEntitiesBehavior + spawn: + SheetSteel1: + min: 1 + max: 4 + MaterialWoodPlank1: + min: 0 + max: 1 + PartRodMetal1: + min: 0 + max: 2 + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Storage + grid: + - 0,0,5,1 + - 0,3,5,4 + maxItemSize: Normal + whitelist: + tags: + - DrinkGlass + - BoxCardboard + - MonkeyCube + - Enzyme + - Mayo + - Packet + - Cleaver + - Knife + - KitchenKnife + - RollingPin + - Ingredient + - Trash + - type: Construction + graph: Shelf + node: ShelfKitchen + +- type: entity + id: ShelfChemistry + parent: ShelfBaseReinforced + name: chemical shelf + description: Keeps all your chemicals safe and out of the clow- er, public hands! + components: + - type: Sprite + sprite: Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi + layers: + - state: base + map: ["enum.StorageVisualLayers.Base"] + - state: unlocked + shader: unshaded + - state: chem-0 + - map: ["enum.StorageFillLayers.Fill"] + - state: closed + map: ["enum.StorageVisualLayers.Door"] + - state: locked + map: ["enum.LockVisualLayers.Lock"] + shader: unshaded + - type: StorageFillVisualizer + maxFillLevels: 7 + fillBaseName: chem + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 330 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:SpawnEntitiesBehavior + spawn: + SheetPlasteel1: + min: 1 + max: 2 + SheetPlastic1: + min: 1 + max: 2 + ShardGlass: + min: 1 + max: 1 + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Storage + grid: + - 0,0,5,1 + - 0,3,5,4 + maxItemSize: Normal + whitelist: + tags: + - ChemDispensable + - GlassBeaker + - Bottle + - type: Construction + graph: Shelf + node: ShelfChemistry + + + +# Access presets +# Try to keep alphabetical sorting if adding more + +- type: entity + parent: ShelfChemistry + id: ShelfChemistryChemistrySecure + suffix: Chemistry, Secure + components: + - type: AccessReader + access: [["Chemistry"]] + diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/furniture/shelfs.yml b/Resources/Prototypes/Recipes/Construction/Graphs/furniture/shelfs.yml new file mode 100644 index 0000000000..61a903f7a0 --- /dev/null +++ b/Resources/Prototypes/Recipes/Construction/Graphs/furniture/shelfs.yml @@ -0,0 +1,268 @@ +- type: constructionGraph + id: Shelf + start: start + graph: + - node: start + actions: + - !type:DeleteEntity {} + edges: +# Normal + - to: ShelfWood + completed: + - !type:SnapToGrid + southRotation: true + steps: + - material: WoodPlank + amount: 4 + doAfter: 2 + - to: ShelfMetal + completed: + - !type:SnapToGrid + southRotation: true + steps: + - material: Steel + amount: 5 + doAfter: 3 + - to: ShelfGlass + completed: + - !type:SnapToGrid + southRotation: true + steps: + - material: Glass + amount: 4 + doAfter: 2 +# Reinforced + - to: ShelfRWood + completed: + - !type:SnapToGrid + southRotation: true + steps: + - material: WoodPlank + amount: 8 + doAfter: 3 + - material: Cable + amount: 2 + doAfter: 1 + - to: ShelfRMetal + completed: + - !type:SnapToGrid + southRotation: true + steps: + - material: Plasteel + amount: 5 + doAfter: 3 + - material: ReinforcedGlass + amount: 5 + doAfter: 2 + - material: Cable + amount: 3 + doAfter: 1 + - to: ShelfRGlass + completed: + - !type:SnapToGrid + southRotation: true + steps: + - material: Plastic + amount: 5 + doAfter: 2 + - material: ReinforcedGlass + amount: 5 + doAfter: 3 + - material: Cable + amount: 2 + doAfter: 1 +# Departmental + - to: ShelfBar + completed: + - !type:SnapToGrid + southRotation: true + steps: + - material: WoodPlank + amount: 6 + doAfter: 2 + - to: ShelfKitchen + completed: + - !type:SnapToGrid + southRotation: true + steps: + - material: MetalRod + amount: 2 + doAfter: 1 + - material: Steel + amount: 5 + - material: WoodPlank + amount: 3 + doAfter: 2 + - to: ShelfChemistry + completed: + - !type:SnapToGrid + southRotation: true + steps: + - material: Plasteel + amount: 2 + doAfter: 2 + - material: ReinforcedGlass + amount: 5 + doAfter: 2 + - material: Plastic + amount: 5 + doAfter: 2 + - material: Cable + amount: 2 + doAfter: 1 + +# Normal deconstructs + - node: ShelfWood + entity: ShelfWood + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 4 + steps: + - tool: Prying + doAfter: 2 + + - node: ShelfMetal + entity: ShelfMetal + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: SheetSteel1 + amount: 5 + steps: + - tool: Screwing + doAfter: 5 + + - node: ShelfGlass + entity: ShelfGlass + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: SheetGlass1 + amount: 4 + steps: + - tool: Screwing + doAfter: 2 +# Reinforced deconstructs + - node: ShelfRWood + entity: ShelfRWood + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 8 + - !type:SpawnPrototype + prototype: CableApcStack1 + amount: 2 + steps: + - tool: Screwing + doAfter: 5 + - tool: Prying + doAfter: 2 + + - node: ShelfRMetal + entity: ShelfRMetal + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: SheetPlasteel1 + amount: 5 + - !type:SpawnPrototype + prototype: SheetRGlass1 + amount: 5 + - !type:SpawnPrototype + prototype: CableApcStack1 + amount: 3 + steps: + - tool: Screwing + doAfter: 2 + - tool: Welding + doAfter: 5 + + - node: ShelfRGlass + entity: ShelfRGlass + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: SheetPlastic1 + amount: 5 + - !type:SpawnPrototype + prototype: SheetRGlass1 + amount: 5 + - !type:SpawnPrototype + prototype: CableApcStack1 + amount: 2 + steps: + - tool: Welding + doAfter: 2 + - tool: Screwing + doAfter: 4 + +# Departmental deconstructs + - node: ShelfBar + entity: ShelfBar + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 6 + steps: + - tool: Prying + doAfter: 3 + + - node: ShelfKitchen + entity: ShelfKitchen + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: PartRodMetal + amount: 2 + - !type:SpawnPrototype + prototype: SheetSteel1 + amount: 5 + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 3 + steps: + - tool: Screwing + doAfter: 2 + - tool: Welding + doAfter: 2 + - tool: Prying + doAfter: 1 + + - node: ShelfChemistry + entity: ShelfChemistry + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: SheetPlasteel1 + amount: 2 + - !type:SpawnPrototype + prototype: SheetPlastic1 + amount: 5 + - !type:SpawnPrototype + prototype: SheetRGlass1 + amount: 5 + - !type:SpawnPrototype + prototype: CableApcStack1 + amount: 2 + steps: + - tool: Welding + doAfter: 2 + - tool: Screwing + doAfter: 1 + - tool: Anchoring + doAfter: 2 + - tool: Prying + doAfter: 4 diff --git a/Resources/Prototypes/Recipes/Construction/storage.yml b/Resources/Prototypes/Recipes/Construction/storage.yml index 41abf881b6..f5590f3aa9 100644 --- a/Resources/Prototypes/Recipes/Construction/storage.yml +++ b/Resources/Prototypes/Recipes/Construction/storage.yml @@ -49,3 +49,150 @@ canBuildInImpassable: false conditions: - !type:TileNotBlocked +# Shelfs +# Normals +- type: construction + id: ShelfWood + name: wooden shelf + description: A convenient place to place, well, anything really. + graph: Shelf + startNode: start + targetNode: ShelfWood + icon: + sprite: Structures/Storage/Shelfs/wood.rsi + state: base + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: true + conditions: + - !type:WallmountCondition + +- type: construction + id: ShelfMetal + name: metal shelf + description: A sturdy place to place, well, anything really. + graph: Shelf + startNode: start + targetNode: ShelfMetal + icon: + sprite: Structures/Storage/Shelfs/metal.rsi + state: base + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: true + conditions: + - !type:WallmountCondition + +- type: construction + id: ShelfGlass + name: glass shelf + description: Just like a normal shelf! But fragile and without the walls! + graph: Shelf + startNode: start + targetNode: ShelfGlass + icon: + sprite: Structures/Storage/Shelfs/glass.rsi + state: base + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: true + conditions: + - !type:WallmountCondition + +# Reinforced +- type: construction + id: ShelfRWood + name: sturdy wooden shelf + description: The perfect place to store all your vintage records. + graph: Shelf + startNode: start + targetNode: ShelfRWood + icon: + sprite: Structures/Storage/Shelfs/wood.rsi + state: rbase + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: true + conditions: + - !type:WallmountCondition + +- type: construction + id: ShelfRMetal + name: sturdy metal shelf + description: Nice and strong, and keeps your maints loot secure. + graph: Shelf + startNode: start + targetNode: ShelfRMetal + icon: + sprite: Structures/Storage/Shelfs/metal.rsi + state: rbase + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: true + conditions: + - !type:WallmountCondition + +- type: construction + id: ShelfRGlass + name: sturdy glass shelf + description: See through, decent strength, shiny plastic case. Whats not to love? + graph: Shelf + startNode: start + targetNode: ShelfRGlass + icon: + sprite: Structures/Storage/Shelfs/glass.rsi + state: rbase + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: true + conditions: + - !type:WallmountCondition + +# Departmental +- type: construction + id: ShelfBar + name: bar shelf + description: A convenient place for all your extra booze, specifically designed to hold more bottles! + graph: Shelf + startNode: start + targetNode: ShelfBar + icon: + sprite: Structures/Storage/Shelfs/Departments/Service/bar.rsi + state: base + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: true + conditions: + - !type:WallmountCondition + +- type: construction + id: ShelfKitchen + name: cooking shelf + description: Holds your knifes, spice, and everything nice! + graph: Shelf + startNode: start + targetNode: ShelfKitchen + icon: + sprite: Structures/Storage/Shelfs/Departments/Service/kitchen.rsi + state: base + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: true + conditions: + - !type:WallmountCondition + +- type: construction + id: ShelfChemistry + name: chemical shelf + description: Perfect for keeping the most important chemicals safe, and out of the clumsy clowns hands! + graph: Shelf + startNode: start + targetNode: ShelfChemistry + icon: + sprite: Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi + state: base + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: true + conditions: + - !type:WallmountCondition diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index f450e27714..72c2e46d9b 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -1320,6 +1320,12 @@ - type: Tag id: Wrench +- type: Tag + id: DrinkGlass + +- type: Tag + id: Ingredient + - type: Tag id: Wringer diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/base.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/base.png new file mode 100644 index 0000000000000000000000000000000000000000..2d67101d2fc367f5c3efabe8639b97017257635c GIT binary patch literal 692 zcmV;l0!#ggP)Px%Zb?KzR9J=WRzGMHQ5gT_PjkIX!d*;Fa-kHD#GymMrHj;)=%Q05g(3wP$?WXx ztec1g1aVOuGQ~v#MO?b1RSb=SrIbsfiOqRUV&!Zd^zQO5?=DG|bTGf^eed_Z@B6(! z-^T+c_}}5_HL}_4(KwP83I#K--%jT9d9W;N+8oDOeTKcrxitW|bveCA6Xm5%8pqc7cF?76Wds;8dauG&K)qi7 zXUXj%n$2b(M|}gsApGPiVQVWz2TylUuV9=Qcmkgj5*}7I5%Q5*y_fD2_TfHRmiv`W zs0j)9@)rWwxV|(k1RyX0=(-NCy5s2E%N_Ew5SRcCP6hD8t1ory{?|hbh(@DmwOWYH zL7q!Sab{))0I=0)U^W&905F_@ou>2Fj+kk%em?>c9}t0en^9#W_CNs!);Hc@eZw)w z$XK42sPlvXRaMQgD4bsffU`dbIsSU{~-0{~p)8KC_gX#Z}p5`cvl z7fe6TmFL8|g_qaN@mm`w@eC2$RR92_(`o8%PIJyaZk!v44_YRZ8OyJ@R4RD}drdIG anD7hV)XtMD4qp-g0000cq@Gs=6k_mn^>bP0l+XkK DN_QQ_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-1.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-1.png new file mode 100644 index 0000000000000000000000000000000000000000..47ee108f18c6ba3e19ba03b4510b862b4e703184 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}i#=T&Ln2y} z6C_v{Cy4Zv9PsdHJbY}nyM% zITnt&>;l3}{}bOZ|9i!9HTWtcpLG7Z-AkfY{m#3;*O~_i<|!4kY!hj8yMk?3WNI2EC@xv>ubG7z2%4MUMDe%1fA4?klp@F-O@RhnZU;3aSe3;Y Z7&H>pj7p#CZvi@&!PC{xWt~$(695g5P=f#f literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-2.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-2.png new file mode 100644 index 0000000000000000000000000000000000000000..77a54a15cef75cea27d1362369af7614827dae4b GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}A3a?hLn2y} z6C_v{Cy4Zv9PsdHJbY}nyM%kg8 zR}AgF=GS9`bg$NKe}7Mw4G8=vS~h{S#+co+Ns`(WFrl%rQE{4T-_DYM$Nxu9T+}Xd zz{TU>uj@y(*h`mJB~1Q&1hfy;Bq^t0rFuBGlTO(_f$i#-`jznXYh3Ob6Mw<&;$V1`F_>_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-3.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-3.png new file mode 100644 index 0000000000000000000000000000000000000000..ddd26ba62701212cd38959dfa7b0b63db2337528 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^T<&YmugArY;~ z2@q8R{IPj6FO@a)gOe^0(~aC5T(Mb-W19gtN}RzA$J`3FC9 z^VZ!;#{)s)%;s^?oB#Z-W}ffd!O6J8mHp4vhp%EM9Qm%$sl3|#y0cNijf&#A7fkox z<_Rv@X6$qE=DVGbj&QDc>aG>JdR^G2u-LuFDj&Cf@0xr)@lpE~$#lEGu1QZwNGN!c`k-awM@BIx zu2=RR1|VQ@V%^t-AOHTT`26`Xt77eAd4-%jHjd=}{kwRXO)ko{dC1;o* jm)k)NNPsm>Px$!bwCyR9J;$U>F6XU=)mWz(`1e!^WFO7#J9=Ilh0mu_MA<6DFRSnfV{ao<4m# zia9PDZysU){y}&vl6tZn;IQ%LItB)YKzBusqdV{au;%>!{^a%u3kwDY28Jh3p1>U- zBO}8Iv-l4KgSERN$593b28IJSUR$&L`+EbQLx>3hxJ3v2)#2)0ki_>Oi6g5=*F!RJ z*m!fD&^5o?3{!NrGfdIh?z!T`38>{qDp{+pRQ42*Cg-uoUF-FZm+Hu3`#&>$XJBApaO7p+gt74f z7D5W@KS(ezFfcGU$gcHZ`2PMRO#Jwoc&+0fAZ%_12xE`Gx(x#~(H@3K9o^%vZbQh9 zQ81u@U>0#In)VXL-q)8UPHhL^O@!{1EAN?^s=tBpS=m?K+u0tjL`?_a4T0l#@1JO# zbJrZkuTN1vX{oGeK}`n`%!ZTW`Ch(Z6%}V-U|`sG@uN8*^`rv41ySRiyKD>$3=AT_ zU%wRj{rctU({IjG+W`aQ7{SyD*ym^+n>E~C=Pr80000< KMNUMnLSTZVlj>^# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-5.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-5.png new file mode 100644 index 0000000000000000000000000000000000000000..1b7430d80959724d2f248e5c254936089d2e0ebe GIT binary patch literal 605 zcmV-j0;2tiP)Px%7fD1xR9J;$U>F6XU=)mWz(`1e!^WFO7#J9=Ilh0mu_MA<6DFRSnfV{ao<4m# zia9PDZysU){y}&vl6tZn;IQ%LItB)YKzBusqdV{au;%>!{^a%u3kwDY28Jh3p1>U- zBO}8Iv-l4KgSERN$593b28IJSUR$&L`+EbQLx>3hxJ3v2)#2)0ki_>Oi6g5=*F!RJ z*m!fD&^5o?3{!NrGfdIh?z!T`38>{qDp{+pRQ42*Cg-uoUF-FZm+Hu3`#&>$XJBApaO7p+gt74f z7D5W@KS(ezFfcGU$gcHZ`2PMRO#Jwoc&+0fAZ%_12xE`Gx(x#~(H@3K9o^%vZbQh9 zQ81u@U>0#In)VXL-q)8U4r4nPF1W|Qz`(G#KS7BS2jESF?v*R=nVG7;f$>?{SKiy% z98q%v-IN z9Q#+~TF$^gL^hlp&-d~TtEe~w0|UdhiyzGy7#JApQP$eylmgm?gCfuUA6Z= r0|NuY);4GI%lc6;3P!;w7z_Xa8xYH1*bm_900000NkvXXu0mjf_}~@3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-6.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/chem-6.png new file mode 100644 index 0000000000000000000000000000000000000000..e415ee1a7e8898bca03da2d4cb2b7b4d7fa4e2c6 GIT binary patch literal 710 zcmV;%0y+JOP)Px%fJsC_R9J=WlU+ztVHn5%E9bT%f|3%M7qj5tH2Q$lHlx)hTMimsC3ca7H|w1@})wGLjL5m z!2eGT7Eda2(x>{;LtyarO;a`B>tWhoiz+5t`uh`m5 zmTTlsPM}n1&PJ8|CV?Ih=tBSQZ~hvCFXcV4d}{?GjWZZ&oVhs>4sRC^IpofSL+(s0 ztCC6UMC1$6=P9s5HAoEAATdvYCAs}LB-X@Kw(snRb1yA>-t5^+*14Z~*sM5FGBRBU)SEc$r$E>fwe7Hwi*Xod@~ zB%|MHhU005?|a z*>u%LHXV!QmW291d-Jzww5aXoet!e^`bi?QS5AoN5Lz68(hmGCQ^`+uHvP;f6L{l? sWwMK8y~*=SewXQzSPcmY35f&cH@C12VU!4N-T(jq07*qoM6N<$f|40ef&c&j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/closed.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..c79f80c0c2310f301d6313426bec0a4a53311631 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}M?GB}Ln2y} z6C_v{Cy4MEBpgvql)tpGf0meROz^`N-#M()*;s?u9&X_=y)wzbvh0@_KQr@T#v<8c zF6-Q~8UxvTtQeLvFH(A2!jXAz)29_;%*@QqJ+qj;$~yEYM-}NjG@JaIV-8=$wm%m{ zlVlDaIB?*@lWWYIWE;&{I4l>Xo%+Z=#i}Vm>cDf3`30}DPfVNim}Ai;2E&Vv>y$at zoTIFp5|mVq2^w&pEMy7noG`6VL4x&%%)*uHzcoj=_cR3>aJez+F)&okPTdx?G;ANx OLkym-elF{r5}E+_Ygr+ArY-_ z&lxf@FmNy{B(JG=WzOK>m-lcGEx2&9#OOXh14F}P)<w1lw}$KTFM5ezk1=AE4ZUOAL1I78TNam(66JpsOk(WKzsvE8}P& zcgyhpMb!FsY_Neb67e#xO~{SKtca#>qQNat5cX6F8&C9wPEE|TcC#+JYD@< J);T3K0RU(OUmpMf literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/unlocked.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Medical/chemistry.rsi/unlocked.png new file mode 100644 index 0000000000000000000000000000000000000000..39d2fb77884f3e7d5ec21c0538d18761652efca5 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}s-7;6ArY-_ z&lxf@FmN2+Pi0jO8VkuLc9xTmmm7EjISihzelF{r5}E** CYagWm literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-0.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-0.png new file mode 100644 index 0000000000000000000000000000000000000000..c090326148dd2c90eda107a749782cd9a2c9f7ba GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}DV{ElArY;~ z2@I;*M#72S8xM29xHA*UEs#7;w2A)Bu|qz{1cqk>{w5yu=cqeGHzi KelF{r5}E+2SvuSR literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-1.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7d698e0020f00e0d34ad9d97cc5a45c60703f879 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}D?D8sLn2y} z6C_v{Cy4Yg2|0K*ysgigebQx8mY-zS?ehmb)*RAF|5~nd#>b}q-@o5Rx$k`yonGzz zd}_Xtfq_BJ+$);B{<0Sp6*3dFf4sd|9_Gm$?WnZXqw|E;zs~pbK2Ff$O8|li-^&!E z*6v$*qTEWL~T~}T6mg%CuKsPgZy85}Sb4q9e020Jr>;M1& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-10.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-10.png new file mode 100644 index 0000000000000000000000000000000000000000..5acb43b17992e3a4febbfbf730ad8712a3205eb4 GIT binary patch literal 652 zcmV;70(1R|P)Px%MoC0LR9J=WlwC+uVHn5%XFIx9Yi(_QE{i$Kp|urVj6T$xjSUQ1nRHhdeIUUG zAxn0=DuOU2(1?Z(DH^d0w?Oft79!Q^Li(_d7l6K2?z)X2=L&vy^dt}wWS*JCoNY*TtxoMwjYJ0TL1uq)gl4_y2IKe0Ngxl z%Gn6TMf5D_CUc1+JQu2Dav-&Dd(dL1rsu-5&+oG$K*T1tgKlsfiyISK%4o+im-BZg*J7v(=(m7 zfnRKEG~=360`ZqV^q!X&NUau(Y+@;2a~c6fLXoXCS`K~C=xY}NY|YC+@LuPqnA?j= zLwP3gCj2dXZY(*LJU*|&`1J)eu|?Vyp;bTIs?ci*0HEa32>_VxdGN0C5k-%q_>AGy zRlI(6|B12qigCi|kk$l{c>BB9+pZQ)_e_8n`!4J!^%ooR{)7M?uOKu$wDg=d+SE`S zEdc@L?@@vCo>>AIhAXD{&-D#vc0O7cuo3ctB&}( zBi05hiTJuBeDd-BBwBQ3L{&&*b}@J2x}){AIX^Z{ED|w>x6h mJ9ZI&yCe4Biwg({0000Px%Y)M2xR9J=WlwC+uVHn5%XCAfHvaQYUEaogl%OzcmKGd6u0|PCS?(D(}5fnm} zY+fZnm?O}L#uO=%*u^$MQK-e7*6Kp~u&{_#e!y5XwOtGab9=g|WV5n!9CUSla4z2W z{GaFlyyv{n0|*ER2=L&1O({jMl^NOeH!W90TtwEZx*ta3Jph2Ad=UYFs#+NWfZG=} zTP}p*B6{X9(7juZuWW)yvKEenp0Wm+Jjb%gB#4qJ9NEz%-_F!_K8ndz)zanzfRUcg z?9Fm>`T~KZ3}hZIl`YS&Bu-0OWB?HSd?w|fCn%{)Nru?D1bdtI#fGpfMUHaqT$gz+ z?gDEy+mu(hJL_ltgi51zfv=%s^cjc4a|N}*RON=yyr0jeu>TSOKzc_#0L=9~e3v`Huv198 zP~31GuU|cQqE5S}o>n)D3+)KJ{Zs5+eIuuPCculMmyc1|mGYS0w{+Cggib}4j(T1* zfpZr)M~2tiX{SyB>FIO;fZJvw0AL13k<`=xW^j~`KX-E%K-N3`1OTUMYREYJnA|oK zRh%dzx6MT3V=n3~QPB99EAH|98)m?HA0RW}jNUi2>ZxBPB15Zw%ch)uf!}Dd&7(O#$uCE22J4LCmSW1Kr-r@=Ed!bbI;a<2@uA zRhcADVzIco2J=V%di;@+;{oYzg(A4Lu<-n)CzWsBxUsf3`|=MQB5QlI@4uT12nfW( YcMSv4Nr;lodH?_b07*qoM6N<$f&^+mUH||9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-12.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-12.png new file mode 100644 index 0000000000000000000000000000000000000000..77469720a635ab8497a7de25b3a39cdf1bc8560a GIT binary patch literal 729 zcmV;~0w(>5P)Px%lSxEDR9J=Wlv_ws0T{>sXHIQ3*KG5i#hj&Rxugf_qP|QV*vMwmn>|<|f(Vw(z5wH=NYc)R_iS_~jx{?G00Ls$}F96)Wl=0U= z7&fA3Rz2OjW&J7)5{OsV*1b=K`fypiX^sgJgwopju2R`frl9VTpI2Ual?woRn(E@V z@@Dl0+#%73Ig%N^IJp!&DlQKP0MF;Ml0!otaiJs>BKtfnRq7X;%3|g5iq-S=#)*If z{9=Ee8aK*A5%i@QrpuCGQEm<#yFE->;TkMbx71gw$~pBRE;)4tz`lS2SUc)Jx%4ea zNQ+%}zZv@GdvDk~>^-+A!^q7g6nG*On@SUZ9$O;ZP5=N=HAMh0(e&_L!XP6YLFC1> z;_G<*>cJCLw?F|F~Oh+$5N{hjC^a22Ct+s%-q+fFfK;}EG1OR99^U2Wt znEKlrDCcAr^|v?BK%aw})8#bK=O9O?g>*J8IXW%>CWH~N-v`JD*nO|-D=Mi~DIk4C zrC%eRO-or-YSP)X+Xi6u38oDO_4^${OdAYp0O-=B5CBY$jiXtdhRLyUKmGF5!c17K z1j|zkGi>}h(UOr&2NF}MB_rAI>6~qi&fM%=a<(-(x%hEj5+%wQl7$E{x3UW3$LWpw zqvN3}VZ_dNR6A0e{4eIL&hCb1N00000 LNkvXXu0mjf`A1iX literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-2.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5eab596dd4648c3d0651b52b21a060968028c6de GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Z#-QbLn2y} z6C_v{Cy4Yg2|0K*ysb~!x2WYyeN0v-tB=acXHy&>YW>!(TX==B=ZMysqOkhoht3@N z{QUiX{mb9(i4^&5tU7$+%#nZp-|wGa{ai-aG5r19@PAVp8ygc}FY(K)c_t*wG>L6n z(|x(x^r xI9J@N`B8uM*YW>!(TX==B=ZMysqOkhoht3@N z{QUiX{mb9(i4^&5tU7$+%#nZp-`l_2Tilmeam0H4A5CUv=EK)K=U)18M%9W%g*S(F zzwNJcTA2yjCk`Aq@ZtUW{rOhz_8v9hv1T z9I*B0hySb2wrieK1$n3`(16SBpoRpi2|L4W4SOCA9-aL_Z!>th`njxgN@xNAdkTZQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-4.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-4.png new file mode 100644 index 0000000000000000000000000000000000000000..15c03124e69b1c62484d2e10751603caa0312ce4 GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^T<(Vi}jArY;~ z2@!%$S$vx6Qeu%wgK* zU)Jlki`S)FuHK&vlqm4qSjD{be<$asq!r)KY1hA+8~$%f7T*Mu4WfU(y|7-rq;ahR zGc)ty{r3O&y_ETTK={=0a|d?*mOXr{XnJu*)Do8z(f>!v&sTJuj}c3fJpcp>@832Z zdR|hVdgFL`!$j3D@<83$j4772;q$F|fWSXLCiGys+C{|=e-1tTzFuGc?_UrDB;}*y z6SI8(oPR?9d}lm-^yEFyL3tO^i(6JW7{(p&Si@Y_62xpM#j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-5.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-5.png new file mode 100644 index 0000000000000000000000000000000000000000..ece06f2d7866b49989b8ee21e84ca5c1d753c47f GIT binary patch literal 445 zcmV;u0Yd(XP)Px$cS%G+R9J;$U>F6XU=)l35N{1LU;~8M2(!-*LUY@H@*{{T%}X1A}vl)f*`NPfU;(Lyvb}`BU$_ z@~2dBz-u-M21x^3!EcYgvq~D+3NkP-F#P-T@0-ri4?LlK>5dQ$&hUq1T#`Gv#p85kHCm{^#&PJcQ5CH$K(!^O$p8G=8EDxzss zfnvOXs1Oiuieq44V0bub*L5YB*xotEL>L$t7{uE3uj=P=YOQ5>eGQx5g{2vc#Mm(k z20z%nbu-@VM03mcF);jJv0xs>MK4)k1_Q(HWeg1eXD~4ArncEcm4wf$s$6bzurNHY ns&XN$dK8R;Q7{Td0cijL)3}BnsfDj;oiL;tWQV&l?6&R7k6Ei*7)o1GeO+BzdY_|@cTWVmWLD`$Ts6- z^JI=bnBTu|vzOEjE+Yd2gFnANzn^{XBEQYTnm0UicHcK#qg!s-zRcIlCG4Yr&G(-6 zA7|1Ok1-l3ynowt=y^$b>W$;&4HH$r$OGMw&6r|Y8$REf2MGN0V?qz6s~r@G*uL-g zz00R8dAzEE{>R1J{rdg0_3(R12?>cA5i@r9)m#2m{WII(@X?d^C7bL!v=(KCHYV+9 zSRo*g-<6z@kWgWfdA(G1#*KTH$6bJWB#zwry8hMkqO7&46}7yx@3k(K>^XA7kjsN< zT58z;w^DC4^;#q(I?l9#+^~ClUR%0)9KRr2qe5ZU4gWdJW%+miOt^VFJnv{z<$sVH zcBmT~zOXs5w2Qfe$yh?7Og}l{hkbKnqWRXdYFaGw!b5l7d6JM=5f}Q@DdMXJG(s*h ZFa)p_u24=pt_+Mj22WQ%mvv4FO#r6D%&Y(a literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-7.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-7.png new file mode 100644 index 0000000000000000000000000000000000000000..e9468e2cdfe0803e96cb8900071461a19c86d8a7 GIT binary patch literal 546 zcmV+-0^R+IP)Px$+(|@1R9J;$U>F6XU=)l35N{1LU;~8M2(!-*LUY@H@*{{T%}X1A}vl)f*`NPfU;(Lyvb}`BU$_ z@~2dBz-u-M21x^3!EcYgvq~D+3NkP-F#P-T@0-ri4?LlK>5dQ$&hUq1T#`Gv#p85kHCm{^#&PJcQ5CH$K(!^O$p8G=8EDxzss zfnvOXs1Oiuieq44V0bub*L5YB*xotEL>L$t7{uE3uj=P=YOQ5>eGQx5g{2vc#Mm(k zNCK8+R{!l9?I|vV7#N7mh71f047;~(hG!>U4-p1|AaQEgPn-jGZ{7Tm+1poc#e#YN z85kHCxF<0&=sd`!iUWuOGZ+|lFJoZ%KZAi`H?_?sDg>TaRk_^cU}1P(Rpmlh^#Fm} zOD5iSw|D=4d&$Jxr0AnsAz^H2{aQdsMC8M}H*e0KKPpPBKB990AyDdN^y|svdkm#s kM!%?K<|r5iqkt{|09xgT$Sc6)6#xJL07*qoM6N<$g8Fdm^#A|> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-8.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/bar.rsi/bar-8.png new file mode 100644 index 0000000000000000000000000000000000000000..d01b2a6bc8774dd113d4aa31f2cba9f46c8b37b2 GIT binary patch literal 577 zcmV-H0>1r;P)Px$`$F6XU=)l35k!b_gReijJ?V{J(hWy7w&1Ogw-7{`+!_rBYB>cGg=) zW+wLkfB$i333D+9ckV$k%R8_9DFXuo!`4Zi()i3KDg<7$Niawn*b07o^quu8Po5wH z0|Uc{7a@E)M?dg{^06~;?taIxw%p|$nl>pBS;ar`-7_9i>;M>$_jY0E%VTF?el?q6 zRv{lNr@Je|KK>7kOG5uLtQB}IfUH*E)#r}1hW0N81_n8b9I$SE_r0f;a~PELr2f6W zeDpW6-03f;zl47iX1F-{J45gXQAISZDo~6UunC3i7gy0G(zzF52dRsCE}t+foVuVK@>ur!0HbT$e|0+wY~|Lq#>DK3N<7)Zzk zySHwJXD40{5e9)EacbC4oC9`m-TaW*+gEPIf_eWL7#JA1CowVTJjkVr1Be1M7#Mah zV_^6{gMnc;waq3f1fEw_x!mMnVR&9uPx%A4x<(R9J;$U>F6XU=)l35k!b_gReijJ?V{J(hWy7w&1Ogw-7{`+!_rBYB>cGg=) zW+wLkfB$i333D+9ckV$k%R8_9DFXuo!`4Zi()i3KDg<7$Niawn*b07o^quu8Po5wH z0|Uc{7a@E)M?dg{^06~;?taIxw%p|$nl>pBS;ar`-7_9i>;M>$_jY0E%VTF?el?q6 zRv{lNr@Je|KK>7kOG5uLtQB}IfUH*E)#r}1hW0N81_n8b9I$SE_r0f;a~PELr2f6W zeDpW6-03f;zl47iX1F-{J45gXQAISZDo~6UunC3i7gy0G(zzF52dRsCE}t+foVuVK@>ur!0HbT$e|0+wY~|Lq#>DK3N<7)Zzk zySHwJXD40{5e9)EacbC4oC9`m-TaW*+gEPIf_eWL7#JA1CowVTJjkVr1Be1M7#Mah zV_^6{gMnc;waq3f1fEw_x!mMnVR&9u<-)+gz_7_fiz@L?7MNqM@n2O%`~Mts4HQS* zUNZ5vyS@AW+e;?iCdE9G3yBP6$^XJ^EDUdd{b87K_c>g@v7z;A0U;5Q5AWW*IeY%7 zD5>UB3|3UPx%T1iAfR9J=WR$Xh;U=)7x(X{E(mC!n7u@}OsOu9KlLGi*HKduDv(m&yk@?N~H z>}FRA7MXJxx^C*|Hb-nNH8tN&yeN51nzw7CMKA0Fft=@@Jm=&j=kNk^{O@4G#+_x! z{~JlSPWvP;Kk9sR{}#F5xN;HQz5!VhBQf2+K^3OO$&!fe51$D4;^nJIOsoI^c>Sgh zo@KDJ{T5lCjrere0|3|qAFelS7|${gxZz9D;)B?mH?GHWQ48Q%21gwm&5lKLPei4V zjyzi_q;a7jP-EFqB4umjZDt99W0117$prxMHqHX$G-sbFA?5|dra;w9GHOq*74Wrh z!X0?vITq)n%vAR0j*G|ZGSPg0tV4G_sG2#s0AM)d08o_ku)x8wOr+8o6lG~D8=W5H z{NgXcW1VPDRed=h$ee-$-|~z5(^SJ``aY2%d?CVIs@3sFp+= zwY%imYDq-fa3>dV`okrHyC(**{}js$JXu7en$({#SVWpRAlJQ1ixE2sAJ!ZN^%De3 zW38Np?s!;{(|Eqq#e>y6_PZ9cDK-%g$De)?E#)%gJ`k%ZJpe#W>0w1qC+2C|V+#o5 z>XJyr0@RdVV*V^pKS6-4eT&-Or2I!UKK}uz9SBAZ0P2TMq`mb+=ePK<=9wK(_72F> zc>1tP_ywhjjnxWnuSesj;h$~3gFWz}>>b1kh|I?2T*kj!$)RnyPx$UP(kjR9J=WmpzJuKpe$ivSKl85rp6t9w3Fi*tn&w)!u85-~|@XV4(+C7oxR| z2th5TShC3$;;bKIh#Qqa{8jVu_q~VA{9%BFM`u-^SeA93!_;vc<}0)}4a2~0w_|fj zlDHy=!=W+1rf$FA!*$)pekT9`*tX3TyA@5-I&0hj0O0#R8!L)}EXxL&Z8jUkam?nr zu5;_wgH$J=6M#}WnHf*}{{Fz+^d7Uc>h{ zZPXAS?iY8xH-PsUL0GRKK9#R1BK&o2dOYF#=Zxd2%vja6YXCIrc>Ds2D35#B$#J^? O0000cq@Gs=6k_mn^>bP0l+XkK DN_QQ_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-1.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ded931cadfcd6e0e6785420f851a6e1d88a349f8 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Wu7jMArY;~ z2@iBll{4{D_w@$B3!j$pg4x17VQ^8v|1I-2dngR{D f+zx6$Y++(Z3s;mkZ;F}@bOD2>tDnm{r-UW|VP8OD literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-10.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-10.png new file mode 100644 index 0000000000000000000000000000000000000000..8d71c464f6e186f7c34473f5b2f9dbff18d36277 GIT binary patch literal 741 zcmVPx%pGibPR9J=Wms>~_Q5?pT42L+$YPFK(vET3KSbw*Mwm2_eC*S6pQGVkI-rn62b5rM)IuZy3l)1@d zA_D^hOeUyBvm-fVUFv?MOGD_r?1Q~$L02CN1qc94438pj*AWEz9%1x@9{^B!>Wra@ zB--MIlgUVzhJf+!Xj#f#wI(w&PieAV;1$l&958qU0N`?^K#nA#57C%4V`CCR;V5P- zr-5)3A7{U?^k$R8UO*i70%BBG={QQ%*MwMQ7?iG8Ud=5%u$N~(<1C_vFdPn(si`R) zGn>sE0JPn?rI@QedyxYGucwpzSeyp{B&|&azq^8Jm})?lW#s4Q>lgrZyW5F%>ox#@ z=eZl*?sl^0;0dm%Fb{)0O#p!HWlq}m#s)GnGL(jD1^`(6sx(*6)3QntnGu!o@lDyp zC4G*07pMk&J|Ap0n~niM*NYwiz{Z?x%{($AA}y;_8J{aUL~CIjLa$dFLZ1H>!mH=2 zl(lQE4>1IW-%a9M`c4PcvD`;$om~ONWkCG~Cv)cTrx)5@OL$ Xz2p}k6(iR800000NkvXXu0mjfKblOx literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-11.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-11.png new file mode 100644 index 0000000000000000000000000000000000000000..5885ae1c6e3c0603b261730d78d52eb6ea6cf7d8 GIT binary patch literal 804 zcmV+<1Ka$GP)Px%-bqA3R9J=Wmt9CxVHn4MM=G)8=6%u`|5+fAOfPCMsRgSzm4bKd9o zK6{@(?|I&{b0kuvqM{-(K5lJomCXKblHTM<5?H))`KrkFB)4Vj@9o*W8bZyeR+4-N(eKzCaQ1h$Q=k@^=8;uyrZ^bf0syZ!ok%Q=CX}Q(ot+^DqY7c` zE{H0;9T+xK+nmbmb3~bajxfsGQnp#dUngW%hK*AH$d|CCYgfsp&$t=sHeoax6}`Q^ z8kUunB>`Nza7Hz^bI$<@z}Ik7eEl*4K-%Q#$SWMWhII`@A`uD;3pEVjaotr>G=BjA z4fpGKTz6HhTZ&Q=S?GXTDPREx*Q8M!6I!hUtUZFZjU zhTbRL1ziJyKmeP~reOf}4;lfOH8U?Ej)nbXGhE&;SZt4+waF0D*y(@yCBki+Q`4yP+6&wSkm*;;c}Epn~OEdjV)UI8$ygi(|a z+^RqJS52mS4AaNY{CBxsUNNkM)!1UmWYgNCV%$W{GJC?VR6TuSXinFFyL2&k`(kPw z3b!ZCy&|s`#U4)r%P%h%#U2kcGNxj+T7PNA@P#B^vvaM)?*M?Jd;nnXs6toU>x8+v zqYBFw+y4B&;6{)6HyhdSmwX&y7%bx<$EI1KSFPx%>`6pHR9J=Wmt9B{Q5c4wkqT`UF-0u}h1d+qD2bAgwLi$4h(a)}y(o%)Xvv5) z=pq7ze!w;gi7>io(;M+3yU2cZ5!s?7k}&_XcBNL=)pRNpJKf~8>$o#x33cInGv|BH zJKy(m<~uWIB<2WdX=!3=+}_?U8NF|T*5sJ)lK3`MPVVLVyt=tAWYUt;#lr1&E3wIB z5-lw)hD>OR209bPqR4GTd)jC^)k=2bxJo}b=oSFI9bF`E+>N`rmacd002CZJtZO1n zYx4O1aH2hJ(DR*Zlgnn*#Kk2mMHbsF3U8!1=sW@dha&>tXc*1NAvN9I9tQm~Uh^UF z%X}CZHd5Od^0QM#es-$R(-q|J5rNlv7=>=5)IW6wE$Q|x7Q=ho2sE3}@Ar$ozCINf z6B8o=RNlC%m^*mngaqJhs1ZLV#sCOg7>Q+5o~B_<13sURl#~<|2k@-!j!0X%3V?=3 zbv&!PBR21_N^8@TdDD0ifYmuATIux-#Ky)d1p_$%CcY}g1LLUpEJnR9WxOvbK{!00 zL#~3Rf!5YmGBPq$963~oY;<#!XFIaa95 zU8ty%06Je>4APs|m&|F?&g1_;UZGXw6&Iqh~aoim(Z9{&oO&*;jnhr;)1j8C2+Dk~03f6L7pHTPTt zC!ges=9iwyK(2IGp^5{T&JB033DV63%^wp0*PCwo`#%l^a&7N>R9tUExtPvP^nX?9 wW^JH&MYW2{E4{AbUdt90*Yu@IFa13D2@k?kk3Ej8IRF3v07*qoM6N<$f-jVP-v9sr literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-2.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-2.png new file mode 100644 index 0000000000000000000000000000000000000000..03799bb6889c95e57db990a3ae4af1ba91c97d6a GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}XFXjULn2y} z6C_v{Cy4Zv9Pscsc&@hnpYrFsbKh{hQe@rmU~e}DhC^UEi7aB^`O85tNDoSA7T z_-@CPo|;WEZQ+;aT9^Oh=H_19vA6d3G)Gt0*24eKj{d)DS|R}gd~fcZQP5m{;=v1P z?@h`d+8Q=&FgSdBd%ocjuykF0b9CRC<*S(W;`g0duzGd3;;{n<4s0ks@5lxMo}7gu zb}JhaCdgW~%;I?aMxb+pk~Wv#b;DfAP~qnq5LY(^8gRKCJi*A|&1wC0!uRtwK#wta My85}Sb4q9e0AJc`u>b%7 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-3.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-3.png new file mode 100644 index 0000000000000000000000000000000000000000..5daaf7dda8978a6e6b8f0fce0a66da66843c5f3a GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^T<0-i38ArY;~ z2@_nEs+2LzBl*IC}^%e@!*BD z_a@~JZ4DbX7#zO6J>T#MSh}vhIlAx6@>R@w@%zp!SiQPi@z{X_2R0O+cVq(rPtHOS zyOj+I6J)JgW^ufIBha})Nt;XWx?!$lsPJGJgnD_*-25xBmAd?!(>7-%C96 z@m}bedbq_uC~V66v*F#5Jf5EO{%0gwIvU%7cZ~!P aU|_IR3kqbKwOa`oPz;`~elF{r5}E*J&x+On literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-4.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-4.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7be0c7da2abdb4ba0d8f50301695b36fb59dcb GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^T_nEs+2LzBl*IC}^%e@!*BD z_a@~JZ4DbX7#zO6J>T#MSh}vhIlAx6@>R@w@%zp!SiQPi@z{X_2R0O+cVq(rPtHOS zyOj+I6J)JgW^ufIBha})Nt;XWx?!$lsPJ8(e z$2-0gTg{Vhe0*c%BsX8tcl$2BA@8qD**pTGO{|J!bT9{qXyl4ls} zwyHg4xEG_Ked_zO)kk&OmZ+Ss-?CxO0%njK{bF{V{_y7J<8tO_4Mtm^ZrM~V0t^EK b0|tgig)yZG^}o*mLzThP)z4*}Q$iB}EEJ=r literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-5.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-5.png new file mode 100644 index 0000000000000000000000000000000000000000..150e8f3ec78c5dc6bbe287407329006c4a33afbc GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^T<-JULvArY;~ z2@_nEs+2LzBl*IC}^%e@!*BD z_a@~JZ4DbX7#zO6J>T#MSh}vhIlAx6@>R@w@%zp!SiQPi@z{X_2R0O+cVq(rPtHOS zyOj+I6J)JgW^ufIBha})Nt;XWx?!$lsPJ8&z zhkV5LYU{&aXN66XS^V#}^qq@}&(BSK*AP>!+$MY8PWWj<|5@ArvCI731$T!9e2C9J z#KNW+$H&GN8oEZY<2vIKhNtoIlJD;B>QYS0TheX*>Vs9n&t`rX>j%EYwu?)0AJ>-{ zvW5FEIxE4-%=AHR!oQun|Lw2+*!uA3<#L|lWlJwCkx4kDuBmPx$-AP12R9J=WmtQDDQ5?s=TM`dwZZf3E{7Lr00}pE=k_T@}`SV~&lEsr0lB6Vs zRwMD`-pdNmWC@5X=s690x*(j|Two zKJ&%Dj{g+EVzEH2R{MAWu(r7i07z0M3dVs-v}GofFoas|X9&AmYx%h$U51E!5llH3E#|AN$n*n3aW6m+`EcPWaC0sz3l(FN@G l>xZBLbY?9|RXZ#Izy}@eon9gux1#_6002ovPDHLkV1g^q^Pm6# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-7.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-7.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb7d79932d64e321e67d2b086b91c77069c3c0c GIT binary patch literal 564 zcmV-40?Yl0P)Px$?ny*JR9J=WmrE!_Q5?pvg=I0g@KCH>AQhx+l4}sGs^uLC=<9zt?1Y=_XAoo7l zg3~PqxD=#D(t^}T&t%|VpyCM@Rt=K&XJ_cSYm~qYp~K;z7K_EDrdF#}05Ck%Cz>m( zsQHmG<|4D%Oa(!Z)CeKaYPG7h*-;u7p9lb0Uz$Z|L=@8VN)(%5c0dpW5JFsP0DzZA z@$ir1Uo~JdnV{3@TxtNYu)F~P2-Sp0#!BI~%wUj)P_KUvVMAr1IM*>S@vGtV@_%3k zr>MPO4B2>NwOc~QyoLdvUP3IUm*#NT)GoO(aW9Xe>HM7?>I{y}ZfjA6H@DKy zHDu+=-ouMWUe(|rZ=#{>Yj z_fBB5UEJ_=XY1Wmj!vPx%14%?dR9J;$U>MBc%iFI1uWw8IH%>eAe?T1Y`nJUXkI!TNGn_I0f5e`RCXQgj zCz+GT!NC9YIs?PK9}JWKO3}i81{OjJmMr09c>9@&;TXeLnmB+U2)9xAA8w;CFlk^! z07gOzcJ4cb68!E?b_Dg10`Mln_wV2TfB5hrhM1tBAR_|<1H+sd6XA|a$;cn8B|nM824{p{9j!|hk=2Cf#JaJ%?y&ViVTjvu_QYJZwLqr3p2cZ z`xZltfq{X6;rBPV<;Z-hI^go<%M7}@x)@>%3=9lA_Z(zkU|?X7ln_VZlL`n1*`Y(I ziO|jtkq9fYqTq5J)0R;+agKtK1MnuC=+?>bM7Fd#mnMk}Z#LvaD}?ZYb-TAST(44PV%YKQGf@us*xd8qW%_g!v1*H#TtSH z8zjU6;e?bZz5*bTI~3Pom8j1p@-`CXoKQ zyZ*m@@rB{V({~JWrll~FB1RRkX48q+g?l~zA3O8(FS1xmU=)TJ0|NsCvKX-dZ^wjz zfq~(~rMnEzo;`ktEO!0DJq)q?2m1b_i&4b^WopYY#6nu8V2EA#YDcQwqkw^dfq?-4 XqfONM&j)!600000NkvXXu0mjfV|5M) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-9.png b/Resources/Textures/Structures/Storage/Shelfs/Departments/Service/kitchen.rsi/kitchen-9.png new file mode 100644 index 0000000000000000000000000000000000000000..9f61aeeb480158a0f8cfd103194e23f0f605a558 GIT binary patch literal 650 zcmV;50(Jd~P)Px%L`g(JR9J=Wmr+PlQ5?p9cT^}Ou?D&_m=Md57N}4@$gC);hlpSxm^}m%6-oAz zK}CcL8BvCzJ=l{gU!;fjP-dl$kP$<|QG-V2h?%*j$yB0Yr>Aba-n#cL9E;lbbk6Ub zd;TAPzQes2{$|a^u8L^LD$0-fMMexnLsl{Sp;q887tgC!rNx9vYw^_49M(jFF!qJ^ z#r5f^&kDT_Zg(!RxQSur(_%nZ)s;n}y0R!U8Tc22tH=2f(R?=GkAGpR^3gflZU zA{-8@nAvQW0J?79l+D#0KP>@x2Ybc0#2f&om8)^?aA_LWG!To$u-R-X1~B017R8&l z05I6^VZhTZb{;q)m6mK^bf^`8tyPU$$LkxgSS)hEWClQDK`x#=&&#hMKIN0gwS@)3 z9r^g%E@&DE1Ohl54iy9Fdol#TI%|Pq9-s1&mtP@|Pm~_iDxn`juU8pDr}JkB&z-E1 z*RFKjlK?_5S{3{4+ZvZOv|0Uo(hSJqmUcN%chA?SB}|&vF!#ruH=z6d4+&mqQQUyy z#DZ+vH8PUAf%>X49!#DZ8~D_8Nh-W}SuADj*>CuatTH0afZVwASi~mhn2b!*)lnyJ>e{xsa_QoRHLJR|ZAqQjzv|TSxqJ6)*|O!v_3M$5k^ley|06s98c+j& zNswPK!`72P5jeOwztIjTUs-Lb@{pyRfpfy1FvYhK+_sMvG4v z8yOlJDXnB+_-;!N6PNr6|FxA;rv4=gPFZ_2cV$pn(jYu6{1- HoD!MXo%+Z=#i}Vm>cDf3`30}DPfVNim}Ai;2E&Vv>y$at zoTIFp5|mVq2^w&pEMy7noG`6VL4x&%%)*uHzcoj=_cR3>aJez+F)&okPTdx?G;ANx OLkym-elF{r5}E+_Ygr+ArY-_ z&lxf@FmNy{B(JG=WzOK>m-lcGEx2&9#OOXh14F}P)<w1lw}$KTFM5ezk1=AE4ZUOAL1I78TNam(66JpsOk(WKzsvE8}P& zcgyhpMb!FsY_Neb67e#xO~{SKtca#>qQNat5cX6F8&C9wPEE|TcC#+JYD@< J);T3K0RU(OUmpMf literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/glass.rsi/rbase.png b/Resources/Textures/Structures/Storage/Shelfs/glass.rsi/rbase.png new file mode 100644 index 0000000000000000000000000000000000000000..584a185caabdcd79c22e51feea45a1cb9f52088a GIT binary patch literal 549 zcmV+=0^0qFP)Px$-$_J4R9J=Wl(BBwP!xtg(^6@09&P~OP7e9mx-bZ zsY{n`JV2KWU9vQ&3W9csP-KVHG&l&_NHlc82*a(x0?|m}lPvk%dvyNa$M+ss^4O7v zgKRe2TZCw_SRClCjBXYR1!P$s#Gz0~SftbGxZ-K@TCEnjT+X#WW&ogCtqP0HimIwe zlB?-%1H+r|K7Bt0h}?YHfBWV&reXLKOC)&z;UhPZ=cfRNuTuM>yntxYX`6L>_sf^6 z0H?<2FZ-u~dc8h3@lg|vMq{#pMf2Yc2yekK*Kv*Ga>ajTyMi6p;D>jbX9wh1H?zLI zh6MEP?|nTIu)e*99P4JhG{!m*jYerUo9ynP?n;PfZ4chn@QV|GXMf82EQ9FVlk`b{Ngve! z!5I+U)p@a;15+6goz!{Z>lQd%#Wjw;p8Hq(*_?e4ZK+*diEa27@1w*v*iyT?SB|g) zhGEQS5CQScO=_#QZWsp1WOA|r(=-8isRW_@8`_ruXaMc2L7sT5h|!dwtG1^BfK)2w nqx@`)8OZ1J3lm?mi0jO8VkuLc9xTmmm7EjISihzelF{r5}E** CYagWm literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/metal.rsi/base.png b/Resources/Textures/Structures/Storage/Shelfs/metal.rsi/base.png new file mode 100644 index 0000000000000000000000000000000000000000..430b603aa3af9356e29b3ea3dce738733060e9ed GIT binary patch literal 352 zcmV-m0iXVfP)Px$8c9S!R9J=Wlrf5hFc^eqm&GEL2x8*_EbPU`*48U}1J7Wg7qC!k8xcfPq}?r+ z1bt@3?0XU6`BnK%oEanzaP#hbEQcgXzRxhtvP}4XJ#I!(1kdxtY+066WE{uUeB@kR z*U0mHwZ91f0BM>^#hxVyg3U8&001bpC%qVJJQKsidlbO#sH2 zHZz&_^}fK_{CNpEgb*;sU>JsyFk?)-`|kjbT0040u!}tBC z%sEw6fl?~8cLQ)Jr6`KxB?0zW1(@eqtaTO9(gV1A;EDlcH}zF0{RPXH-m8c>I*RB} yfTn2x=qVzuy&C}dEs?X>1Zdm#H1nIAOYj3E`*YfR{bVBm0000Xo%+Z=#i}Vm>cDf3`30}DPfVNim}Ai;2E&Vv>y$at zoTIFp5|mVq2^w&pEMy7noG`6VL4x&%%)*uHzcoj=_cR3>aJez+F)&okPTdx?G;ANx OLkym-elF{r5}E+_Ygr+ArY-_ z&lxf@FmNy{B(JG=WzOK>m-lcGEx2&9#OOXh14F}P)<w1lw}$KTFM5ezk1=AE4ZUOAL1I78TNam(66JpsOk(WKzsvE8}P& zcgyhpMb!FsY_Neb67e#xO~{SKtca#>qQNat5cX6F8&C9wPEE|TcC#+JYD@< J);T3K0RU(OUmpMf literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/metal.rsi/rbase.png b/Resources/Textures/Structures/Storage/Shelfs/metal.rsi/rbase.png new file mode 100644 index 0000000000000000000000000000000000000000..430b603aa3af9356e29b3ea3dce738733060e9ed GIT binary patch literal 352 zcmV-m0iXVfP)Px$8c9S!R9J=Wlrf5hFc^eqm&GEL2x8*_EbPU`*48U}1J7Wg7qC!k8xcfPq}?r+ z1bt@3?0XU6`BnK%oEanzaP#hbEQcgXzRxhtvP}4XJ#I!(1kdxtY+066WE{uUeB@kR z*U0mHwZ91f0BM>^#hxVyg3U8&001bpC%qVJJQKsidlbO#sH2 zHZz&_^}fK_{CNpEgb*;sU>JsyFk?)-`|kjbT0040u!}tBC z%sEw6fl?~8cLQ)Jr6`KxB?0zW1(@eqtaTO9(gV1A;EDlcH}zF0{RPXH-m8c>I*RB} yfTn2x=qVzuy&C}dEs?X>1Zdm#H1nIAOYj3E`*YfR{bVBm0000i0jO8VkuLc9xTmmm7EjISihzelF{r5}E** CYagWm literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/wood.rsi/base.png b/Resources/Textures/Structures/Storage/Shelfs/wood.rsi/base.png new file mode 100644 index 0000000000000000000000000000000000000000..a1054e575dd9260e6df82eacddc12818bc603784 GIT binary patch literal 525 zcmV+o0`mQdP)Px$$4Nv%R9J=WR!d6)Q562>;pD_vN@5~Kwuuq~p@LdT1g-n0wT>WMNI?(8K*Nw+ zg-D?`laFB>TMTni=lH_uLHVubo_pqe-<>(<;{r4McW~W{L|Ey32WhgTF@aU=|?hpVtKcgEMRMUN?3Gw3s$R_MYEG(niY-3KCOsn3u-p!WiksT>vmY zsmvqvb_bHcu`V9hh-?Fr1P%)#k5`j+`5pnK4}%pveWPx$F-b&0R9J=Wl{rp>F%X5H7c5~ANI-!ET@FIU4RVPThyze_07Sthasw(3LI)BB zi4>MZ*qN9D0RcQ-5(y~$RhHiK%=>?DK%>$4V+1E0?rjDLR{kV}qDGguqi8YBO^{Mx zXG6j$0juQ~Z9JX9QNZ9aAOvK6_YX5R7#qN74Wk0=$@%ej%>uyb(b2x6zXOb?{N^boS0fp~5r4#n&lDZk)JO*KL@iF;x7h4;X9{~|iBsgVtkTEDF|6&=^q$OcI5fl_ic z7QP8fS?VTCt>3&>>WjhtpM%}?u)l4RuiVYR0RT#TS9ec!&oO|H202Q7jYgvp;}s)= Vg1{w;ek%X~002ovPDHLkV1g*Km?;1N literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/wood.rsi/locked.png b/Resources/Textures/Structures/Storage/Shelfs/wood.rsi/locked.png new file mode 100644 index 0000000000000000000000000000000000000000..421688fcda8a1eb453d5a02967f22689105b4a0c GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}YMw5RArY-_ z&p8S*Ft9Kf7=Br=!5}-wdcN*KB?bnIfSG@585*`Sw#73kb8gP^1?ph%boFyt=akR{ E030V9oB#j- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/wood.rsi/meta.json b/Resources/Textures/Structures/Storage/Shelfs/wood.rsi/meta.json new file mode 100644 index 0000000000..544b43a1e8 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Shelfs/wood.rsi/meta.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by Kezu", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base" + }, + { + "name": "rbase" + }, + { + "name": "locked" + }, + { + "name": "unlocked" + }, + { + "name": "closed" + }, + { + "name": "open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Shelfs/wood.rsi/open.png b/Resources/Textures/Structures/Storage/Shelfs/wood.rsi/open.png new file mode 100644 index 0000000000000000000000000000000000000000..c0e25c446bdc9bd77db14ca156f03395faa3d608 GIT binary patch literal 483 zcmV<90UZ8`P)Px$ok>JNR9J=Wl}}2;KorKm%uFYtmLyuNg;qC}UZbnx1$v2sn5Bz?3&8`l2wuV) zxN_?mbf+K@q{ct3Go8joO)+I6VuzxT-!8nD@B8xJFadIMa{elN+v``RwAwW<&Z@Dj zX3nT7e>l7_*S)xVva|t`hMjT&!*>-40oPap0B(ug`Zle%kq$!IH7{=0ytwRAG`BdM z-XQR8YSbJ6e4Eyt-XLghag<$(#Fr6bVbdk>j!uK5*-UGZ%)HEx)tsSO~M+3|m;sSUuX1*w!VbEy$ z31qdZrMTi3;Bt!Va6EtE^8Ur>No-Y1^AYS;97IAP9Lm`Q!l6V6Y25TH3)<#)oRjl! Z`2ZmpllAvCI~4!`002ovPDHLkV1gx{+;ji{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/Shelfs/wood.rsi/rbase.png b/Resources/Textures/Structures/Storage/Shelfs/wood.rsi/rbase.png new file mode 100644 index 0000000000000000000000000000000000000000..a1054e575dd9260e6df82eacddc12818bc603784 GIT binary patch literal 525 zcmV+o0`mQdP)Px$$4Nv%R9J=WR!d6)Q562>;pD_vN@5~Kwuuq~p@LdT1g-n0wT>WMNI?(8K*Nw+ zg-D?`laFB>TMTni=lH_uLHVubo_pqe-<>(<;{r4McW~W{L|Ey32WhgTF@aU=|?hpVtKcgEMRMUN?3Gw3s$R_MYEG(niY-3KCOsn3u-p!WiksT>vmY zsmvqvb_bHcu`V9hh-?Fr1P%)#k5`j+`5pnK4}%pveWo&qkIIMuq}~x&Q1K4%}jJHDXHr^zz&@paup{S3j3^P6 Date: Mon, 29 Jul 2024 06:04:21 +0300 Subject: [PATCH 7/8] =?UTF-8?q?=D0=91=D0=B0=D1=84=D1=84=D1=8B=20(#510)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Moodsystem cleanups * remove overhydrated and overfed mood debuffs * admins now join game deadmined + new player timers * faster arrivals * recharging rcd with metal, glass, plastic or cable coils * better timings and costs + building apc and camera * preparing for rpd * RPD + make RCD more generic * add rpd to atmos lockers, rcd to engivend * rcd and rpd to technologies * dont deadmin me in debug * rcd ammo buff * add ChargeCountModifier logic for non stackable items * increase time to become experienced player * Dynamic Radial Menus (#29678) * fix * Clean Some Code * Some Commentaries * Update Content.Client/UserInterface/Controls/RadialContainer.cs * Update Content.Client/UserInterface/Controls/RadialContainer.cs --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * more dynamically parameters --------- Co-authored-by: Rinary <72972221+Rinary1@users.noreply.github.com> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> --- .../RCD/RCDConstructionGhostSystem.cs | 2 +- Content.Client/RCD/RCDMenu.xaml | 34 +- Content.Client/RCD/RCDMenu.xaml.cs | 70 ++- .../UserInterface/Controls/RadialContainer.cs | 6 + .../GameTicking/GameTicker.RoundFlow.cs | 7 +- Content.Server/_White/Mood/MoodComponent.cs | 22 +- Content.Server/_White/Mood/MoodSystem.cs | 14 +- Content.Shared/CCVar/CCVars.cs | 10 +- .../Nutrition/EntitySystems/HungerSystem.cs | 2 +- .../Nutrition/EntitySystems/ThirstSystem.cs | 11 +- .../RCD/Components/RCDAmmoComponent.cs | 4 + Content.Shared/RCD/Components/RCDComponent.cs | 7 + Content.Shared/RCD/RCDPrototype.cs | 15 +- Content.Shared/RCD/Systems/RCDAmmoSystem.cs | 27 + Content.Shared/RCD/Systems/RCDSystem.cs | 20 +- .../Systems/ClothingGrantingSystem.cs | 32 +- .../_White/Mood/MoodEffectPrototype.cs | 20 +- .../_White/RCD/RCDCategoryPrototype.cs | 17 + .../ru-RU/rcd/components/rcd-component.ftl | 81 ++- .../Catalog/Fills/Lockers/engineer.yml | 2 + .../Catalog/Fills/Lockers/heads.yml | 2 + .../VendingMachines/Inventories/engivend.yml | 5 +- .../Objects/Materials/Sheets/glass.yml | 11 + .../Objects/Materials/Sheets/metal.yml | 5 + .../Objects/Materials/Sheets/other.yml | 3 + .../Entities/Objects/Materials/parts.yml | 3 + .../Entities/Objects/Tools/cable_coils.yml | 3 + .../Entities/Objects/Tools/tools.yml | 109 +++- .../Entities/Structures/Machines/lathe.yml | 2 + Resources/Prototypes/RCD/rcd.yml | 161 +++--- Resources/Prototypes/Research/industrial.yml | 2 + .../_White/Mood/generic_negativeEffects.yml | 24 +- .../_White/Mood/generic_positveEffects.yml | 42 +- .../_White/Mood/moodEffects_needs.yml | 39 +- .../Prototypes/_White/RCD/categories.yml | 43 ++ Resources/Prototypes/_White/RPD/rpd.yml | 482 ++++++++++++++++++ .../_White/Recipes/lathe_recipes.yml | 18 +- .../Items/Tools/rpd.rsi/equipped-BELT.png | Bin 0 -> 422 bytes .../White/Items/Tools/rpd.rsi/icon.png | Bin 0 -> 875 bytes .../White/Items/Tools/rpd.rsi/inhand-left.png | Bin 0 -> 1068 bytes .../Items/Tools/rpd.rsi/inhand-right.png | Bin 0 -> 1100 bytes .../White/Items/Tools/rpd.rsi/meta.json | 26 + .../portable_camera_viewer.rsi/icon.png | Bin 701 -> 0 bytes .../portable_camera_viewer.rsi/meta.json | 14 - 44 files changed, 1082 insertions(+), 315 deletions(-) create mode 100644 Content.Shared/_White/RCD/RCDCategoryPrototype.cs create mode 100644 Resources/Prototypes/_White/RCD/categories.yml create mode 100644 Resources/Prototypes/_White/RPD/rpd.yml create mode 100644 Resources/Textures/White/Items/Tools/rpd.rsi/equipped-BELT.png create mode 100644 Resources/Textures/White/Items/Tools/rpd.rsi/icon.png create mode 100644 Resources/Textures/White/Items/Tools/rpd.rsi/inhand-left.png create mode 100644 Resources/Textures/White/Items/Tools/rpd.rsi/inhand-right.png create mode 100644 Resources/Textures/White/Items/Tools/rpd.rsi/meta.json delete mode 100644 Resources/Textures/_Sunrise/Entities/Objects/Devices/portable_camera_viewer.rsi/icon.png delete mode 100644 Resources/Textures/_Sunrise/Entities/Objects/Devices/portable_camera_viewer.rsi/meta.json diff --git a/Content.Client/RCD/RCDConstructionGhostSystem.cs b/Content.Client/RCD/RCDConstructionGhostSystem.cs index 792916b892..3959384396 100644 --- a/Content.Client/RCD/RCDConstructionGhostSystem.cs +++ b/Content.Client/RCD/RCDConstructionGhostSystem.cs @@ -56,7 +56,7 @@ public sealed class RCDConstructionGhostSystem : EntitySystem } // If the placer has not changed, exit - _rcdSystem.UpdateCachedPrototype(heldEntity.Value, rcd); + _rcdSystem.UpdateCachedPrototype(rcd); if (heldEntity == placerEntity && rcd.CachedPrototype.Prototype == placerProto) return; diff --git a/Content.Client/RCD/RCDMenu.xaml b/Content.Client/RCD/RCDMenu.xaml index b3d5367a5f..3c201e404e 100644 --- a/Content.Client/RCD/RCDMenu.xaml +++ b/Content.Client/RCD/RCDMenu.xaml @@ -1,47 +1,19 @@ - + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + diff --git a/Content.Client/RCD/RCDMenu.xaml.cs b/Content.Client/RCD/RCDMenu.xaml.cs index 51ec66ea44..689c904384 100644 --- a/Content.Client/RCD/RCDMenu.xaml.cs +++ b/Content.Client/RCD/RCDMenu.xaml.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Client.UserInterface.Controls; using Content.Shared.Popups; using Content.Shared.RCD; @@ -10,6 +11,10 @@ using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; using Robust.Shared.Prototypes; using System.Numerics; +using Robust.Client.Graphics; +using Robust.Shared.Graphics.RSI; +using Robust.Shared.Serialization.Manager.Exceptions; +using Robust.Shared.Utility; namespace Content.Client.RCD; @@ -40,13 +45,12 @@ public sealed partial class RCDMenu : RadialMenu // Find the main radial container var main = FindControl("Main"); - if (main == null) - return; - // Populate secondary radial containers if (!_entManager.TryGetComponent(owner, out var rcd)) return; + SetupCategories(main, rcd); // WD + foreach (var protoId in rcd.AvailablePrototypes) { if (!_protoManager.TryIndex(protoId, out var proto)) @@ -55,12 +59,9 @@ public sealed partial class RCDMenu : RadialMenu if (proto.Mode == RcdMode.Invalid) continue; - var parent = FindControl(proto.Category); + var parent = Children.First(c => c.Name == proto.Category.Id); - if (parent == null) - continue; - - var tooltip = Loc.GetString(proto.SetName); + var tooltip = Loc.GetString(proto.Name); if ((proto.Mode == RcdMode.ConstructTile || proto.Mode == RcdMode.ConstructObject) && proto.Prototype != null && _protoManager.TryIndex(proto.Prototype, out var entProto)) @@ -80,17 +81,16 @@ public sealed partial class RCDMenu : RadialMenu if (proto.Sprite != null) { - var tex = new TextureRect() + var tex = new TextureRect { VerticalAlignment = VAlignment.Center, HorizontalAlignment = HAlignment.Center, - Texture = _spriteSystem.Frame0(proto.Sprite), + Texture = GetSprite(proto.Sprite), TextureScale = new Vector2(2f, 2f), }; button.AddChild(tex); } - parent.AddChild(button); // Ensure that the button that transitions the menu to the associated category layer @@ -119,6 +119,50 @@ public sealed partial class RCDMenu : RadialMenu SendRCDSystemMessageAction += bui.SendRCDSystemMessage; } + private void SetupCategories(RadialContainer main, RCDComponent rcd) + { + foreach (var categoryId in rcd.CategoryPrototypes) + { + if (!_protoManager.TryIndex(categoryId, out var category)) + continue; + + var button = new RadialMenuTextureButton + { + StyleClasses = { "RadialMenuButton" }, + SetSize = new Vector2(64f, 64f), + ToolTip = Loc.GetString(category.TooltipBase + categoryId), // rcd-component- + WindowsAndGrilles = rcd-component-WindowsAndGrilles + TargetLayer = categoryId, + Visible = false, + }; + + var texture = new TextureRect + { + VerticalAlignment = VAlignment.Center, + HorizontalAlignment = HAlignment.Center, + TextureScale = new Vector2(2, 2), + Texture = GetSprite(category.SpritePath) + }; + + button.AddChild(texture); + main.AddChild(button); + + var container = new RadialContainer + { + Name = categoryId, + VerticalExpand = true, + HorizontalExpand = true, + Radius = 64 + }; + + AddChild(container); + } + } + + private Texture GetSprite(SpriteSpecifier specifier) + { + return _spriteSystem.Frame0(specifier); + } + private void AddRCDMenuButtonOnClickActions(Control control) { var radialContainer = control as RadialContainer; @@ -140,11 +184,11 @@ public sealed partial class RCDMenu : RadialMenu if (_playerManager.LocalSession?.AttachedEntity != null && _protoManager.TryIndex(castChild.ProtoId, out var proto)) { - var msg = Loc.GetString("rcd-component-change-mode", ("mode", Loc.GetString(proto.SetName))); + var msg = Loc.GetString("rcd-component-change-mode", ("mode", Loc.GetString(proto.Name))); if (proto.Mode == RcdMode.ConstructTile || proto.Mode == RcdMode.ConstructObject) { - var name = Loc.GetString(proto.SetName); + var name = Loc.GetString(proto.Name); if (proto.Prototype != null && _protoManager.TryIndex(proto.Prototype, out var entProto)) diff --git a/Content.Client/UserInterface/Controls/RadialContainer.cs b/Content.Client/UserInterface/Controls/RadialContainer.cs index be263d1277..25a9a0dbb5 100644 --- a/Content.Client/UserInterface/Controls/RadialContainer.cs +++ b/Content.Client/UserInterface/Controls/RadialContainer.cs @@ -70,9 +70,15 @@ public class RadialContainer : LayoutContainer protected override void Draw(DrawingHandleScreen handle) { + const float baseRadius = 15f; // WD + const float radiusIncrement = 12f; // WD + var children = ReserveSpaceForHiddenChildren ? Children : Children.Where(x => x.Visible); var childCount = children.Count(); + // Add padding from the center at higher child counts so they don't overlap. + Radius = baseRadius + (childCount * radiusIncrement); + // Determine the size of the arc, accounting for clockwise and anti-clockwise arrangements var arc = AngularRange.Y - AngularRange.X; arc = (arc < 0) ? MathF.Tau + arc : arc; diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index 8f5f8804f9..277f351a6f 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -217,7 +217,6 @@ namespace Content.Server.GameTicking var readyPlayers = new List(); var readyPlayerProfiles = new Dictionary(); - var autoDeAdmin = _cfg.GetCVar(CCVars.AdminDeadminOnJoin); var stalinBunkerEnabled = _configurationManager.GetCVar(WhiteCVars.StalinEnabled); foreach (var (userId, status) in _playerGameStatuses) @@ -225,11 +224,17 @@ namespace Content.Server.GameTicking if (LobbyEnabled && status != PlayerGameStatus.ReadyToPlay) continue; if (!_playerManager.TryGetSessionById(userId, out var session)) continue; + #if FULL_RELEASE // dont deadmin me in debug + + var autoDeAdmin = _cfg.GetCVar(CCVars.AdminDeadminOnJoin); + if (autoDeAdmin && _adminManager.IsAdmin(session)) { _adminManager.DeAdmin(session); } + #endif + if (stalinBunkerEnabled) { await _stalinManager.RefreshUsersData(); diff --git a/Content.Server/_White/Mood/MoodComponent.cs b/Content.Server/_White/Mood/MoodComponent.cs index d5db126d9c..6836739799 100644 --- a/Content.Server/_White/Mood/MoodComponent.cs +++ b/Content.Server/_White/Mood/MoodComponent.cs @@ -8,13 +8,13 @@ namespace Content.Server._White.Mood; [RegisterComponent] public sealed partial class MoodComponent : Component { - [DataField("currentMoodLevel"), ViewVariables(VVAccess.ReadOnly)] + [DataField, ViewVariables(VVAccess.ReadOnly)] public float CurrentMoodLevel; - [DataField("currentMoodThreshold"), ViewVariables(VVAccess.ReadOnly)] + [DataField, ViewVariables(VVAccess.ReadOnly)] public MoodThreshold CurrentMoodThreshold; - [DataField("lastThreshold"), ViewVariables(VVAccess.ReadOnly)] + [DataField, ViewVariables(VVAccess.ReadOnly)] public MoodThreshold LastThreshold; [ViewVariables(VVAccess.ReadOnly)] @@ -23,22 +23,22 @@ public sealed partial class MoodComponent : Component [ViewVariables(VVAccess.ReadOnly)] public readonly Dictionary UncategorisedEffects = new(); - [DataField("slowdownSpeedModifier"), ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite)] public float SlowdownSpeedModifier = 0.75f; - [DataField("increaseSpeedModifier"), ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite)] public float IncreaseSpeedModifier = 1.15f; - [DataField("increaseCritThreshold"), ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite)] public float IncreaseCritThreshold = 1.2f; - [DataField("decreaseCritThreshold"), ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite)] public float DecreaseCritThreshold = 0.9f; [ViewVariables(VVAccess.ReadOnly)] public FixedPoint2 CritThresholdBeforeModify; - [DataField("moodThresholds", customTypeSerializer: typeof(DictionarySerializer))] + [DataField(customTypeSerializer: typeof(DictionarySerializer))] public Dictionary MoodThresholds = new() { { MoodThreshold.VeryVeryGood, 10.0f }, @@ -53,7 +53,7 @@ public sealed partial class MoodComponent : Component { MoodThreshold.Dead, 0.0f } }; - [DataField("moodThresholdsAlerts", customTypeSerializer: typeof(DictionarySerializer))] + [DataField(customTypeSerializer: typeof(DictionarySerializer))] public Dictionary MoodThresholdsAlerts = new() { { MoodThreshold.Dead, AlertType.MoodDead }, @@ -69,7 +69,7 @@ public sealed partial class MoodComponent : Component { MoodThreshold.Insane, AlertType.Insane } }; - [DataField("moodChangeValues", customTypeSerializer: typeof(DictionarySerializer))] + [DataField(customTypeSerializer: typeof(DictionarySerializer))] public Dictionary MoodChangeValues = new() { { MoodChangeLevel.None , 0.0f }, @@ -80,7 +80,7 @@ public sealed partial class MoodComponent : Component { MoodChangeLevel.Large , 2f } }; - [DataField("healthMoodEffectsThresholds", customTypeSerializer: typeof(DictionarySerializer))] + [DataField(customTypeSerializer: typeof(DictionarySerializer))] public Dictionary HealthMoodEffectsThresholds = new() { { "HealthHeavyDamage", 80f }, diff --git a/Content.Server/_White/Mood/MoodSystem.cs b/Content.Server/_White/Mood/MoodSystem.cs index 1beab5742c..55124cdc75 100644 --- a/Content.Server/_White/Mood/MoodSystem.cs +++ b/Content.Server/_White/Mood/MoodSystem.cs @@ -108,8 +108,8 @@ public sealed class MoodSystem : EntitySystem if (!component.MoodChangeValues.TryGetValue(oldPrototype.MoodChange, out var oldValue)) return; - amount += (oldPrototype.PositiveEffect ? -oldValue : oldValue) + - (prototype.PositiveEffect ? value : -value); + amount += (oldPrototype.Positive ? -oldValue : oldValue) + + (prototype.Positive ? value : -value); component.CategorisedEffects[prototype.Category] = prototype.ID; } @@ -117,7 +117,7 @@ public sealed class MoodSystem : EntitySystem else { component.CategorisedEffects.Add(prototype.Category, prototype.ID); - amount += prototype.PositiveEffect ? value : -value; + amount += prototype.Positive ? value : -value; } if (prototype.Timeout != 0) @@ -132,7 +132,7 @@ public sealed class MoodSystem : EntitySystem if (component.UncategorisedEffects.TryGetValue(prototype.ID, out _)) return; - var effectValue = prototype.PositiveEffect ? value : -value; + var effectValue = prototype.Positive ? value : -value; component.UncategorisedEffects.Add(prototype.ID, effectValue); amount += effectValue; @@ -173,7 +173,7 @@ public sealed class MoodSystem : EntitySystem if (!comp.MoodChangeValues.TryGetValue(currentProto.MoodChange, out var value)) return; - amount += currentProto.PositiveEffect ? -value : value; + amount += currentProto.Positive ? -value : value; comp.CategorisedEffects.Remove(category); } @@ -205,7 +205,7 @@ public sealed class MoodSystem : EntitySystem if (!component.MoodChangeValues.TryGetValue(prototype.MoodChange, out var value)) return; - amount += prototype.PositiveEffect ? value : -value; + amount += prototype.Positive ? value : -value; } foreach (var (_, value) in component.UncategorisedEffects) @@ -438,7 +438,7 @@ public sealed partial class ShowMoodEffects : IAlertClick { var chatManager = IoCManager.Resolve(); - var color = proto.PositiveEffect ? "#008000" : "#BA0000"; + var color = proto.Positive ? "#008000" : "#BA0000"; var msg = $"[font size=10][color={color}]{proto.Description}[/color][/font]"; chatManager.ChatMessageToOne(ChatChannel.Emotes, msg, msg, EntityUid.Invalid, false, diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index e4a3ff0cfe..e80c083e60 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -838,7 +838,7 @@ namespace Content.Shared.CCVar /// de-admin them. /// public static readonly CVarDef AdminDeadminOnJoin = - CVarDef.Create("admin.deadmin_on_join", false, CVar.SERVERONLY); + CVarDef.Create("admin.deadmin_on_join", true, CVar.SERVERONLY); /// /// Overrides the name the client sees in ahelps. Set empty to disable. @@ -851,7 +851,7 @@ namespace Content.Shared.CCVar /// If 0, appearing as a new player is disabled. /// public static readonly CVarDef NewPlayerThreshold = - CVarDef.Create("admin.new_player_threshold", 0, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); + CVarDef.Create("admin.new_player_threshold", 4320, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); /// /// How long an admin client can go without any input before being considered AFK. @@ -1346,7 +1346,7 @@ namespace Content.Shared.CCVar /// /// Config for when the restart vote should be allowed to be called based on percentage of ghosts. - /// + /// public static readonly CVarDef VoteRestartGhostPercentage = CVarDef.Create("vote.restart_ghost_percentage", 75, CVar.SERVERONLY); @@ -1441,7 +1441,7 @@ namespace Content.Shared.CCVar /// Whether the arrivals terminal should be on a planet map. /// public static readonly CVarDef ArrivalsPlanet = - CVarDef.Create("shuttle.arrivals_planet", true, CVar.SERVERONLY); + CVarDef.Create("shuttle.arrivals_planet", false, CVar.SERVERONLY); /// /// Whether the arrivals shuttle is enabled. @@ -1459,7 +1459,7 @@ namespace Content.Shared.CCVar /// Cooldown between arrivals departures. This should be longer than the FTL time or it will double cycle. /// public static readonly CVarDef ArrivalsCooldown = - CVarDef.Create("shuttle.arrivals_cooldown", 50f, CVar.SERVERONLY); + CVarDef.Create("shuttle.arrivals_cooldown", 10f, CVar.SERVERONLY); /// /// Are players allowed to return on the arrivals shuttle. diff --git a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs index cd47e5dbac..a31eb2b805 100644 --- a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs @@ -114,7 +114,7 @@ public sealed class HungerSystem : EntitySystem return; //WD start - if (_net.IsServer) + if (_net.IsServer && component.CurrentThreshold != HungerThreshold.Overfed) { var ev = new MoodEffectEvent("Hunger" + component.CurrentThreshold); RaiseLocalEvent(uid, ev); diff --git a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs index 36a8391000..d3ebec8b59 100644 --- a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs @@ -112,10 +112,13 @@ public sealed class ThirstSystem : EntitySystem _alerts.ClearAlertCategory(uid, AlertCategory.Thirst); } - //WD start - var ev = new MoodEffectEvent("Thirst" + component.CurrentThirstThreshold); - RaiseLocalEvent(uid, ev); - //WD end + // WD start + if (component.CurrentThirstThreshold != ThirstThreshold.OverHydrated) + { + var ev = new MoodEffectEvent("Thirst" + component.CurrentThirstThreshold); + RaiseLocalEvent(uid, ev); + } + // WD end switch (component.CurrentThirstThreshold) { diff --git a/Content.Shared/RCD/Components/RCDAmmoComponent.cs b/Content.Shared/RCD/Components/RCDAmmoComponent.cs index 4135b606e2..2f6ecfd0fd 100644 --- a/Content.Shared/RCD/Components/RCDAmmoComponent.cs +++ b/Content.Shared/RCD/Components/RCDAmmoComponent.cs @@ -13,4 +13,8 @@ public sealed partial class RCDAmmoComponent : Component /// [DataField("charges"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public int Charges = 30; + + [DataField] public bool CanBeExamined = true; // WD + + [DataField] public float ChargeCountModifier = 1; // WD } diff --git a/Content.Shared/RCD/Components/RCDComponent.cs b/Content.Shared/RCD/Components/RCDComponent.cs index 39bb6fd3e9..05e31dbd20 100644 --- a/Content.Shared/RCD/Components/RCDComponent.cs +++ b/Content.Shared/RCD/Components/RCDComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared._White.RCD; using Content.Shared.RCD.Systems; using Robust.Shared.Audio; using Robust.Shared.GameStates; @@ -33,6 +34,12 @@ public sealed partial class RCDComponent : Component [DataField, AutoNetworkedField] public ProtoId ProtoId { get; set; } = "Invalid"; + /// + /// The ProtoId of the currently selected RCD prototype + /// + [DataField(required: true), AutoNetworkedField] + public HashSet> CategoryPrototypes = default!; + /// /// A cached copy of currently selected RCD prototype /// diff --git a/Content.Shared/RCD/RCDPrototype.cs b/Content.Shared/RCD/RCDPrototype.cs index 1e80abfb72..e396dff109 100644 --- a/Content.Shared/RCD/RCDPrototype.cs +++ b/Content.Shared/RCD/RCDPrototype.cs @@ -1,3 +1,4 @@ +using Content.Shared._White.RCD; using Content.Shared.Physics; using Robust.Shared.Physics.Collision.Shapes; using Robust.Shared.Prototypes; @@ -23,14 +24,14 @@ public sealed class RCDPrototype : IPrototype /// /// The name associated with the prototype /// - [DataField("name"), ViewVariables(VVAccess.ReadOnly)] - public string SetName { get; private set; } = "Unknown"; + [DataField, ViewVariables(VVAccess.ReadOnly)] + public string Name { get; private set; } = "Unknown"; /// /// The name of the radial container that this prototype will be listed under on the RCD menu /// [DataField, ViewVariables(VVAccess.ReadOnly)] - public string Category { get; private set; } = "Undefined"; + public ProtoId Category { get; private set; } = "WallsAndFlooring"; // WD /// /// Texture path for this prototypes menu icon @@ -42,7 +43,7 @@ public sealed class RCDPrototype : IPrototype /// The entity prototype that will be constructed (mode dependent) /// [DataField, ViewVariables(VVAccess.ReadOnly)] - public string? Prototype { get; private set; } = string.Empty; + public ProtoId? Prototype { get; private set; } = null; /// /// Number of charges consumed when the operation is completed @@ -51,7 +52,7 @@ public sealed class RCDPrototype : IPrototype public int Cost { get; private set; } = 1; /// - /// The length of the operation + /// The length of the operation /// [DataField, ViewVariables(VVAccess.ReadOnly)] public float Delay { get; private set; } = 1f; @@ -75,7 +76,7 @@ public sealed class RCDPrototype : IPrototype public CollisionGroup CollisionMask { get; private set; } = CollisionGroup.None; /// - /// Specifies a set of custom collision bounds for determining whether the entity prototype will fit into a target tile + /// Specifies a set of custom collision bounds for determining whether the entity prototype will fit into a target tile /// /// /// Should be set assuming that the entity faces south. @@ -106,7 +107,7 @@ public sealed class RCDPrototype : IPrototype private Box2? _collisionBounds = null; /// - /// The polygon shape associated with the prototype CollisionBounds (if set) + /// The polygon shape associated with the prototype CollisionBounds (if set) /// [ViewVariables(VVAccess.ReadOnly)] public PolygonShape? CollisionPolygon { get; private set; } = null; diff --git a/Content.Shared/RCD/Systems/RCDAmmoSystem.cs b/Content.Shared/RCD/Systems/RCDAmmoSystem.cs index 9cb3c26485..d814a6543d 100644 --- a/Content.Shared/RCD/Systems/RCDAmmoSystem.cs +++ b/Content.Shared/RCD/Systems/RCDAmmoSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.Popups; using Content.Shared.RCD.Components; +using Content.Shared.Stacks; using Robust.Shared.Timing; namespace Content.Shared.RCD.Systems; @@ -13,20 +14,37 @@ public sealed class RCDAmmoSystem : EntitySystem [Dependency] private readonly SharedChargesSystem _charges = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedStackSystem _stack = default!; public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnInit); // WD edit + SubscribeLocalEvent(OnExamine); SubscribeLocalEvent(OnAfterInteract); } + // WD edit start + private void OnInit(EntityUid uid, RCDAmmoComponent rcdAmmoComponent, ComponentInit _) + { + if (TryComp(uid, out var stackComponent)) + rcdAmmoComponent.Charges = (int) (stackComponent.Count * rcdAmmoComponent.ChargeCountModifier); + else + rcdAmmoComponent.Charges = (int) (rcdAmmoComponent.Charges * rcdAmmoComponent.ChargeCountModifier); + + } + // WD edit end + private void OnExamine(EntityUid uid, RCDAmmoComponent comp, ExaminedEvent args) { if (!args.IsInDetailsRange) return; + if (!comp.CanBeExamined) // WD edit + return; + var examineMessage = Loc.GetString("rcd-ammo-component-on-examine", ("charges", comp.Charges)); args.PushText(examineMessage); } @@ -51,6 +69,15 @@ public sealed class RCDAmmoSystem : EntitySystem } _popup.PopupClient(Loc.GetString("rcd-ammo-component-after-interact-refilled"), target, user); + + // WD edit start + if (TryComp(uid, out var stackComponent)) + { + var spent = (int) (count / comp.ChargeCountModifier) == 0 ? 1 : (int) (count / comp.ChargeCountModifier); + _stack.SetCount(uid, stackComponent.Count - spent); + } + // WD edit end + _charges.AddCharges(target, count, charges); comp.Charges -= count; Dirty(uid, comp); diff --git a/Content.Shared/RCD/Systems/RCDSystem.cs b/Content.Shared/RCD/Systems/RCDSystem.cs index 974755f000..df1290d100 100644 --- a/Content.Shared/RCD/Systems/RCDSystem.cs +++ b/Content.Shared/RCD/Systems/RCDSystem.cs @@ -25,6 +25,7 @@ using Robust.Shared.Serialization; using Robust.Shared.Timing; using System.Diagnostics.CodeAnalysis; using System.Linq; +using Content.Shared._White.ClothingGrant.Systems; namespace Content.Shared.RCD.Systems; @@ -75,7 +76,7 @@ public class RCDSystem : EntitySystem if (component.AvailablePrototypes.Any()) { component.ProtoId = component.AvailablePrototypes.First(); - UpdateCachedPrototype(uid, component); + UpdateCachedPrototype(component); Dirty(uid, component); return; @@ -96,7 +97,7 @@ public class RCDSystem : EntitySystem // Set the current RCD prototype to the one supplied component.ProtoId = args.ProtoId; - UpdateCachedPrototype(uid, component); + UpdateCachedPrototype(component); Dirty(uid, component); } @@ -106,13 +107,14 @@ public class RCDSystem : EntitySystem return; // Update cached prototype if required - UpdateCachedPrototype(uid, component); + UpdateCachedPrototype(component); - var msg = Loc.GetString("rcd-component-examine-mode-details", ("mode", Loc.GetString(component.CachedPrototype.SetName))); + var msg = Loc.GetString("rcd-component-examine-mode-details", ("mode", Loc.GetString(component.CachedPrototype.Name))); - if (component.CachedPrototype.Mode == RcdMode.ConstructTile || component.CachedPrototype.Mode == RcdMode.ConstructObject) + var mode = component.CachedPrototype.Mode; + if (mode == RcdMode.ConstructTile || mode == RcdMode.ConstructObject) { - var name = Loc.GetString(component.CachedPrototype.SetName); + var name = Loc.GetString(component.CachedPrototype.Name); if (component.CachedPrototype.Prototype != null && _protoManager.TryIndex(component.CachedPrototype.Prototype, out var proto)) @@ -225,7 +227,7 @@ public class RCDSystem : EntitySystem private void OnDoAfterAttempt(EntityUid uid, RCDComponent component, DoAfterAttemptEvent args) { - if (args.Event?.DoAfter?.Args == null) + if (args.Event?.DoAfter?.Args == null) // wtf if this return; // Exit if the RCD prototype has changed @@ -302,7 +304,7 @@ public class RCDSystem : EntitySystem public bool IsRCDOperationStillValid(EntityUid uid, RCDComponent component, MapGridData mapGridData, EntityUid? target, EntityUid user, bool popMsgs = true) { // Update cached prototype if required - UpdateCachedPrototype(uid, component); + UpdateCachedPrototype(component); // Check that the RCD has enough ammo to get the job done TryComp(uid, out var charges); @@ -589,7 +591,7 @@ public class RCDSystem : EntitySystem return boundingPolygon.ComputeAABB(boundingTransform, 0).Intersects(fixture.Shape.ComputeAABB(entXform, 0)); } - public void UpdateCachedPrototype(EntityUid uid, RCDComponent component) + public void UpdateCachedPrototype(RCDComponent component) { if (component.ProtoId.Id != component.CachedPrototype?.Prototype) component.CachedPrototype = _protoManager.Index(component.ProtoId); diff --git a/Content.Shared/_White/ClothingGrant/Systems/ClothingGrantingSystem.cs b/Content.Shared/_White/ClothingGrant/Systems/ClothingGrantingSystem.cs index bd67e508e6..d3c669c017 100644 --- a/Content.Shared/_White/ClothingGrant/Systems/ClothingGrantingSystem.cs +++ b/Content.Shared/_White/ClothingGrant/Systems/ClothingGrantingSystem.cs @@ -3,6 +3,7 @@ using Content.Shared.Inventory.Events; using Robust.Shared.Serialization.Manager; using Content.Shared.Tag; using Content.Shared._White.ClothingGrant.Components; +using Robust.Shared.Prototypes; using Robust.Shared.Timing; namespace Content.Shared._White.ClothingGrant.Systems; @@ -40,24 +41,29 @@ public sealed class ClothingGrantingSystem : EntitySystem return; } - foreach (var (name, data) in component.Components) - { - var newComp = (Component) _componentFactory.GetComponent(name); - - if (HasComp(args.Equipee, newComp.GetType())) - continue; - - newComp.Owner = args.Equipee; - - var temp = (object) newComp; - _serializationManager.CopyTo(data.Component, ref temp); - EntityManager.AddComponent(args.Equipee, (Component)temp!); - } + AddComponents(args.Equipee, component.Components); component.IsActive = true; Dirty(uid, component); } + public void AddComponents(EntityUid uid, ComponentRegistry components) + { + foreach (var (name, data) in components) + { + var newComp = (Component) _componentFactory.GetComponent(name); + + if (HasComp(uid, newComp.GetType())) + continue; + + newComp.Owner = uid; + + var temp = (object) newComp; + _serializationManager.CopyTo(data.Component, ref temp); + EntityManager.AddComponent(uid, (Component)temp!); + } + } + private void OnCompUnequip(EntityUid uid, ClothingGrantComponentComponent component, GotUnequippedEvent args) { if (!component.IsActive) return; diff --git a/Content.Shared/_White/Mood/MoodEffectPrototype.cs b/Content.Shared/_White/Mood/MoodEffectPrototype.cs index 03a005f188..0f1e57eafe 100644 --- a/Content.Shared/_White/Mood/MoodEffectPrototype.cs +++ b/Content.Shared/_White/Mood/MoodEffectPrototype.cs @@ -3,29 +3,25 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations; namespace Content.Shared._White.Mood; -[Prototype("moodEffect")] +[Prototype] public sealed class MoodEffectPrototype : IPrototype { [ViewVariables] [IdDataField] public string ID { get; } = default!; - [DataField("desc", required: true)] + [DataField(required: true)] public string Description = string.Empty; - [DataField("moodChange", customTypeSerializer: typeof(EnumSerializer), required: true)] + [DataField(customTypeSerializer: typeof(EnumSerializer), required: true)] public Enum MoodChange = default!; - [DataField("positiveEffect", required: true)] - public bool PositiveEffect; + [DataField] public bool Positive; - [DataField("timeout")] - public int Timeout; + [DataField] public int Timeout; - [DataField("hidden")] - public bool Hidden; + [DataField] public bool Hidden; - //If mob already has effect of the same category, the new one will replace the old one. - [DataField("category")] - public string? Category; + // If mob already has effect of the same category, the new one will replace the old one. + [DataField] public string? Category; } diff --git a/Content.Shared/_White/RCD/RCDCategoryPrototype.cs b/Content.Shared/_White/RCD/RCDCategoryPrototype.cs new file mode 100644 index 0000000000..61ef3d54e2 --- /dev/null +++ b/Content.Shared/_White/RCD/RCDCategoryPrototype.cs @@ -0,0 +1,17 @@ +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Shared._White.RCD; + +[Prototype("rcdCategory")] +public sealed class RCDCategoryPrototype : IPrototype +{ + [IdDataField] + public string ID { get; private set; } = default!; + + [DataField] + public string TooltipBase = "rcd-category-"; + + [DataField(required: true)] + public SpriteSpecifier SpritePath = default!; +} diff --git a/Resources/Locale/ru-RU/rcd/components/rcd-component.ftl b/Resources/Locale/ru-RU/rcd/components/rcd-component.ftl index f15eae7e85..b5cdb6ec78 100644 --- a/Resources/Locale/ru-RU/rcd/components/rcd-component.ftl +++ b/Resources/Locale/ru-RU/rcd/components/rcd-component.ftl @@ -1,30 +1,59 @@ -### UI +# WD EDIT ALL -# Shown when an RCD is examined in details range -rcd-component-examine-detail = В данный момент выбран режим { $mode }. -# Shown when an RCD is examined in details range -rcd-component-examine-detail-count = - Находится в режиме { $mode -> - *[other] _ - [floors] полы - [walls] стены - [airlock] шлюзы - [deconstruct] разбор - }, и { $ammoCount -> - *[zero] не содержит зарядов. - [one] содержит 1 заряд. - [few] содержит { $ammoCount } заряда. - [other] содержит { $ammoCount } зарядов. - } +# UI -### Interaction Messages +rcd-component-examine-mode-details = Текущий режим: '{$mode}'. +rcd-component-examine-build-details = Текущий режим строительства: {$name}. -# Shown when changing RCD Mode -rcd-component-change-mode = РЦД переключён в режим { $mode }. + +## Interaction Messages + +# Mode change +rcd-component-change-mode = РЦД переключён в режим '{$mode}'. +rcd-component-change-build-mode = РЦД переключён в режим строительства {$name}. + +# Ammo count rcd-component-no-ammo-message = В РЦД закончились заряды! -rcd-component-tile-indestructible-message = Эта плитка не может быть уничтожена! -rcd-component-tile-obstructed-message = Этот тайл заблокирован! -rcd-component-deconstruct-target-not-on-whitelist-message = Вы не можете это деконструировать! -rcd-component-cannot-build-floor-tile-not-empty-message = Пол можно построить только в космосе или на покрытии! -rcd-component-cannot-build-wall-tile-not-empty-message = Вы не можете построить стену в космосе! -rcd-component-cannot-build-airlock-tile-not-empty-message = Вы не можете построить шлюз в космосе! +rcd-component-insufficient-ammo-message = В РЦД недостаточно зарядов! + +# Deconstruction +rcd-component-tile-indestructible-message = Эта плитка неразрушима! +rcd-component-deconstruct-target-not-on-whitelist-message = Вы не можете это демонтировать! +rcd-component-nothing-to-deconstruct-message = Здесь нечего демонтировать! +rcd-component-tile-obstructed-message = Вы не можете демонтировать плитку, если на ней что-то есть! + +# Construction +rcd-component-no-valid-grid = Вы слишком далеко в открытом космосе, чтобы строить здесь! +rcd-component-must-build-on-empty-tile-message = Здесь уже есть фундамент! +rcd-component-cannot-build-on-empty-tile-message = Вы не можете строить это без фундамента! +rcd-component-must-build-on-subfloor-message = Вы можете строить это только на открытом полу! +rcd-component-cannot-build-on-subfloor-message = Вы не можете строить это на открытом полу! +rcd-component-cannot-build-on-occupied-tile-message = Вы не можете строить здесь, это место уже занято! +rcd-component-cannot-build-identical-tile = Эта плитка уже существует! + + +### Category names + +# RCD +rcd-category-WallsAndFlooring = Стены и пол +rcd-category-WindowsAndGrilles = Окна и решётки +rcd-category-Airlocks = Шлюзы +rcd-category-Electrical = Электрика +rcd-category-Lighting = Освещение + +# RPD +rcd-category-Pipes = Трубы +rcd-category-GasDevices = Атмосферные приборы +rcd-category-DisposalPipes = Мусорные трубы +rcd-category-DisposalUnits = Мусорные приборы + +### Prototype names (note: constructable items will be puralized) + +rcd-component-deconstruct = демонтаж +rcd-component-floor-steel = стальная плитка +rcd-component-plating = лист обшивки + +# RPD naming + +ent-RapidPipeDispenser = РПД + .desc = Новейшее ручное строительное устройство, которое может быстро размещать трубы и атмосферные приборы. diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml index b0f918a508..da190df84a 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml @@ -92,6 +92,7 @@ - id: ClothingEyesGlassesMeson - id: ClothingShoesBootsMag - id: ClothingHandsGlovesColorYellow + - id: RapidPipeDispenser # WD - type: entity id: LockerAtmosphericsFilled @@ -111,6 +112,7 @@ - id: ClothingEyesGlassesMeson - id: ClothingShoesBootsMag - id: ClothingHandsGlovesColorYellow + - id: RapidPipeDispenser # WD - type: entity id: LockerEngineerFilledHardsuit diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml index 876150fe6f..7ff1f531a1 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml @@ -152,6 +152,7 @@ - id: ClothingOuterHardsuitEngineeringWhite - id: ClothingMaskBreath - id: OxygenTankFilled + - id: RapidPipeDispenser # WD - type: entity id: LockerChiefEngineerFilled @@ -169,6 +170,7 @@ - id: RCDAmmo amount: 2 - id: HolofanProjector + - id: RapidPipeDispenser # WD - type: entity id: LockerChiefMedicalOfficerFilledHardsuit diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml index a90485b074..fc102d0765 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/engivend.yml @@ -12,6 +12,5 @@ GeigerCounter: 3 InflatableWallStack1: 24 InflatableDoorStack1: 8 - emaggedInventory: - RCD: 1 - RCDAmmo: 3 + RCD: 3 # WD + RCDAmmo: 3 # WD diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml index 1bc4e1b0d7..efe5a9edb8 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml @@ -86,6 +86,8 @@ reagents: - ReagentId: Silicon Quantity: 10 + - type: RCDAmmo # WD + canBeExamined: false - type: entity parent: SheetGlass @@ -172,6 +174,9 @@ max: 1 - !type:DoActsBehavior acts: [ "Destruction" ] + - type: RCDAmmo # WD + canBeExamined: false + chargeCountModifier: 2 - type: entity parent: SheetRGlass @@ -249,6 +254,9 @@ max: 1 - !type:DoActsBehavior acts: [ "Destruction" ] + - type: RCDAmmo # WD + canBeExamined: false + chargeCountModifier: 2 - type: entity parent: SheetPGlass @@ -315,6 +323,9 @@ - ReagentId: Carbon Quantity: 0.5 canReact: false + - type: RCDAmmo # WD + canBeExamined: false + chargeCountModifier: 3 - type: entity parent: SheetRPGlass diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml index 3a7b35f1cf..66cb2a76a3 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml @@ -70,6 +70,8 @@ Quantity: 9 - ReagentId: Carbon Quantity: 1 + - type: RCDAmmo # WD + canBeExamined: false - type: entity parent: SheetSteel @@ -206,6 +208,9 @@ - ReagentId: Carbon Quantity: 1 canReact: false + - type: RCDAmmo # WD + canBeExamined: false + chargeCountModifier: 2 - type: entity parent: SheetPlasteel diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml index 18590e98df..0f8aedfb36 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml @@ -164,6 +164,9 @@ - ReagentId: Phosphorus Quantity: 5 canReact: false + - type: RCDAmmo # WD + canBeExamined: false + chargeCountModifier: 0.5 - type: entity parent: SheetPlastic diff --git a/Resources/Prototypes/Entities/Objects/Materials/parts.yml b/Resources/Prototypes/Entities/Objects/Materials/parts.yml index 652ddcd917..ca4d300efd 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/parts.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/parts.yml @@ -74,6 +74,9 @@ Quantity: 4.5 - ReagentId: Carbon Quantity: 0.5 + - type: RCDAmmo # WD + canBeExamined: false + chargeCountModifier: 0.5 - type: entity parent: PartRodMetal diff --git a/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml b/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml index 17d1794c17..f7d39f19fd 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/cable_coils.yml @@ -27,6 +27,9 @@ price: 0 - type: StackPrice price: 1 + - type: RCDAmmo # WD + canBeExamined: false + chargeCountModifier: 0.2 - type: entity id: CableHVStack diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml index 3d8754d226..640a5e435e 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -395,32 +395,11 @@ path: "/Audio/Items/drill_hit.ogg" - type: entity - id: RCD + id: BaseRCD parent: BaseItem name: RCD description: The rapid construction device can be used to quickly place and remove various station structures and fixtures. Requires compressed matter to function. components: - - type: RCD - availablePrototypes: - - WallSolid - - FloorSteel - - Plating - - Catwalk - - Grille - - Window - - WindowDirectional - - WindowReinforcedDirectional - - ReinforcedWindow - - Airlock - - AirlockGlass - - Firelock - - TubeLight - - BulbLight - - LVCable - - MVCable - - HVCable - - CableTerminal - - Deconstruct - type: LimitedCharges maxCharges: 30 charges: 30 @@ -449,13 +428,18 @@ key: enum.RcdUiKey.Key - type: entity - id: RCDEmpty - parent: RCD - suffix: Empty + id: RCD + parent: BaseRCD + name: RCD + description: The rapid construction device can be used to quickly place and remove various station structures and fixtures. Requires compressed matter to function. components: - - type: LimitedCharges - charges: 0 - type: RCD + categoryPrototypes: # WD + - WallsAndFlooring # WD + - WindowsAndGrilles # WD + - Airlocks # WD + - Electrical # WD + - Lighting # WD availablePrototypes: - WallSolid - FloorSteel @@ -469,6 +453,76 @@ - Airlock - AirlockGlass - Firelock + - TubeLight + - BulbLight + - LVCable + - MVCable + - HVCable + - CableTerminal + - APC # WD + - Camera # WD + - Deconstruct + +- type: entity + id: RCDEmpty + parent: RCD + suffix: Empty + components: + - type: LimitedCharges + charges: 0 + +- type: entity # WD + id: RapidPipeDispenser + parent: BaseRCD + components: + - type: Sprite + sprite: White/Items/Tools/rpd.rsi + - type: Item + size: Normal + shape: + - 0, 0, 1, 0 + - type: Clothing + sprite: White/Items/Tools/rpd.rsi + quickEquip: false + slots: + - Belt + - type: RCD + categoryPrototypes: + - Pipes + - GasDevices + - DisposalPipes + - DisposalUnits + availablePrototypes: + - PipeStraight # pipes + - PipeBend + - PipeTJunction + - PipeFourway + - GasCanisterPort # gas devices + - GasFilter + - GasMixer + - GasOutletInjector + - GasPressurePump + - GasVolumePump + - GasValve + - SignalControlledValve + - PressureControlledValve + - GasVentScrubber + - GasVentPump + - GasPassiveVent + - DisposalPipe # disposal pipes + - DisposalBend + - DisposalJunction + - DisposalJunctionFlipped + - DisposalYJunction + - DisposalRouter + - DisposalRouterFlipped + - DisposalTagger + - DisposalSignalRouter + - DisposalSignalRouterFlipped + - DisposalTrunk + - DisposalUnit # disposal units + - MailingUnit + - ToiletEmpty - type: entity id: RCDRecharging @@ -500,6 +554,7 @@ description: A cartridge of raw matter compacted by bluespace technology. Used in rapid construction devices. components: - type: RCDAmmo + chargeCountModifier: 1.5 - type: Sprite sprite: Objects/Tools/rcd.rsi state: ammo diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 884e351494..93c05506a8 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -348,6 +348,8 @@ - KitchenKnife # WD EDIT - ButchCleaver # WD EDIT - WeaponTempGun # WD EDIT + - RapidPipeDispenserRecipe # WD edit + - RCDRecipe # WD edit - DeviceQuantumSpinInverter - type: EmagLatheRecipes emagDynamicRecipes: diff --git a/Resources/Prototypes/RCD/rcd.yml b/Resources/Prototypes/RCD/rcd.yml index 500b5f59bf..1101233cb6 100644 --- a/Resources/Prototypes/RCD/rcd.yml +++ b/Resources/Prototypes/RCD/rcd.yml @@ -2,7 +2,7 @@ - type: rcd id: Invalid # Hidden prototype - do not add to RCDs mode: Invalid - + - type: rcd id: Deconstruct name: rcd-component-deconstruct @@ -13,14 +13,14 @@ rotation: Camera - type: rcd - id: DeconstructLattice # Hidden prototype - do not add to RCDs + id: DeconstructLattice # Hidden prototype - do not add to RCDs name: rcd-component-deconstruct mode: Deconstruct cost: 2 delay: 0 rotation: Camera fx: EffectRCDConstruct0 - + - type: rcd id: DeconstructTile # Hidden prototype - do not add to RCDs name: rcd-component-deconstruct @@ -30,7 +30,7 @@ rotation: Camera fx: EffectRCDDeconstruct4 -# Flooring +# Flooring - type: rcd id: Plating name: rcd-component-plating @@ -39,12 +39,12 @@ mode: ConstructTile prototype: Plating cost: 1 - delay: 1 + delay: 0 collisionMask: InteractImpassable rules: - CanBuildOnEmptyTile - fx: EffectRCDConstruct1 - + fx: EffectRCDConstruct0 + - type: rcd id: FloorSteel name: rcd-component-floor-steel @@ -53,11 +53,11 @@ mode: ConstructTile prototype: FloorSteel cost: 1 - delay: 1 + delay: 0 collisionMask: InteractImpassable rules: - CanBuildOnEmptyTile - fx: EffectRCDConstruct1 + fx: EffectRCDConstruct0 - type: rcd id: Catwalk @@ -66,13 +66,13 @@ mode: ConstructObject prototype: Catwalk cost: 1 - delay: 1 + delay: 0 collisionMask: InteractImpassable rules: - MustBuildOnSubfloor - IsCatwalk rotation: Fixed - fx: EffectRCDConstruct1 + fx: EffectRCDConstruct0 # Walls - type: rcd @@ -80,7 +80,7 @@ category: WallsAndFlooring sprite: /Textures/Interface/Radial/RCD/solid_wall.png mode: ConstructObject - prototype: WallSolid + prototype: WallSolid cost: 4 delay: 2 collisionMask: FullTileMask @@ -93,11 +93,11 @@ sprite: /Textures/Interface/Radial/RCD/grille.png mode: ConstructObject prototype: Grille - cost: 4 - delay: 2 + cost: 1 + delay: 1 collisionMask: FullTileMask rotation: Fixed - fx: EffectRCDConstruct2 + fx: EffectRCDConstruct1 # Windows - type: rcd @@ -106,20 +106,49 @@ sprite: /Textures/Interface/Radial/RCD/window.png mode: ConstructObject prototype: Window - cost: 3 - delay: 2 + cost: 2 + delay: 1 collisionMask: FullTileMask rules: - IsWindow rotation: Fixed - fx: EffectRCDConstruct2 - + fx: EffectRCDConstruct1 + - type: rcd id: WindowDirectional category: WindowsAndGrilles sprite: /Textures/Interface/Radial/RCD/directional.png mode: ConstructObject prototype: WindowDirectional + cost: 1 + delay: 1 + collisionMask: FullTileMask + collisionBounds: "-0.23,-0.49,0.23,-0.36" + rules: + - IsWindow + rotation: User + fx: EffectRCDConstruct1 + +- type: rcd + id: ReinforcedWindow + category: WindowsAndGrilles + sprite: /Textures/Interface/Radial/RCD/window_reinforced.png + mode: ConstructObject + prototype: ReinforcedWindow + cost: 4 + delay: 2 + collisionMask: FullTileMask + rules: + - IsWindow + rotation: User + fx: EffectRCDConstruct2 + +- type: rcd + id: WindowReinforcedDirectional + category: WindowsAndGrilles + sprite: /Textures/Interface/Radial/RCD/directional_reinforced.png + mode: ConstructObject + prototype: WindowReinforcedDirectional cost: 2 delay: 1 collisionMask: FullTileMask @@ -128,35 +157,6 @@ - IsWindow rotation: User fx: EffectRCDConstruct1 - -- type: rcd - id: ReinforcedWindow - category: WindowsAndGrilles - sprite: /Textures/Interface/Radial/RCD/window_reinforced.png - mode: ConstructObject - prototype: ReinforcedWindow - cost: 4 - delay: 3 - collisionMask: FullTileMask - rules: - - IsWindow - rotation: User - fx: EffectRCDConstruct3 - -- type: rcd - id: WindowReinforcedDirectional - category: WindowsAndGrilles - sprite: /Textures/Interface/Radial/RCD/directional_reinforced.png - mode: ConstructObject - prototype: WindowReinforcedDirectional - cost: 3 - delay: 2 - collisionMask: FullTileMask - collisionBounds: "-0.23,-0.49,0.23,-0.36" - rules: - - IsWindow - rotation: User - fx: EffectRCDConstruct2 # Airlocks - type: rcd @@ -166,11 +166,11 @@ mode: ConstructObject prototype: Airlock cost: 4 - delay: 4 + delay: 3 collisionMask: FullTileMask rotation: Camera - fx: EffectRCDConstruct4 - + fx: EffectRCDConstruct3 + - type: rcd id: AirlockGlass category: Airlocks @@ -178,22 +178,22 @@ mode: ConstructObject prototype: AirlockGlass cost: 4 - delay: 4 + delay: 3 collisionMask: FullTileMask rotation: Camera - fx: EffectRCDConstruct4 - + fx: EffectRCDConstruct3 + - type: rcd id: Firelock category: Airlocks sprite: /Textures/Interface/Radial/RCD/firelock.png mode: ConstructObject prototype: Firelock - cost: 4 - delay: 3 + cost: 2 + delay: 2 collisionMask: FullTileMask rotation: Camera - fx: EffectRCDConstruct3 + fx: EffectRCDConstruct2 # Lighting - type: rcd @@ -202,25 +202,25 @@ sprite: /Textures/Interface/Radial/RCD/tube_light.png mode: ConstructObject prototype: Poweredlight - cost: 2 - delay: 1 + cost: 1 + delay: 0 collisionMask: TabletopMachineMask collisionBounds: "-0.23,-0.49,0.23,-0.36" rotation: User - fx: EffectRCDConstruct1 - + fx: EffectRCDConstruct0 + - type: rcd id: BulbLight category: Lighting sprite: /Textures/Interface/Radial/RCD/bulb_light.png mode: ConstructObject prototype: PoweredSmallLight - cost: 2 - delay: 1 + cost: 1 + delay: 0 collisionMask: TabletopMachineMask collisionBounds: "-0.23,-0.49,0.23,-0.36" rotation: User - fx: EffectRCDConstruct1 + fx: EffectRCDConstruct0 # Electrical - type: rcd @@ -236,7 +236,7 @@ - MustBuildOnSubfloor rotation: Fixed fx: EffectRCDConstruct0 - + - type: rcd id: MVCable category: Electrical @@ -250,7 +250,7 @@ - MustBuildOnSubfloor rotation: Fixed fx: EffectRCDConstruct0 - + - type: rcd id: HVCable category: Electrical @@ -264,7 +264,7 @@ - MustBuildOnSubfloor rotation: Fixed fx: EffectRCDConstruct0 - + - type: rcd id: CableTerminal category: Electrical @@ -277,4 +277,29 @@ rules: - MustBuildOnSubfloor rotation: User - fx: EffectRCDConstruct0 \ No newline at end of file + fx: EffectRCDConstruct0 + +- type: rcd # WD + id: APC + category: Electrical + sprite: /Textures/Structures/Power/apc.rsi/static.png + mode: ConstructObject + prototype: APCConstructed + cost: 4 + delay: 1 + collisionMask: None + rotation: User + fx: EffectRCDConstruct1 + +- type: rcd # WD + id: Camera + category: Electrical + sprite: /Textures/Structures/Wallmounts/camera.rsi/cameracase.png + mode: ConstructObject + prototype: SurveillanceCameraConstructed + cost: 1 + delay: 1 + collisionMask: TabletopMachineMask + collisionBounds: "-0.23,-0.49,0.23,-0.36" + rotation: User + fx: EffectRCDConstruct1 diff --git a/Resources/Prototypes/Research/industrial.yml b/Resources/Prototypes/Research/industrial.yml index ccc6e9c0f4..f4acd916c0 100644 --- a/Resources/Prototypes/Research/industrial.yml +++ b/Resources/Prototypes/Research/industrial.yml @@ -54,6 +54,7 @@ - AutolatheHyperConvectionMachineCircuitboard - ProtolatheHyperConvectionMachineCircuitboard - SheetifierMachineCircuitboard + - RCDRecipe # WD - type: technology id: PowerGeneration @@ -85,6 +86,7 @@ recipeUnlocks: - ThermomachineFreezerMachineCircuitBoard - GasRecyclerMachineCircuitboard + - RapidPipeDispenserRecipe # WD - type: technology id: RipleyAPLU diff --git a/Resources/Prototypes/_White/Mood/generic_negativeEffects.yml b/Resources/Prototypes/_White/Mood/generic_negativeEffects.yml index 7deab7f4f6..296b3b4465 100644 --- a/Resources/Prototypes/_White/Mood/generic_negativeEffects.yml +++ b/Resources/Prototypes/_White/Mood/generic_negativeEffects.yml @@ -1,51 +1,43 @@ - type: moodEffect id: Handcuffed - desc: "Кажется мои выходки кто-то заметил." + description: "Кажется мои выходки кто-то заметил." moodChange: enum.MoodChangeLevel.Small - positiveEffect: false - type: moodEffect id: Suffocating - desc: "НЕ.. МОГУ... ДЫШАТЬ..." + description: "НЕ.. МОГУ... ДЫШАТЬ..." moodChange: enum.MoodChangeLevel.Medium - positiveEffect: false timeout: 1 - type: moodEffect id: OnFire - desc: "ГОРЮ!!!" + description: "ГОРЮ!!!" moodChange: enum.MoodChangeLevel.Big - positiveEffect: false - type: moodEffect id: Creampied - desc: "Меня окремили. На вкус как пирог." + description: "Меня окремили. На вкус как пирог." moodChange: enum.MoodChangeLevel.Small - positiveEffect: false timeout: 3 - type: moodEffect id: MobSlipped - desc: "Опять поскальзываюсь. Надо быть аккуратней." + description: "Опять поскальзываюсь. Надо быть аккуратней." moodChange: enum.MoodChangeLevel.Small - positiveEffect: false timeout: 3 - type: moodEffect id: MobVomit - desc: "Меня только что вырвало. Мерзость." + description: "Меня только что вырвало. Мерзость." moodChange: enum.MoodChangeLevel.Small - positiveEffect: false timeout: 8 - type: moodEffect id: MobLowPressure - desc: "Меня сейчас разорвёт наружу!" + description: "Меня сейчас разорвёт наружу!" moodChange: enum.MoodChangeLevel.Medium - positiveEffect: false - type: moodEffect id: MobHighPressure - desc: "На меня оказывается огромное давление!" + description: "На меня оказывается огромное давление!" moodChange: enum.MoodChangeLevel.Medium - positiveEffect: false diff --git a/Resources/Prototypes/_White/Mood/generic_positveEffects.yml b/Resources/Prototypes/_White/Mood/generic_positveEffects.yml index 856879bdc2..ac67188d30 100644 --- a/Resources/Prototypes/_White/Mood/generic_positveEffects.yml +++ b/Resources/Prototypes/_White/Mood/generic_positveEffects.yml @@ -1,66 +1,66 @@ - type: moodEffect id: BeingHugged - desc: "Обнимашки - круто." + description: "Обнимашки - круто." moodChange: enum.MoodChangeLevel.Small - positiveEffect: true + positive: true timeout: 2 - type: moodEffect id: BeingPet - desc: "Меня погладили!" + description: "Меня погладили!" moodChange: enum.MoodChangeLevel.Small - positiveEffect: true + positive: true timeout: 2 - type: moodEffect id: ArcadePlay - desc: "Я весело поиграл в интересную аркаду." + description: "Я весело поиграл в интересную аркаду." moodChange: enum.MoodChangeLevel.Small - positiveEffect: true + positive: true timeout: 8 - type: moodEffect id: GotBlessed - desc: "Меня благословили." + description: "Меня благословили." moodChange: enum.MoodChangeLevel.Small - positiveEffect: true + positive: true timeout: 8 - type: moodEffect id: PetAnimal - desc: "Животные такие милые! Не могу перестать их гладить!" + description: "Животные такие милые! Не могу перестать их гладить!" moodChange: enum.MoodChangeLevel.Small - positiveEffect: true + positive: true timeout: 5 - type: moodEffect id: SavedLife - desc: "Так приятно спасать чью-то жизнь." + description: "Так приятно спасать чью-то жизнь." moodChange: enum.MoodChangeLevel.Medium - positiveEffect: true + positive: true timeout: 8 - type: moodEffect id: TraitorFocused #Used for traitors to boost their goals completion. - desc: "У меня есть цель, и я добьюсь её, во что бы то ни стало!" + description: "У меня есть цель, и я добьюсь её, во что бы то ни стало!" moodChange: enum.MoodChangeLevel.Medium - positiveEffect: true + positive: true - type: moodEffect id: RevolutionFocused #Used for revolution - desc: "СЛАВА РЕВОЛЮЦИИ!!!" + description: "СЛАВА РЕВОЛЮЦИИ!!!" moodChange: enum.MoodChangeLevel.Medium - positiveEffect: true + positive: true - type: moodEffect id: CultFocused - desc: "Знаю правду, славим великого!" + description: "Знаю правду, славим великого!" moodChange: enum.MoodChangeLevel.Big - positiveEffect: true + positive: true - type: moodEffect id: Stimulator - desc: "Я ЧУВСТВУЮ ЭТО, В МОЕЙ КРОВИ НАХОДИТСЯ ЧТО-ТО НЕОБЫЧНОЕ!!" + description: "Я ЧУВСТВУЮ ЭТО, В МОЕЙ КРОВИ НАХОДИТСЯ ЧТО-ТО НЕОБЫЧНОЕ!!" moodChange: enum.MoodChangeLevel.Medium - positiveEffect: true - timeout: 2 \ No newline at end of file + positive: true + timeout: 2 diff --git a/Resources/Prototypes/_White/Mood/moodEffects_needs.yml b/Resources/Prototypes/_White/Mood/moodEffects_needs.yml index 7266cbe8f3..f99aac0ebc 100644 --- a/Resources/Prototypes/_White/Mood/moodEffects_needs.yml +++ b/Resources/Prototypes/_White/Mood/moodEffects_needs.yml @@ -1,87 +1,78 @@ #Hunger - type: moodEffect id: HungerOverfed - desc: "Во мне столько жира..." + description: "Во мне столько жира..." moodChange: enum.MoodChangeLevel.Small - positiveEffect: false category: "Hunger" - type: moodEffect id: HungerOkay - desc: "Мой желудок полон!" + description: "Мой желудок полон!" moodChange: enum.MoodChangeLevel.Medium - positiveEffect: true + positive: true category: "Hunger" - type: moodEffect id: HungerPeckish - desc: "Хочу есть." + description: "Хочу есть." moodChange: enum.MoodChangeLevel.Medium - positiveEffect: false category: "Hunger" - type: moodEffect id: HungerStarving - desc: "Голодаю!" + description: "Голодаю!" moodChange: enum.MoodChangeLevel.Big - positiveEffect: false category: "Hunger" #Thirst - type: moodEffect id: ThirstOverHydrated - desc: "СЛИШКОМ МНОГО ВОДЫ..." + description: "СЛИШКОМ МНОГО ВОДЫ..." moodChange: enum.MoodChangeLevel.Small - positiveEffect: false category: "Thirst" - type: moodEffect id: ThirstOkay - desc: "Не хочу пить." + description: "Не хочу пить." moodChange: enum.MoodChangeLevel.Medium - positiveEffect: true + positive: true category: "Thirst" - type: moodEffect id: ThirstThirsty - desc: "Хочу пить." + description: "Хочу пить." moodChange: enum.MoodChangeLevel.Medium - positiveEffect: false category: "Thirst" - type: moodEffect id: ThirstParched - desc: "ВОДЫ!" + description: "ВОДЫ!" moodChange: enum.MoodChangeLevel.Big - positiveEffect: false category: "Thirst" #Health - type: moodEffect id: HealthNoDamage - desc: "Чувствую себя лишённым боли." + description: "Чувствую себя лишённым боли." moodChange: enum.MoodChangeLevel.None - positiveEffect: true + positive: true hidden: true category: "Health" - type: moodEffect id: HealthLightDamage - desc: "Мои ссадины жгутся." + description: "Мои ссадины жгутся." moodChange: enum.MoodChangeLevel.Small - positiveEffect: false category: "Health" - type: moodEffect id: HealthSevereDamage - desc: "Сильная боль пронзает меня." + description: "Сильная боль пронзает меня." moodChange: enum.MoodChangeLevel.Medium - positiveEffect: false category: "Health" - type: moodEffect id: HealthHeavyDamage - desc: "Агония гложет мою душу!" + description: "Агония гложет мою душу!" moodChange: enum.MoodChangeLevel.Large - positiveEffect: false category: "Health" diff --git a/Resources/Prototypes/_White/RCD/categories.yml b/Resources/Prototypes/_White/RCD/categories.yml new file mode 100644 index 0000000000..bd88be5ad4 --- /dev/null +++ b/Resources/Prototypes/_White/RCD/categories.yml @@ -0,0 +1,43 @@ +- type: rcdCategory + id: WallsAndFlooring + spritePath: /Textures/Interface/Radial/RCD/walls_and_flooring.png + +- type: rcdCategory + id: WindowsAndGrilles + spritePath: /Textures/Interface/Radial/RCD/windows_and_grilles.png + +- type: rcdCategory + id: Airlocks + spritePath: /Textures/Interface/Radial/RCD/airlocks.png + +- type: rcdCategory + id: Electrical + spritePath: /Textures/Interface/Radial/RCD/multicoil.png + +- type: rcdCategory + id: Lighting + spritePath: /Textures/Interface/Radial/RCD/lighting.png + +- type: rcdCategory + id: Pipes + spritePath: + sprite: /Textures/Structures/Piping/Atmospherics/pipe.rsi + state: pipeFourway + +- type: rcdCategory + id: GasDevices + spritePath: + sprite: /Textures/Structures/Piping/Atmospherics/vent.rsi + state: vent_off + +- type: rcdCategory + id: DisposalPipes + spritePath: + sprite: /Textures/Structures/Piping/disposal.rsi + state: conpipe-t + +- type: rcdCategory + id: DisposalUnits + spritePath: + sprite: /Textures/Structures/Piping/disposal.rsi + state: disposal diff --git a/Resources/Prototypes/_White/RPD/rpd.yml b/Resources/Prototypes/_White/RPD/rpd.yml new file mode 100644 index 0000000000..d2ef3481dd --- /dev/null +++ b/Resources/Prototypes/_White/RPD/rpd.yml @@ -0,0 +1,482 @@ +# Pipes + +- type: rcd + id: PipeStraight + category: Pipes + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/pipe.rsi + state: pipeStraight + mode: ConstructObject + prototype: GasPipeStraight + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: PipeBend + category: Pipes + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/pipe.rsi + state: pipeBend + mode: ConstructObject + prototype: GasPipeBend + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: PipeTJunction + category: Pipes + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/pipe.rsi + state: pipeTJunction + mode: ConstructObject + prototype: GasPipeTJunction + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: PipeFourway + category: Pipes + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/pipe.rsi + state: pipeFourway + mode: ConstructObject + prototype: GasPipeFourway + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +# Gas devices + +- type: rcd + id: GasCanisterPort + category: GasDevices + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/gascanisterport.rsi + state: gasCanisterPort + mode: ConstructObject + prototype: GasPort + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: GasFilter + category: GasDevices + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/gasfilter.rsi + state: gasFilter + mode: ConstructObject + prototype: GasFilter + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: GasMixer + category: GasDevices + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/gasmixer.rsi + state: gasMixer + mode: ConstructObject + prototype: GasMixer + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: GasOutletInjector + category: GasDevices + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/outletinjector.rsi + state: injector + mode: ConstructObject + prototype: GasOutletInjector + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: GasPressurePump + category: GasDevices + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/pump.rsi + state: pumpPressure + mode: ConstructObject + prototype: GasPressurePump + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: GasVolumePump + category: GasDevices + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/pump.rsi + state: pumpVolume + mode: ConstructObject + prototype: GasVolumePump + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: GasValve + category: GasDevices + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/pump.rsi + state: pumpManualValve + mode: ConstructObject + prototype: GasValve + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: SignalControlledValve + category: GasDevices + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/pump.rsi + state: pumpDigitalValve + mode: ConstructObject + prototype: SignalControlledValve + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: PressureControlledValve + category: GasDevices + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/pneumaticvalve.rsi + state: off + mode: ConstructObject + prototype: PressureControlledValve + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: GasVentScrubber + category: GasDevices + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/scrubber.rsi + state: scrub_off + mode: ConstructObject + prototype: GasVentScrubber + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: GasVentPump + category: GasDevices + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/vent.rsi + state: vent_off + mode: ConstructObject + prototype: GasVentPump + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: GasPassiveVent + category: GasDevices + sprite: + sprite: /Textures/Structures/Piping/Atmospherics/vent.rsi + state: vent_off + mode: ConstructObject + prototype: GasPassiveVent + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +# Disposal pipes + +- type: rcd + id: DisposalPipe + category: DisposalPipes + sprite: + sprite: /Textures/Structures/Piping/disposal.rsi + state: pipe-s + mode: ConstructObject + prototype: DisposalPipe + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: DisposalBend + category: DisposalPipes + sprite: + sprite: /Textures/Structures/Piping/disposal.rsi + state: pipe-c + mode: ConstructObject + prototype: DisposalBend + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: DisposalJunction + category: DisposalPipes + sprite: + sprite: /Textures/Structures/Piping/disposal.rsi + state: pipe-j1 + mode: ConstructObject + prototype: DisposalJunction + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: DisposalJunctionFlipped + category: DisposalPipes + sprite: + sprite: /Textures/Structures/Piping/disposal.rsi + state: pipe-j1 + mode: ConstructObject + prototype: DisposalJunctionFlipped + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: DisposalYJunction + category: DisposalPipes + sprite: + sprite: /Textures/Structures/Piping/disposal.rsi + state: pipe-y + mode: ConstructObject + prototype: DisposalYJunction + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: DisposalRouter + category: DisposalPipes + sprite: + sprite: /Textures/Structures/Piping/disposal.rsi + state: pipe-j1s + mode: ConstructObject + prototype: DisposalRouter + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: DisposalRouterFlipped + category: DisposalPipes + sprite: + sprite: /Textures/Structures/Piping/disposal.rsi + state: pipe-j2s + mode: ConstructObject + prototype: DisposalRouterFlipped + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: DisposalTagger + category: DisposalPipes + sprite: + sprite: /Textures/Structures/Piping/disposal.rsi + state: pipe-tagger + mode: ConstructObject + prototype: DisposalTagger + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: DisposalSignalRouter + category: DisposalPipes + sprite: + sprite: /Textures/Structures/Piping/disposal.rsi + state: signal-router + mode: ConstructObject + prototype: DisposalSignalRouter + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: DisposalSignalRouterFlipped + category: DisposalPipes + sprite: + sprite: /Textures/Structures/Piping/disposal.rsi + state: signal-router-flipped + mode: ConstructObject + prototype: DisposalSignalRouterFlipped + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +- type: rcd + id: DisposalTrunk + category: DisposalPipes + sprite: + sprite: /Textures/Structures/Piping/disposal.rsi + state: conpipe-t + mode: ConstructObject + prototype: DisposalTrunk + cost: 1 + delay: 0 + collisionMask: InteractImpassable + rules: + - MustBuildOnSubfloor + rotation: User + fx: EffectRCDConstruct0 + +# Disposal units + +- type: rcd + id: DisposalUnit + category: DisposalUnits + sprite: + sprite: /Textures/Structures/Piping/disposal.rsi + state: disposal + mode: ConstructObject + prototype: DisposalUnit + cost: 2 + delay: 1 + collisionMask: InteractImpassable + rotation: User + fx: EffectRCDConstruct1 + +- type: rcd + id: MailingUnit + category: DisposalUnits + sprite: + sprite: /Textures/Structures/Piping/disposal.rsi + state: mailing + mode: ConstructObject + prototype: MailingUnit + cost: 2 + delay: 1 + collisionMask: InteractImpassable + rotation: User + fx: EffectRCDConstruct1 + +- type: rcd + id: ToiletEmpty + category: DisposalUnits + sprite: + sprite: /Textures/Structures/Furniture/toilet.rsi + state: condisposal + mode: ConstructObject + prototype: ToiletEmpty + cost: 2 + delay: 1 + collisionMask: InteractImpassable + rotation: User + fx: EffectRCDConstruct1 + diff --git a/Resources/Prototypes/_White/Recipes/lathe_recipes.yml b/Resources/Prototypes/_White/Recipes/lathe_recipes.yml index 1d1620b717..4cba462e3b 100644 --- a/Resources/Prototypes/_White/Recipes/lathe_recipes.yml +++ b/Resources/Prototypes/_White/Recipes/lathe_recipes.yml @@ -166,4 +166,20 @@ result: ShinanoGrenadeBeanbag completetime: 3 materials: - Steel: 800 \ No newline at end of file + Steel: 800 + +- type: latheRecipe + id: RapidPipeDispenserRecipe + result: RapidPipeDispenser + completetime: 1 + materials: + Steel: 300 + Glass: 300 + +- type: latheRecipe + id: RCDRecipe + result: RCD + completetime: 1 + materials: + Steel: 300 + Glass: 300 diff --git a/Resources/Textures/White/Items/Tools/rpd.rsi/equipped-BELT.png b/Resources/Textures/White/Items/Tools/rpd.rsi/equipped-BELT.png new file mode 100644 index 0000000000000000000000000000000000000000..c1182e5dfc1697421064bdb576af05c8c6eafdca GIT binary patch literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|R4( zr;B4q#hkad7J9J+N*w)Ytgz$Yrbw2=xC0wfH$>|sf7g7Y)STEI`jIhb8smM33yuPt z6~vpH4{q9!YZ&vLTU5+$*S0$BWV{ob z_DApjH3p8UueA+q|8RZ%qHEqT_o`(<;e?B&3k6Czcg;1K9ooHougzNlE%S!<>?g;c zb1r(yw!xNZ{$q9^qrk-ds>#`3`wujD?2KzVY|!$Hb;B2JhEFVb(ILhuvQ1Anx^l1w zlySVQF1e}H!n`4;{Xre{%>8JFA%j)w@Q3unwIKwvG>w=>A&Mp#)a^ZY-nYH# zOh{5_59~efeeb>JKIb{-To%#Q)rFNr1XdVf0$~EHn?TiBBg@*lP9E#B)rj0zulgqh z=S74#EaRP0UoWTp7uJ4lUYkA}(|6EXQP=T7PFX6*MSS$|s21e268{}4u zZ|+w^lb0*+quMEK`oWbIL2&|fxL7##&WXEGyAc0*5dK~_c1}cdg2D+EVQtY9PLf(w zm;D;)nQw6>Q<|KvK=VafH9JNO_ZLh&E+LJll@ult5hCJrjgw1zbutO&%hho8dtikL zjTfdA(YtL=xxLb$mkHCprGQi`Y#M4GSHSAJurO&);=33oxwX}Xl?kM`M=mG)Tb(>7$TiG*|W^PBF_dQZ)ZRzb|v>rXl z9gQO@uxWUjJBKu;?WyI-hJsD=jcll>o!y;T zf;lh9ap#=*nD3dNv$OMVfabCQKyz6Dpt&pn&|DS(Xf6u?G?xVcn#%$J&1C_A=28M6 zJt>jdVmIPuOMeLdb14Bp$(LM+LPn~M9lhd~3Zc2m#^@?5t`Y!45r>fJ7)9idF{yDc z9@)*3>|q!*ro||09rOeYK?#7DPo1J+)Znr_|3(4z^x}GPiOHSs zS_cDft8@UAG|heLA({qvZ%z6Y$JH^1p*JZk;rM$2Av0kfZTxzt<)OI$miZTVxugSd zkIagOQ{psKC*!ku=~bWOP`yFpl>ka0^GnAt#td<9tk;m%Ug-dKrsax;lc*O5eox?R zfrFhma~P-6(*8LWp0&5L*G+90@Jztc z51okO4X0ism7pI+=xI<=<<<9Db@{nfA<%t#j$k=vDtXC53>r;+Q=Q^}O5U+;tF$+Z zl0}fF0rgtVgK3oIg~4vGL~nd9W?OHsS&!~Vr=N$NC%?Ep#X~soWZfqGl9)V6{uDYOOLlYBi~xE+56vetn>_}@!=osu02;1mff7%`%1JCFKMev=P%$Fv#l^+o zg)xp{k4M=zN@aV2Vb8}9{s-Is47MCXVdK0gr(UINVdFUJu{3#-_xprODc=lHk|(qC zS>c`@o_voO`t;eGB*|t!z{{N>%>aK69LBz&Bu@&;ZqRLXp{8#JL-V1a z<%Nx1NLWwLbs<;^3IH)3_|-cdR(yt+M?`K%D=l_GR8W5paIcY^JIIN9W&I!m&1C_A z=CS}lb6EhOxhw$CTowRmE(-uOmjwWtOWD~Vf}}uCiKPQj-5H1bO!dYYj7 z;~$U;K!z{Cti1jK@*_EGQ<%U00cilp0}zNWz^r8Z2c!WA#1~*zD*OXdr+~k{0JBoz zACLyXA76l3sq_y>9RdFM0?bO4e?a0?S|lRG{})<&y%x+sVhVV1(WY3Xxu~ldW&)73&~ei9&hxV7Ns1}p>YY)HJY9(F z>`m;|TO=a|);u0OO%!Eob<0~#5~2zqtFBkSQQhLQ$ZwFe*p|-5yKOaCXtm*`RD^8b zETzxe6O=%4#LA4Q0x0;hlNpfxc?zBX@z^zjyUH+j`Fr4D4`N^L7^=PF|MNZDtkCHj zi>LyIa}J=_{gfMStlg}XoESi|^8D5%WUiAi(B+2QpB4~A{W(Bqe+a&+Ys^Y|j+0_aL99W2E64=(n`8%SGT2xpTYBkBDtjXv=m>fm)cY3V?>8|A)TdmlnEFMScIiTTkAt-PwTw(jB*f#7?>`jAkB0PBF$%Dpe6?iDL z7GMuhe326DO=EmJWi`(Lo3xRoM5E;epxD=d$yh(FgAav*+O675ePHylTKt|@xUyRmiaIw=0KONX};B*Kj zC_tWpfk*PM7|kCYtIxZ-B+H6&G=+B_(Tcq zRnU8ERRSVw@PV|a%xJ95#AG%2M2YNG&~t3n*MLN7@QD)HtB||rHBZ-cRF@T$j{f?fsP1jMSrYaYwMUWLE&JH{>< S=HG$<0000zrb>uaS`-z|Ob{CxMEbH8)%eG!RA%s|Y*MQ30jNWj$n zheydoDrlDU^|WL2>Yk$?wwhw+5lfm(rUFWUTri4eYEq9 z`C$X|EBj?Z5tl6xD`0ZZt67(L?t&d(Pzl4P(;0=6EvEp`hU$>~&$Sr^X0kr@sT;{) zo=AH0$D!hC6@LYu_d!quTjUe~BpBcdrsu~aC5a09xUt&8fO?FBd8Scod8=GA><=m^4uC1Sd!oF79 zf;QGWAh6tM`mJ#az>yhD4Qd?rytuTc$@>LAtDVQQZwnZB;>{EJ^>|s;#rZiYJbS7# z-%zZq&J!N?7&{E$vdDD)>;U~}L$PBd?eJUbt!(Fp$-J1H0x*H6fX8QeeOZ%-1^XXg zPYWzP2t2v>TpoORtvPH9U;y>7oiwlkF}Ns;cNpO91OP9Nf$|mkHrmi#oLhaTa~W_p z_tMc-33(tU5`yKMW49FP6oA`_Er1sn$5!@{$bm?zQq>8keQ?!W5axS7ze}V3TSGYo z;AmVON$ORJD-)w$(wClJUpm{9iTEw3w#piac2&4D!Gf66;OlPU;9h|jxPRH{V+4zF zKF0v?_W;@fMpzX02R|YV7Uj)L2Uy1A?|~@uV@%9I%)q%aa13VD;_2oXowNV|01jnX jNoGw=04e|g00;m8000000Mb*F00000NkvXXu0mjf$dg7n diff --git a/Resources/Textures/_Sunrise/Entities/Objects/Devices/portable_camera_viewer.rsi/meta.json b/Resources/Textures/_Sunrise/Entities/Objects/Devices/portable_camera_viewer.rsi/meta.json deleted file mode 100644 index fb7d306474..0000000000 --- a/Resources/Textures/_Sunrise/Entities/Objects/Devices/portable_camera_viewer.rsi/meta.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "version": 1, - "size": { - "x": 32, - "y": 32 - }, - "license": "CC-BY-SA-3.0", - "copyright": "", - "states": [ - { - "name": "icon" - } - ] -} From 5ae99b4e37b09682094dd92124024c11b7d29a95 Mon Sep 17 00:00:00 2001 From: RavmorganButOnCocaine Date: Mon, 29 Jul 2024 03:05:24 +0000 Subject: [PATCH 8/8] Automatic changelog update --- Resources/Changelog/ChangelogWhite.yml | 80 ++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/Resources/Changelog/ChangelogWhite.yml b/Resources/Changelog/ChangelogWhite.yml index 1064a8664d..4c1d563e03 100644 --- a/Resources/Changelog/ChangelogWhite.yml +++ b/Resources/Changelog/ChangelogWhite.yml @@ -6890,3 +6890,83 @@ id: 424 time: '2024-07-28T18:02:55.0000000+00:00' url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/508 +- author: ThereDrD + changes: + - message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u0420\u041F\u0414\ + , \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E, \u043F\u043E\ + \u0437\u0432\u043E\u043B\u044F\u044E\u0449\u0435\u0435 \u0431\u044B\u0441\u0442\ + \u0440\u043E \u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0430\u0442\u043C\u043E\ + \u0441\u0444\u0435\u0440\u043D\u044B\u0435 \u0438 \u043C\u0443\u0441\u043E\u0440\ + \u043D\u044B\u0435 \u0442\u0440\u0443\u0431\u044B. \u0410 \u0442\u0430\u043A\ + \ \u0436\u0435 \u0441\u043E\u043F\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0449\ + \u0438\u0435 \u044D\u0442\u043E\u043C\u0443 \u0443\u0441\u0442\u0440\u043E\u0439\ + \u0441\u0442\u0432\u0430" + type: Add + - message: "\u0422\u0435\u043F\u0435\u0440\u044C \u0432\u0441\u0435 \u0420\u0426\ + \u0414 \u0438 \u0420\u041F\u0414 \u043C\u043E\u0436\u043D\u043E \u0437\u0430\ + \u0440\u044F\u0436\u0430\u0442\u044C \u0440\u0435\u0441\u0443\u0440\u0441\u0430\ + \u043C\u0438, \u0432\u0440\u043E\u0434\u0435 \u043C\u0435\u0442\u0430\u043B\u043B\ + \u0430, \u0441\u0442\u0430\u043B\u0438, \u0441\u0442\u0435\u043A\u043B\u0430\ + \ \u0438 \u0442.\u043F. \u0414\u0430\u0436\u0435 \u043F\u0440\u043E\u0432\u043E\ + \u0434\u0430\u043C\u0438. \u0420\u0430\u0437\u043D\u044B\u0435 \u0440\u0435\u0441\ + \u0443\u0440\u0441\u044B \u0434\u0430\u044E\u0442 \u0440\u0430\u0437\u043D\u044B\ + \u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044B \u0434\u0430\u044E\u0442 \u0440\ + \u0430\u0437\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\ + \u0432\u043E \u0437\u0430\u0440\u044F\u0434\u043E\u0432" + type: Add + - message: "\u0420\u0426\u0414 \u043D\u0430\u0443\u0447\u0438\u043B\u0441\u044F\ + \ \u0441\u0442\u0440\u043E\u0438\u0442\u044C \u043A\u0430\u043C\u0435\u0440\u044B\ + \ \u0438 \u0410\u041F\u0426" + type: Add + - message: "\u0420\u041F\u0414 \u0438 \u0420\u0426\u0414 \u0434\u043E\u0431\u0430\ + \u0432\u043B\u0435\u043D\u044B \u0432 \u0438\u0441\u0441\u043B\u0435\u0434\u043E\ + \u0432\u0430\u043D\u0438\u044F \u0420\u043D\u0414 1\u0433\u043E \u0443\u0440\ + \u043E\u0432\u043D\u044F." + type: Add + - message: "\u0418\u0433\u0440\u043E\u043A\u0438, \u0438\u0433\u0440\u0430\u0432\ + \u0448\u0438\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 3 \u0434\u043D\u0435\ + \u0439 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043F\u043E\u043C\ + \u0435\u0447\u0430\u044E\u0442\u0441\u044F \u0447\u0430\u0441\u0430\u043C\u0438\ + \ \u0432 \u0430\u0434\u043C\u0438\u043D-\u043C\u0435\u043D\u044E, \u0447\u0442\ + \u043E\u0431\u044B \u043F\u0435\u0434\u0430\u043B\u0438 \u043C\u043E\u0433\u043B\ + \u0438 \u043B\u0435\u0433\u0447\u0435 \u043E\u0442\u043B\u0438\u0447\u0430\u0442\ + \u044C \u043D\u043E\u0432\u044B\u0445 \u0438\u0433\u0440\u043E\u043A\u043E\u0432\ + ." + type: Add + - message: "\u0428\u0430\u0442\u0442\u043B \u043F\u0440\u0438\u0431\u044B\u0442\u0438\ + \u044F \u043F\u0440\u0438\u0431\u044B\u0432\u0430\u044E\u0442 \u043D\u0430 \u0432\ + \u043E\u043A\u0437\u0430\u043B \u043F\u0440\u0438\u0431\u044B\u0442\u0438\u044F\ + \ \u0431\u044B\u0441\u0442\u0440\u0435\u0435" + type: Tweak + - message: "\u041F\u0435\u0434\u0430\u043B\u0438 \u0442\u0435\u043F\u0435\u0440\u044C\ + \ \u0441\u043F\u0430\u0432\u043D\u044F\u0442\u0441\u044F \u0432 \u0434\u0435\ + \u0430\u0434\u043C\u0438\u043D\u0435, \u043A\u043E\u0433\u0434\u0430 \u0437\u0430\ + \u0445\u043E\u0434\u044F\u0442 \u0437\u0430 \u0440\u043E\u043B\u044C \u0432\ + \ \u0440\u0430\u0443\u043D\u0434\u0435" + type: Tweak + - message: "\u0426\u0435\u043D\u044B \u0438 \u0432\u0440\u0435\u043C\u044F \u043F\ + \u043E\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0432 \u0420\u0426\u0414 \u0441\ + \u0442\u0430\u043B\u0438 \u043C\u0435\u043D\u044C\u0448\u0435." + type: Tweak + - message: "\u0420\u0430\u0434\u0438\u0430\u043B\u044C\u043D\u043E\u0435 \u043C\u0435\ + \u043D\u044E \u0420\u0426\u0414 \u0438 \u0420\u041F\u0414 \u0442\u0435\u043F\ + \u0435\u0440\u044C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\ + \u0441\u043A\u0438 \u0438\u0437\u043C\u0435\u043D\u044F\u0435\u0442 \u0441\u0432\ + \u043E\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u043E\u0442 \u043A\u043E\u043B\ + \u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0438\u043A\u043E\u043D\u043E\u043A" + type: Tweak + - message: "\u0423\u0431\u0440\u0430\u043D \u0434\u0435\u0431\u0430\u0444\u0444\ + \ \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D\u0438\u044F \u043E\u0442\ + \ \u043F\u0435\u0440\u0435\u0435\u0434\u0430\u043D\u0438\u044F \u0438 \u043F\ + \u0435\u0440\u0435\u043F\u0438\u0442\u0438\u044F \u0432 \u0432\u0438\u0434\u0443\ + \ \u0435\u0433\u043E \u043D\u0435\u043E\u0447\u0435\u0432\u0438\u0434\u043D\u043E\ + \u0439 \u043C\u0435\u0445\u0430\u043D\u0438\u043A\u0438 \u043F\u043E\u044F\u0432\ + \u043B\u0435\u043D\u0438\u044F. \u041F\u0440\u0435\u0434\u0443\u0433\u0430\u0434\ + \u0430\u0442\u044C, \u043A\u043E\u0433\u0434\u0430 \u043F\u0435\u0440\u0441\u043E\ + \u043D\u0430\u0436 \u043F\u0435\u0440\u0435\u0435\u0441\u0442 \u0438\u043B\u0438\ + \ \u043F\u0435\u0440\u0435\u043F\u044C\u0435\u0442 \u043D\u0435\u0432\u043E\u0437\ + \u043C\u043E\u0436\u043D\u043E." + type: Remove + id: 425 + time: '2024-07-29T03:04:21.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/510