From ca4172c987957710419972ae6ed3338c5a23eed8 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Tue, 2 Apr 2024 20:59:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=B9=20(#7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * new Dev map * добавлена генерация узора ключей раундстартом * каменная стена подгон KREKSa фиксы * add verbs to lock comp * more Loc work * some popups, logic to lock and unlock locks * return old Dev * ability to add locks into doors * check to locked lock, to insert or remove locks * doors examine * key can uses directly to door * really lockable! * lockable crates! * Bruh... Really big update * Key sprites, long wall template * KeyRingComponent * lock entity start * lockpicking! * Shiny 1 * Update keys.yml * Отображение только для держащего в руке * Final --------- Co-authored-by: Tornado Tech <54727692+Tornado-Technology@users.noreply.github.com> --- .../LockKey/KeyholeGenerationSystem.cs | 136 +++++++ .../StationBiomeComponent.cs | 2 +- .../StationBiomeSystem.cs | 2 +- .../EntitySystems/EntityStorageSystem.cs | 3 +- .../LockKey/CPLockCategoryPrototype.cs | 19 + .../LockKey/Components/CPKeyComponent.cs | 19 + .../LockKey/Components/CPKeyRingComponent.cs | 9 + .../LockKey/Components/CPLockComponent.cs | 37 ++ .../LockKey/Components/CPLockpickComponent.cs | 32 ++ .../LockKey/SharedCPLockKeySystem.cs | 334 ++++++++++++++++++ Content.Shared/Lock/LockComponent.cs | 8 +- Content.Shared/Lock/LockSystem.cs | 85 +++-- Content.Shared/Verbs/VerbCategory.cs | 3 + Resources/Audio/_CP14/Items/attributions.yml | 14 + Resources/Audio/_CP14/Items/key_drop.ogg | Bin 0 -> 14874 bytes Resources/Audio/_CP14/Items/lockpick_fail.ogg | Bin 0 -> 9735 bytes Resources/Audio/_CP14/Items/lockpick_use.ogg | Bin 0 -> 30898 bytes .../Locale/ru-RU/lock/lock-component.ftl | 9 + .../Locale/ru-RU/lock/lock-crystall-punk.ftl | 29 ++ Resources/Maps/CrystallPunk/dev_map.yml | 14 +- .../Entities/Markers/Spawners/jobs.yml | 0 .../Structures/Doors/wooden_doors.yml | 67 ++++ .../Entities/Structures/Furniture/chairs.yml | 0 .../Entities/Structures/Furniture/tables.yml | 0 .../Entities/Structures/Walls/walls.yml | 14 + .../Prototypes/_CP14/Entities/keyrings.yml | 41 +++ Resources/Prototypes/_CP14/Entities/keys.yml | 42 +++ Resources/Prototypes/_CP14/Entities/locks.yml | 22 ++ .../_CP14/LockCategories/LockCategory.yml | 7 + .../Roles/Jobs/Mercenary/adventurer.yml | 0 .../Roles/Jobs/departments.yml | 0 .../Roles/play_time_tracker.yml | 0 .../{CrystallPunk => _CP14}/Tiles/natural.yml | 0 Resources/Prototypes/_CP14/tags.yml | 2 + .../CrystallPunk/Objects/keys.rsi/base.png | Bin 272 -> 0 bytes .../CrystallPunk/Objects/keys.rsi/key1.png | Bin 0 -> 259 bytes .../CrystallPunk/Objects/keys.rsi/key10.png | Bin 0 -> 248 bytes .../CrystallPunk/Objects/keys.rsi/key11.png | Bin 0 -> 236 bytes .../CrystallPunk/Objects/keys.rsi/key12.png | Bin 0 -> 235 bytes .../CrystallPunk/Objects/keys.rsi/key13.png | Bin 0 -> 276 bytes .../CrystallPunk/Objects/keys.rsi/key14.png | Bin 0 -> 247 bytes .../CrystallPunk/Objects/keys.rsi/key15.png | Bin 0 -> 251 bytes .../CrystallPunk/Objects/keys.rsi/key16.png | Bin 0 -> 245 bytes .../CrystallPunk/Objects/keys.rsi/key17.png | Bin 0 -> 230 bytes .../CrystallPunk/Objects/keys.rsi/key18.png | Bin 0 -> 261 bytes .../CrystallPunk/Objects/keys.rsi/key2.png | Bin 0 -> 260 bytes .../CrystallPunk/Objects/keys.rsi/key3.png | Bin 0 -> 257 bytes .../CrystallPunk/Objects/keys.rsi/key4.png | Bin 0 -> 263 bytes .../CrystallPunk/Objects/keys.rsi/key5.png | Bin 0 -> 257 bytes .../CrystallPunk/Objects/keys.rsi/key6.png | Bin 0 -> 247 bytes .../CrystallPunk/Objects/keys.rsi/key7.png | Bin 0 -> 254 bytes .../CrystallPunk/Objects/keys.rsi/key8.png | Bin 0 -> 235 bytes .../CrystallPunk/Objects/keys.rsi/key9.png | Bin 0 -> 249 bytes .../CrystallPunk/Objects/keys.rsi/keyring.png | Bin 0 -> 225 bytes .../CrystallPunk/Objects/keys.rsi/lock.png | Bin 0 -> 332 bytes .../Objects/keys.rsi/lockpick.png | Bin 0 -> 255 bytes .../CrystallPunk/Objects/keys.rsi/meta.json | 74 +++- .../CrystallPunk/Objects/keys.rsi/ring-0.png | Bin 0 -> 96 bytes .../CrystallPunk/Objects/keys.rsi/ring-1.png | Bin 0 -> 167 bytes .../CrystallPunk/Objects/keys.rsi/ring-2.png | Bin 0 -> 223 bytes .../CrystallPunk/Objects/keys.rsi/ring-3.png | Bin 0 -> 261 bytes .../Walls/TEMPLATE_LONG.rsi/full.png | Bin 0 -> 213 bytes .../Walls/TEMPLATE_LONG.rsi/meta.json | 46 +++ .../Walls/TEMPLATE_LONG.rsi/wood0.png | Bin 0 -> 457 bytes .../Walls/TEMPLATE_LONG.rsi/wood1.png | Bin 0 -> 415 bytes .../Walls/TEMPLATE_LONG.rsi/wood2.png | Bin 0 -> 457 bytes .../Walls/TEMPLATE_LONG.rsi/wood3.png | Bin 0 -> 415 bytes .../Walls/TEMPLATE_LONG.rsi/wood4.png | Bin 0 -> 417 bytes .../Walls/TEMPLATE_LONG.rsi/wood5.png | Bin 0 -> 420 bytes .../Walls/TEMPLATE_LONG.rsi/wood6.png | Bin 0 -> 417 bytes .../Walls/TEMPLATE_LONG.rsi/wood7.png | Bin 0 -> 317 bytes .../Structures/Walls/cave_stone.rsi/full.png | Bin 0 -> 1039 bytes .../Structures/Walls/cave_stone.rsi/meta.json | 46 +++ .../Walls/cave_stone.rsi/stone0.png | Bin 0 -> 1360 bytes .../Walls/cave_stone.rsi/stone1.png | Bin 0 -> 1252 bytes .../Walls/cave_stone.rsi/stone2.png | Bin 0 -> 1360 bytes .../Walls/cave_stone.rsi/stone3.png | Bin 0 -> 1252 bytes .../Walls/cave_stone.rsi/stone4.png | Bin 0 -> 1176 bytes .../Walls/cave_stone.rsi/stone5.png | Bin 0 -> 927 bytes .../Walls/cave_stone.rsi/stone6.png | Bin 0 -> 1176 bytes .../Walls/cave_stone.rsi/stone7.png | Bin 0 -> 265 bytes 81 files changed, 1077 insertions(+), 39 deletions(-) create mode 100644 Content.Server/CrystallPunk/LockKey/KeyholeGenerationSystem.cs rename Content.Server/CrystallPunk/{SpawnMapBiome => StationBiome}/StationBiomeComponent.cs (88%) rename Content.Server/CrystallPunk/{SpawnMapBiome => StationBiome}/StationBiomeSystem.cs (95%) create mode 100644 Content.Shared/CrystallPunk/LockKey/CPLockCategoryPrototype.cs create mode 100644 Content.Shared/CrystallPunk/LockKey/Components/CPKeyComponent.cs create mode 100644 Content.Shared/CrystallPunk/LockKey/Components/CPKeyRingComponent.cs create mode 100644 Content.Shared/CrystallPunk/LockKey/Components/CPLockComponent.cs create mode 100644 Content.Shared/CrystallPunk/LockKey/Components/CPLockpickComponent.cs create mode 100644 Content.Shared/CrystallPunk/LockKey/SharedCPLockKeySystem.cs create mode 100644 Resources/Audio/_CP14/Items/attributions.yml create mode 100644 Resources/Audio/_CP14/Items/key_drop.ogg create mode 100644 Resources/Audio/_CP14/Items/lockpick_fail.ogg create mode 100644 Resources/Audio/_CP14/Items/lockpick_use.ogg create mode 100644 Resources/Locale/ru-RU/lock/lock-component.ftl create mode 100644 Resources/Locale/ru-RU/lock/lock-crystall-punk.ftl rename Resources/Prototypes/{CrystallPunk => _CP14}/Entities/Markers/Spawners/jobs.yml (100%) create mode 100644 Resources/Prototypes/_CP14/Entities/Structures/Doors/wooden_doors.yml rename Resources/Prototypes/{CrystallPunk => _CP14}/Entities/Structures/Furniture/chairs.yml (100%) rename Resources/Prototypes/{CrystallPunk => _CP14}/Entities/Structures/Furniture/tables.yml (100%) rename Resources/Prototypes/{CrystallPunk => _CP14}/Entities/Structures/Walls/walls.yml (79%) create mode 100644 Resources/Prototypes/_CP14/Entities/keyrings.yml create mode 100644 Resources/Prototypes/_CP14/Entities/keys.yml create mode 100644 Resources/Prototypes/_CP14/Entities/locks.yml create mode 100644 Resources/Prototypes/_CP14/LockCategories/LockCategory.yml rename Resources/Prototypes/{CrystallPunk => _CP14}/Roles/Jobs/Mercenary/adventurer.yml (100%) rename Resources/Prototypes/{CrystallPunk => _CP14}/Roles/Jobs/departments.yml (100%) rename Resources/Prototypes/{CrystallPunk => _CP14}/Roles/play_time_tracker.yml (100%) rename Resources/Prototypes/{CrystallPunk => _CP14}/Tiles/natural.yml (100%) create mode 100644 Resources/Prototypes/_CP14/tags.yml delete mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/base.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key1.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key10.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key11.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key12.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key13.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key14.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key15.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key16.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key17.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key18.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key2.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key3.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key4.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key5.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key6.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key7.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key8.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/key9.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/keyring.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/lock.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/lockpick.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/ring-0.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/ring-1.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/ring-2.png create mode 100644 Resources/Textures/CrystallPunk/Objects/keys.rsi/ring-3.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/full.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/meta.json create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood0.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood1.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood2.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood3.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood4.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood5.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood6.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood7.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/cave_stone.rsi/full.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/cave_stone.rsi/meta.json create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/cave_stone.rsi/stone0.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/cave_stone.rsi/stone1.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/cave_stone.rsi/stone2.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/cave_stone.rsi/stone3.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/cave_stone.rsi/stone4.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/cave_stone.rsi/stone5.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/cave_stone.rsi/stone6.png create mode 100644 Resources/Textures/CrystallPunk/Structures/Walls/cave_stone.rsi/stone7.png diff --git a/Content.Server/CrystallPunk/LockKey/KeyholeGenerationSystem.cs b/Content.Server/CrystallPunk/LockKey/KeyholeGenerationSystem.cs new file mode 100644 index 0000000000..2266663f02 --- /dev/null +++ b/Content.Server/CrystallPunk/LockKey/KeyholeGenerationSystem.cs @@ -0,0 +1,136 @@ + +using Content.Server.GameTicking.Events; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.CrystallPunk.LockKey; +using Content.Shared.Examine; +using Content.Shared.Interaction; +using Content.Shared.Popups; +using Content.Shared.Lock; +using Content.Shared.Verbs; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using System.Diagnostics.CodeAnalysis; +using System.Linq; + +namespace Content.Server.CrystallPunk.LockKey; + + +public sealed partial class KeyholeGenerationSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; + [Dependency] private readonly LockSystem _lock = default!; + + private Dictionary, List> _roundKeyData = new(); + + private const int DepthCompexity = 2; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnRoundStart); + + SubscribeLocalEvent(OnLockInit); + SubscribeLocalEvent(OnKeyInit); + + SubscribeLocalEvent(OnKeyExamine); + } + + #region Init + private void OnRoundStart(RoundStartingEvent ev) + { + _roundKeyData = new(); + } + + private void OnKeyInit(Entity keyEnt, ref MapInitEvent args) + { + if (keyEnt.Comp.AutoGenerateShape != null) + { + keyEnt.Comp.LockShape = GetKeyLockData(keyEnt.Comp.AutoGenerateShape.Value); + } + } + + private void OnLockInit(Entity lockEnt, ref MapInitEvent args) + { + if (lockEnt.Comp.AutoGenerateShape != null) + { + lockEnt.Comp.LockShape = GetKeyLockData(lockEnt.Comp.AutoGenerateShape.Value); + } + } + #endregion + + private void OnKeyExamine(Entity key, ref ExaminedEvent args) + { + var parent = Transform(key).ParentUid; + if (parent != args.Examiner) + return; + + if (key.Comp.LockShape == null) + return; + + var markup = Loc.GetString("cp-lock-examine-key", ("item", MetaData(key).EntityName)); + markup += " ("; + foreach (var item in key.Comp.LockShape) + { + markup += $"{item} "; + } + markup += ")"; + args.PushMarkup(markup); + } + + private List GetKeyLockData(ProtoId category) + { + if (_roundKeyData.ContainsKey(category)) + return _roundKeyData[category]; + else + { + var newData = GenerateNewUniqueLockData(category); + _roundKeyData[category] = newData; + return newData; + } + } + + private List GenerateNewUniqueLockData(ProtoId category) + { + List newKeyData = new List(); + var categoryData = _proto.Index(category); + var ready = false; + var iteration = 0; + + while (!ready) + { + //Generate try + newKeyData = new List(); + for (int i = 0; i < categoryData.Complexity; i++) + { + newKeyData.Add(_random.Next(-DepthCompexity, DepthCompexity)); + } + + //Identity Check shitcode + // На текущий момент он пытается сгенерировать уникальный код. Если он 100 раз не смог сгенерировать уникальный код, он выдаст последний сгенерированный неуникальный. + var unique = true; + foreach (var pair in _roundKeyData) + { + if (newKeyData.SequenceEqual(pair.Value)) + { + unique = false; + break; + } + } + if (unique) + return newKeyData; + else + iteration++; + + if (iteration > 100) + { + break; + } + } + Log.Error("The unique key for CPLockSystem could not be generated!"); + return newKeyData; //FUCK + } +} diff --git a/Content.Server/CrystallPunk/SpawnMapBiome/StationBiomeComponent.cs b/Content.Server/CrystallPunk/StationBiome/StationBiomeComponent.cs similarity index 88% rename from Content.Server/CrystallPunk/SpawnMapBiome/StationBiomeComponent.cs rename to Content.Server/CrystallPunk/StationBiome/StationBiomeComponent.cs index a61f30b370..f52330c8c8 100644 --- a/Content.Server/CrystallPunk/SpawnMapBiome/StationBiomeComponent.cs +++ b/Content.Server/CrystallPunk/StationBiome/StationBiomeComponent.cs @@ -1,7 +1,7 @@ using Content.Shared.Parallax.Biomes; using Robust.Shared.Prototypes; -namespace Content.Server.Corvax.CrystallPunk.SpawnMapBiome; +namespace Content.Server.CrystallPunk.SpawnMapBiome; /// /// allows you to initialize a planet on a specific map at initialization time. diff --git a/Content.Server/CrystallPunk/SpawnMapBiome/StationBiomeSystem.cs b/Content.Server/CrystallPunk/StationBiome/StationBiomeSystem.cs similarity index 95% rename from Content.Server/CrystallPunk/SpawnMapBiome/StationBiomeSystem.cs rename to Content.Server/CrystallPunk/StationBiome/StationBiomeSystem.cs index c794474e95..13aea7b18c 100644 --- a/Content.Server/CrystallPunk/SpawnMapBiome/StationBiomeSystem.cs +++ b/Content.Server/CrystallPunk/StationBiome/StationBiomeSystem.cs @@ -5,7 +5,7 @@ using Content.Server.Station.Systems; using Robust.Shared.Map; using Robust.Shared.Prototypes; -namespace Content.Server.Corvax.CrystallPunk.SpawnMapBiome; +namespace Content.Server.CrystallPunk.SpawnMapBiome; public sealed partial class StationBiomeSystem : EntitySystem { [Dependency] private readonly BiomeSystem _biome = default!; diff --git a/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs b/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs index 8b31f598d0..7c9d7b91a7 100644 --- a/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs +++ b/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs @@ -3,6 +3,7 @@ using Content.Server.Atmos.EntitySystems; using Content.Server.Body.Systems; using Content.Server.Construction; using Content.Server.Construction.Components; +using Content.Server.CrystallPunk.LockKey; using Content.Server.Storage.Components; using Content.Shared.Destructible; using Content.Shared.Explosion; @@ -36,7 +37,7 @@ public sealed class EntityStorageSystem : SharedEntityStorageSystem SubscribeLocalEvent(OnEntityUnpausedEvent); SubscribeLocalEvent(OnComponentInit); SubscribeLocalEvent(OnComponentStartup); - SubscribeLocalEvent(OnInteract, after: new[] { typeof(LockSystem) }); + SubscribeLocalEvent(OnInteract, after: new[] { typeof(LockSystem), typeof(KeyholeGenerationSystem) }); SubscribeLocalEvent(OnLockToggleAttempt); SubscribeLocalEvent(OnDestruction); SubscribeLocalEvent>(AddToggleOpenVerb); diff --git a/Content.Shared/CrystallPunk/LockKey/CPLockCategoryPrototype.cs b/Content.Shared/CrystallPunk/LockKey/CPLockCategoryPrototype.cs new file mode 100644 index 0000000000..55fedbe817 --- /dev/null +++ b/Content.Shared/CrystallPunk/LockKey/CPLockCategoryPrototype.cs @@ -0,0 +1,19 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.CrystallPunk.LockKey; + +/// +/// A prototype of the lock category. Need a roundstart mapping to ensure that keys and locks will fit together despite randomization. +/// +[Prototype("CPLockCategory")] +public sealed partial class CPLockCategoryPrototype : IPrototype +{ + [ViewVariables] + [IdDataField] + public string ID { get; private set; } = default!; + + /// + /// The number of elements that will be generated for the category. + /// + [DataField] public int Complexity = 3; +} diff --git a/Content.Shared/CrystallPunk/LockKey/Components/CPKeyComponent.cs b/Content.Shared/CrystallPunk/LockKey/Components/CPKeyComponent.cs new file mode 100644 index 0000000000..83c1e4e26d --- /dev/null +++ b/Content.Shared/CrystallPunk/LockKey/Components/CPKeyComponent.cs @@ -0,0 +1,19 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.CrystallPunk.LockKey; + +/// +/// a key component that can be used to unlock and lock locks from CPLockComponent +/// +[RegisterComponent] +public sealed partial class CPKeyComponent : Component +{ + [DataField] + public List? LockShape = null; + + /// + /// If not null, automatically generates a key for the specified category on initialization. This ensures that the lock will be opened with a key of the same category. + /// + [DataField] + public ProtoId? AutoGenerateShape = null; +} diff --git a/Content.Shared/CrystallPunk/LockKey/Components/CPKeyRingComponent.cs b/Content.Shared/CrystallPunk/LockKey/Components/CPKeyRingComponent.cs new file mode 100644 index 0000000000..72a8eab3bc --- /dev/null +++ b/Content.Shared/CrystallPunk/LockKey/Components/CPKeyRingComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Shared.CrystallPunk.LockKey; + +/// +/// A component that allows you to track a ring of keys to quickly open and lock doors with the entire bunch. +/// +[RegisterComponent] +public sealed partial class CPKeyRingComponent : Component +{ +} diff --git a/Content.Shared/CrystallPunk/LockKey/Components/CPLockComponent.cs b/Content.Shared/CrystallPunk/LockKey/Components/CPLockComponent.cs new file mode 100644 index 0000000000..ff17524368 --- /dev/null +++ b/Content.Shared/CrystallPunk/LockKey/Components/CPLockComponent.cs @@ -0,0 +1,37 @@ +using Content.Shared.CrystallPunk.LockKey; +using Content.Shared.Damage; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.CrystallPunk.LockKey; + +/// +/// A component of a lock that stores its keyhole shape, complexity, and current state. +/// +[RegisterComponent] +public sealed partial class CPLockComponent : Component +{ + [DataField] + public List? LockShape = null; + + [DataField] + public float LockPickDamageChance = 0.2f; + + /// + /// On which element of the shape sequence the lock is now located. It's necessary for the mechanics of breaking and entering. + /// + [DataField] + public int LockpickStatus = 0; + + /// + /// after a lock is broken into, it leaves a description on it that it's been tampered with. + /// + [DataField] + public bool LockpickeddFailMarkup = false; + + /// + /// If not null, automatically generates a lock for the specified category on initialization. This ensures that the lock will be opened with a key of the same category. + /// + [DataField] + public ProtoId? AutoGenerateShape = null; +} diff --git a/Content.Shared/CrystallPunk/LockKey/Components/CPLockpickComponent.cs b/Content.Shared/CrystallPunk/LockKey/Components/CPLockpickComponent.cs new file mode 100644 index 0000000000..153e681ca6 --- /dev/null +++ b/Content.Shared/CrystallPunk/LockKey/Components/CPLockpickComponent.cs @@ -0,0 +1,32 @@ +using Content.Shared.CrystallPunk.LockKey; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.CrystallPunk.LockKey; + +/// +/// A component of a lock that stores its keyhole shape, complexity, and current state. +/// +[RegisterComponent] +public sealed partial class CPLockpickComponent : Component +{ + [DataField] + public int Health = 3; + + [DataField] + public SoundSpecifier SuccessSound = new SoundPathSpecifier("/Audio/_CP14/Items/lockpick_use.ogg") + { + Params = AudioParams.Default + .WithVariation(0.05f) + .WithVolume(0.5f) + }; + + [DataField] + public SoundSpecifier FailSound = new SoundPathSpecifier("/Audio/_CP14/Items/lockpick_fail.ogg") + { + Params = AudioParams.Default + .WithVariation(0.05f) + .WithVolume(0.5f) + }; +} diff --git a/Content.Shared/CrystallPunk/LockKey/SharedCPLockKeySystem.cs b/Content.Shared/CrystallPunk/LockKey/SharedCPLockKeySystem.cs new file mode 100644 index 0000000000..2e9e1ae874 --- /dev/null +++ b/Content.Shared/CrystallPunk/LockKey/SharedCPLockKeySystem.cs @@ -0,0 +1,334 @@ + +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Interaction; +using Content.Shared.Lock; +using Content.Shared.Popups; +using Robust.Shared.Containers; +using Robust.Shared.Serialization; +using System.Diagnostics.CodeAnalysis; +using Content.Shared.Verbs; +using Content.Shared.Storage.EntitySystems; +using Content.Shared.Storage; +using Robust.Shared.Random; +using Robust.Shared.Audio.Systems; + +namespace Content.Shared.CrystallPunk.LockKey; + +/// +/// +/// +public sealed class SharedCPLockKeySystem : EntitySystem +{ + + [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly LockSystem _lock = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + + private const int DepthCompexity = 2; //TODO - fix this constant duplication from KeyholeGenerationSystem.cs + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnLockInsertAttempt); + + SubscribeLocalEvent(OnLockInserted); + SubscribeLocalEvent(OnLockRemoved); + + SubscribeLocalEvent(OnKeyInteract); + SubscribeLocalEvent(OnKeyRingInteract); + SubscribeLocalEvent>(OnKeyToLockVerb); + SubscribeLocalEvent>(OnLockpickToLockVerb); + } + private void OnKeyRingInteract(Entity keyring, ref AfterInteractEvent args) + { + if (args.Handled) + return; + + if (!args.CanReach || args.Target is not { Valid: true } target) + return; + + if (!TryComp(keyring, out var storageComp)) + return; + + + if (TryComp(args.Target, out var lockComp) && + TryGetLockFromSlot(args.Target.Value, out var lockEnt)) + { + + foreach (var item in storageComp.StoredItems) + { + if (!TryComp(item.Key, out var keyComp)) + continue; + + if (keyComp.LockShape != lockEnt.Value.Comp.LockShape) + continue; + + TryUseKeyOnLock(args.User, args.Target.Value, new Entity(item.Key, keyComp), lockEnt.Value); + args.Handled = true; + return; + } + _popup.PopupEntity(Loc.GetString("cp-lock-keyring-use-nofit"), args.Target.Value, args.User); + } + } + + private void OnKeyInteract(Entity key, ref AfterInteractEvent args) + { + if (args.Handled) + return; + + if (!args.CanReach || args.Target is not { Valid: true } target) + return; + + if (TryComp(args.Target, out var lockComp) && + TryGetLockFromSlot(args.Target.Value, out var lockEnt)) + { + TryUseKeyOnLock(args.User, args.Target.Value, key, new Entity(lockEnt.Value.Owner, lockEnt.Value.Comp)); + args.Handled = true; + } + } + + private void OnLockpickToLockVerb(Entity lockpick, ref GetVerbsEvent args) + { + if (!args.CanInteract || !args.CanAccess) + return; + + if (!TryComp(args.Target, out var lockComp) || !lockComp.Locked) + return; + + if (!TryGetLockFromSlot(args.Target, out var lockItem)) + return; + + if (!TryComp(lockItem, out var lockItemComp)) + return; + + var target = args.Target; + var user = args.User; + + for (int i = DepthCompexity; i >= -DepthCompexity; i--) + { + var height = i; + var verb = new UtilityVerb() + { + Act = () => + { + TryHackDoorElement(user, target, lockpick, lockItemComp, lockComp, height); + }, + Text = Loc.GetString("cp-lock-verb-lockpick-use-text") + $" {height}", + Message = Loc.GetString("cp-lock-verb-lockpick-use-message"), + Category = VerbCategory.Lockpick, + Priority = height, + }; + + args.Verbs.Add(verb); + } + } + + private bool TryHackDoorElement(EntityUid user, EntityUid target, Entity lockpick, CPLockComponent lockEnt, LockComponent lockComp, int height) + { + if (lockEnt.LockShape == null) + return true; + + if (height == lockEnt.LockShape[lockEnt.LockpickStatus]) //Success + { + _audio.PlayPvs(lockpick.Comp.SuccessSound, target); + lockEnt.LockpickStatus++; + if (lockEnt.LockpickStatus >= lockEnt.LockShape.Count) // Final success + { + if (lockComp.Locked) + { + _lock.TryUnlock(target, user, lockComp); + _popup.PopupEntity(Loc.GetString("cp-lock-unlock-lock", ("lock", MetaData(lockEnt.Owner).EntityName)), target, user); + lockEnt.LockpickStatus = 0; + return true; + } + else + { + _lock.TryLock(target, user, lockComp); + _popup.PopupEntity(Loc.GetString("cp-lock-lock-lock", ("lock", MetaData(lockEnt.Owner).EntityName)), target, user); + lockEnt.LockpickStatus = 0; + return true; + } + } + _popup.PopupEntity(Loc.GetString("cp-lock-lockpick-success"), target, user); + return true; + } + else //Fail + { + _audio.PlayPvs(lockpick.Comp.FailSound, target); + if (_random.Prob(lockEnt.LockPickDamageChance)) // Damage lockpick + { + lockpick.Comp.Health--; + if (lockpick.Comp.Health > 0) + { + _popup.PopupEntity(Loc.GetString("cp-lock-lockpick-failed-damage", ("lock", MetaData(lockEnt.Owner).EntityName)), target, user); + } else + { + _popup.PopupEntity(Loc.GetString("cp-lock-lockpick-failed-break", ("lock", MetaData(lockEnt.Owner).EntityName)), target, user); + QueueDel(lockpick); + } + } + else + { + _popup.PopupEntity(Loc.GetString("cp-lock-lockpick-failed", ("lock", MetaData(lockEnt.Owner).EntityName)), target, user); + } + lockEnt.LockpickeddFailMarkup = true; + lockEnt.LockpickStatus = 0; + return false; + } + } + + private void OnKeyToLockVerb(Entity key, ref GetVerbsEvent args) + { + if (!args.CanInteract || !args.CanAccess) + return; + + if (!TryComp(args.Target, out var lockComp)) + return; + + if (!TryGetLockFromSlot(args.Target, out var lockItem)) + return; + + if (!TryComp(lockItem, out var lockItemComp)) + return; + + var target = args.Target; + var user = args.User; + + var verb = new UtilityVerb() + { + Act = () => + { + TryUseKeyOnLock(user, target, key, new Entity(target, lockItemComp)); + }, + IconEntity = GetNetEntity(key), + Text = Loc.GetString(lockComp.Locked ? "cp-lock-verb-use-key-text-open" : "cp-lock-verb-use-key-text-close", ("item", MetaData(args.Target).EntityName)), + Message = Loc.GetString("cp-lock-verb-use-key-message", ("item", MetaData(args.Target).EntityName)) + }; + + args.Verbs.Add(verb); + } + + private void OnLockInsertAttempt(Entity lockSlot, ref ContainerIsInsertingAttemptEvent args) + { + if (!lockSlot.Comp.Initialized) + return; + + if (args.Container.ID != lockSlot.Comp.LockSlotId) + return; + + if (!TryComp(args.EntityUid, out var lockComp)) + { + args.Cancel(); + return; + } + + if (lockComp == null) + return; + + //if (lockComp.Locked) + //{ + // _popup.PopupEntity(Loc.GetString( + // "cp-lock-lock-insert-fail-locked", + // ("lock", MetaData(args.EntityUid).EntityName), + // ("target", MetaData(lockSlot).EntityName)), lockSlot); + // args.Cancel(); + //} + } + + private void OnLockInserted(Entity lockSlot, ref EntInsertedIntoContainerMessage args) + { + if (!lockSlot.Comp.Initialized) + return; + + if (args.Container.ID != lockSlot.Comp.LockSlotId) + return; + + if (!TryComp(args.Entity, out var lockComp)) + return; + + _appearance.SetData(lockSlot, LockSlotVisuals.LockExist, true); + } + + private void OnLockRemoved(Entity lockSlot, ref EntRemovedFromContainerMessage args) + { + if (args.Container.ID != lockSlot.Comp.LockSlotId) + return; + _appearance.SetData(lockSlot, LockSlotVisuals.LockExist, false); + } + + public bool TryGetLockFromSlot(EntityUid uid, + [NotNullWhen(true)] out Entity? lockEnt, + LockComponent? component = null) + { + if (!Resolve(uid, ref component, false)) + { + lockEnt = null; + return false; + } + + if (component.LockSlotId == null) + { + lockEnt = null; + return false; + } + + if (_itemSlots.TryGetSlot(uid, component.LockSlotId, out ItemSlot? slot)) + { + if (TryComp(slot.Item, out var lockComp)) + { + lockEnt = new Entity(slot.Item.Value, lockComp); + return true; + } + else + { + lockEnt = null; + return false; + } + } + + lockEnt = null; + return false; + } + private bool TryUseKeyOnLock(EntityUid user, EntityUid target, Entity keyEnt, Entity lockEnt) + { + if (!TryComp(target, out var lockComp)) + return false; + + var keyShape = keyEnt.Comp.LockShape; + var lockShape = lockEnt.Comp.LockShape; + + if (keyShape == null || lockShape == null) + return false; + + if (keyShape == lockShape) + { + if (lockComp.Locked) + { + if(_lock.TryUnlock(target, user)) + _popup.PopupEntity(Loc.GetString("cp-lock-unlock-lock", ("lock", MetaData(lockEnt).EntityName)), lockEnt, user); + } + else + { + if (_lock.TryLock(target, user)) + _popup.PopupEntity(Loc.GetString("cp-lock-lock-lock", ("lock", MetaData(lockEnt).EntityName)), lockEnt, user); + } + return true; + } + else + { + _popup.PopupEntity(Loc.GetString("cp-lock-key-use-nofit"), lockEnt, user); + } + return false; + } +} + +[Serializable, NetSerializable] +public enum LockSlotVisuals : byte +{ + LockExist +} diff --git a/Content.Shared/Lock/LockComponent.cs b/Content.Shared/Lock/LockComponent.cs index 5587fc2698..221b2857a7 100644 --- a/Content.Shared/Lock/LockComponent.cs +++ b/Content.Shared/Lock/LockComponent.cs @@ -18,7 +18,7 @@ public sealed partial class LockComponent : Component /// [DataField("locked"), ViewVariables(VVAccess.ReadWrite)] [AutoNetworkedField] - public bool Locked = true; + public bool Locked = true; /// /// Whether or not the lock is toggled by simply clicking. @@ -71,6 +71,12 @@ public sealed partial class LockComponent : Component [DataField] [AutoNetworkedField] public TimeSpan UnlockTime; + + /// + /// CrystallPunk LockSystem Adapt: we need LockEntity in object, in slotId. + /// + [DataField] + public string? LockSlotId = string.Empty; } /// diff --git a/Content.Shared/Lock/LockSystem.cs b/Content.Shared/Lock/LockSystem.cs index 74cf5496d9..6f7769e708 100644 --- a/Content.Shared/Lock/LockSystem.cs +++ b/Content.Shared/Lock/LockSystem.cs @@ -1,6 +1,8 @@ using Content.Shared.Access.Components; using Content.Shared.Access.Systems; +using Content.Shared.CrystallPunk.LockKey; using Content.Shared.DoAfter; +using Content.Shared.Doors; using Content.Shared.Emag.Systems; using Content.Shared.Examine; using Content.Shared.Hands.Components; @@ -26,6 +28,7 @@ public sealed class LockSystem : EntitySystem [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedPopupSystem _sharedPopupSystem = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedCPLockKeySystem _lockCP = default!; //CrystallPunk Lock System Adapt /// public override void Initialize() @@ -40,6 +43,7 @@ public sealed class LockSystem : EntitySystem SubscribeLocalEvent(OnEmagged); SubscribeLocalEvent(OnDoAfterLock); SubscribeLocalEvent(OnDoAfterUnlock); + SubscribeLocalEvent(OnBeforeDoorOpened); //CrystallPunk Lock System Adapt } private void OnStartup(EntityUid uid, LockComponent lockComp, ComponentStartup args) @@ -52,17 +56,28 @@ public sealed class LockSystem : EntitySystem if (args.Handled) return; + //CrystallPunk LockSystem Adapt + // Only attempt an unlock by default on Activate - if (lockComp.Locked) - { - TryUnlock(uid, args.User, lockComp); - args.Handled = true; - } - else if (lockComp.LockOnClick) - { - TryLock(uid, args.User, lockComp); - args.Handled = true; - } + //if (lockComp.Locked) + //{ + // TryUnlock(uid, args.User, lockComp); + // args.Handled = true; + //} + //else if (lockComp.LockOnClick) + //{ + // TryLock(uid, args.User, lockComp); + // args.Handled = true; + //} + + //CrystallPunk LockSystem Adapt End + } + private void OnBeforeDoorOpened(EntityUid uid, LockComponent component, BeforeDoorOpenedEvent args) + { + if (!component.Locked) + return; + + args.Cancel(); } private void OnStorageOpenAttempt(EntityUid uid, LockComponent component, ref StorageOpenAttemptEvent args) @@ -78,10 +93,22 @@ public sealed class LockSystem : EntitySystem private void OnExamined(EntityUid uid, LockComponent lockComp, ExaminedEvent args) { - args.PushText(Loc.GetString(lockComp.Locked - ? "lock-comp-on-examined-is-locked" - : "lock-comp-on-examined-is-unlocked", - ("entityName", Identity.Name(uid, EntityManager)))); + //CrystallPunk Lock System Adapt Start + if (lockComp.LockSlotId != null && _lockCP.TryGetLockFromSlot(uid, out var lockEnt)) + { + args.PushText(Loc.GetString("cp-lock-examine-lock-slot", ("lock", MetaData(lockEnt.Value).EntityName))); + + args.PushMarkup(Loc.GetString(lockComp.Locked + ? "lock-comp-on-examined-is-locked" + : "lock-comp-on-examined-is-unlocked", + ("entityName", Identity.Name(uid, EntityManager)))); + if (lockEnt.Value.Comp.LockpickeddFailMarkup) + args.PushMarkup(Loc.GetString("cp-lock-examine-lock-lockpicked", ("lock", MetaData(lockEnt.Value).EntityName))); + } else + { + args.PushText(Loc.GetString("cp-lock-examine-lock-null")); + } + //CrystallPunk Lock System Adapt End } /// @@ -226,20 +253,24 @@ public sealed class LockSystem : EntitySystem private void AddToggleLockVerb(EntityUid uid, LockComponent component, GetVerbsEvent args) { - if (!args.CanAccess || !args.CanInteract || !CanToggleLock(uid, args.User)) - return; + //CrystallPunk Lock System Adapt - AlternativeVerb verb = new() - { - Act = component.Locked ? - () => TryUnlock(uid, args.User, component) : - () => TryLock(uid, args.User, component), - Text = Loc.GetString(component.Locked ? "toggle-lock-verb-unlock" : "toggle-lock-verb-lock"), - Icon = component.Locked ? - new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/unlock.svg.192dpi.png")) : - new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/lock.svg.192dpi.png")), - }; - args.Verbs.Add(verb); + //if (!args.CanAccess || !args.CanInteract || !CanToggleLock(uid, args.User)) + // return; + // + //AlternativeVerb verb = new() + //{ + // Act = component.Locked ? + // () => TryUnlock(uid, args.User, component) : + // () => TryLock(uid, args.User, component), + // Text = Loc.GetString(component.Locked ? "toggle-lock-verb-unlock" : "toggle-lock-verb-lock"), + // Icon = component.Locked ? + // new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/unlock.svg.192dpi.png")) : + // new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/lock.svg.192dpi.png")), + //}; + //args.Verbs.Add(verb); + + //CrystallPunk Lock System Adapt End } private void OnEmagged(EntityUid uid, LockComponent component, ref GotEmaggedEvent args) diff --git a/Content.Shared/Verbs/VerbCategory.cs b/Content.Shared/Verbs/VerbCategory.cs index d22041396f..31cbe58abe 100644 --- a/Content.Shared/Verbs/VerbCategory.cs +++ b/Content.Shared/Verbs/VerbCategory.cs @@ -76,6 +76,9 @@ namespace Content.Shared.Verbs public static readonly VerbCategory InstrumentStyle = new("verb-categories-instrument-style", null); + public static readonly VerbCategory Lockpick = + new("verb-categories-lockpick", "/Textures/Interface/VerbIcons/lock.svg.192dpi.png"); + public static readonly VerbCategory ChannelSelect = new("verb-categories-channel-select", null); public static readonly VerbCategory SetSensor = new("verb-categories-set-sensor", null); diff --git a/Resources/Audio/_CP14/Items/attributions.yml b/Resources/Audio/_CP14/Items/attributions.yml new file mode 100644 index 0000000000..c8bc529a55 --- /dev/null +++ b/Resources/Audio/_CP14/Items/attributions.yml @@ -0,0 +1,14 @@ +- files: ["key_drop.ogg"] + license: "CC0-1.0" + copyright: 'Kyanite_ of Freesound.org. Mixed from stereo to mono.' + source: "https://freesound.org/people/Kyanite_/sounds/432913/" + +- files: ["lockpick_use.ogg"] + license: "CC0-1.0" + copyright: 'by Fugeni of Freesound.org. Mixed from stereo to mono.' + source: "https://freesound.org/people/Fugeni/sounds/416286/" + +- files: ["lockpick_fail.ogg"] + license: "CC0-1.0" + copyright: 'by SinusPi of Freesound.org. Cropped and mixed from stereo to mono.' + source: "https://freesound.org/people/SinusPi/sounds/545044/" \ No newline at end of file diff --git a/Resources/Audio/_CP14/Items/key_drop.ogg b/Resources/Audio/_CP14/Items/key_drop.ogg new file mode 100644 index 0000000000000000000000000000000000000000..72707cce764d874f8afb4047d8fb6683179d33e6 GIT binary patch literal 14874 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 Q5|?Q_!p>?JqQWQqe<7QdhyVZp literal 0 HcmV?d00001 diff --git a/Resources/Audio/_CP14/Items/lockpick_fail.ogg b/Resources/Audio/_CP14/Items/lockpick_fail.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c2177b04a485f3014cd809ac944997a189b43214 GIT binary patch literal 9735 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 AF8}}l literal 0 HcmV?d00001 diff --git a/Resources/Audio/_CP14/Items/lockpick_use.ogg b/Resources/Audio/_CP14/Items/lockpick_use.ogg new file mode 100644 index 0000000000000000000000000000000000000000..04b5b58306b3433e4aa8777632f5725b782afba7 GIT binary patch literal 30898 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%0AHH8O<3(xVR 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 L`Pv%>Ll68PK>A^t literal 0 HcmV?d00001 diff --git a/Resources/Locale/ru-RU/lock/lock-component.ftl b/Resources/Locale/ru-RU/lock/lock-component.ftl new file mode 100644 index 0000000000..cdbd46575e --- /dev/null +++ b/Resources/Locale/ru-RU/lock/lock-component.ftl @@ -0,0 +1,9 @@ +lock-comp-on-examined-is-locked = [color=#a84032]Он заперт[/color]. +lock-comp-on-examined-is-unlocked = [color=#32a834]Он открыт[/color]. +lock-comp-do-lock-success = Вы заблокировали { $entityName }. +lock-comp-do-unlock-success = Вы разблокировали { $entityName }. + +## ToggleLockVerb + +toggle-lock-verb-unlock = Разблокировать +toggle-lock-verb-lock = Заблокировать diff --git a/Resources/Locale/ru-RU/lock/lock-crystall-punk.ftl b/Resources/Locale/ru-RU/lock/lock-crystall-punk.ftl new file mode 100644 index 0000000000..424ade295c --- /dev/null +++ b/Resources/Locale/ru-RU/lock/lock-crystall-punk.ftl @@ -0,0 +1,29 @@ +cp-lock-slot-component-slot-name-default = Замок + +cp-lock-examine-key = Высота зубчиков на ключе выстраивается в следующую последовательность: +cp-lock-examine-lock-slot = Здесь висит {$lock}. +cp-lock-examine-lock-null = Сюда можно прикрепить замок. +cp-lock-examine-lock-lockpicked = [color=#b57c3c]{$lock} выглядит потрепанным, словно в нем кто-то копался.[/color] + + +cp-lock-verb-use-key-text-open = Открыть {$item} +cp-lock-verb-use-key-text-close = Закрыть {$item} +cp-lock-verb-use-key-message = Использовать ключ, чтобы попытаться открыть или закрыть {$item}. + +cp-lock-unlock-lock = Вы открыли {$lock} +cp-lock-lock-lock = Вы заблокировали {$lock} + +cp-lock-key-use-nofit = Кажется, этот ключ сюда не подходит... +cp-lock-keyring-use-nofit = Кажется, ни один из ключей отсюда не подходит... +cp-lock-lock-insert-fail-locked = Сначала разблокируйте {$lock}, чтобы повесить его на {$target} +cp-lock-lock-remove-fail-locked = Сначала разблокируйте {$lock}, чтобы снять его с {$target} +cp-lock-target-use-failed-locked = {$target} не открывается + +cp-lock-verb-lockpick-use-text = Имитировать: +cp-lock-verb-lockpick-use-message = Попытаться имитировать элемент формы ключа. +verb-categories-lockpick = Взлом + +cp-lock-lockpick-success = Что-то в замке сдвигается... +cp-lock-lockpick-failed = {$lock} с громким щелчком встает на место. +cp-lock-lockpick-failed-damage = {$lock} с громким щелчком встает на место, надломив отмчычку. +cp-lock-lockpick-failed-break = {$lock} с громким щелчком встает на место, ломая вашу отмычку. \ No newline at end of file diff --git a/Resources/Maps/CrystallPunk/dev_map.yml b/Resources/Maps/CrystallPunk/dev_map.yml index 3b9dee4fb9..b88833ef8f 100644 --- a/Resources/Maps/CrystallPunk/dev_map.yml +++ b/Resources/Maps/CrystallPunk/dev_map.yml @@ -394,25 +394,25 @@ entities: - type: DayCycle timeEntries: - startColor: "#754a4a" #Рассвет - duration: 10 + duration: 30 isNight: false - startColor: "#e0ba87" #Полдень - duration: 10 + duration: 30 isNight: false - startColor: "#bfeeff" #Полдень - duration: 10 + duration: 30 isNight: false - startColor: "#385163" #Вечер - duration: 10 + duration: 30 isNight: true - startColor: "#060d12" #Ночь - duration: 10 + duration: 30 isNight: true - startColor: "#000000" #Ночь - duration: 10 + duration: 30 isNight: true - startColor: "#120906" #Ночь - duration: 10 + duration: 30 isNight: false - proto: AirAlarm entities: diff --git a/Resources/Prototypes/CrystallPunk/Entities/Markers/Spawners/jobs.yml b/Resources/Prototypes/_CP14/Entities/Markers/Spawners/jobs.yml similarity index 100% rename from Resources/Prototypes/CrystallPunk/Entities/Markers/Spawners/jobs.yml rename to Resources/Prototypes/_CP14/Entities/Markers/Spawners/jobs.yml diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Doors/wooden_doors.yml b/Resources/Prototypes/_CP14/Entities/Structures/Doors/wooden_doors.yml new file mode 100644 index 0000000000..62b4d42cc4 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Structures/Doors/wooden_doors.yml @@ -0,0 +1,67 @@ +- type: entity + parent: BaseMaterialDoorNavMap + id: CPBaseWoodDoor + name: деревянная дверь + description: Не самая прочная конструкция, но это лучше чем ничего. + suffix: Без замка + components: + - type: Sprite + sprite: Structures/Doors/MineralDoors/wood_door.rsi + layers: + - state: closed + map: ["enum.DoorVisualLayers.Base"] + - type: Door + bumpOpen: false + clickOpen: true + closeTimeOne: 0.2 + closeTimeTwo: 0.6 + openTimeOne: 0.6 + openTimeTwo: 0.2 + openSound: + path: /Audio/Effects/door_open.ogg + closeSound: + path: /Audio/Effects/door_close.ogg + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Wood + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Lock + locked: true + lockSlotId: lock_slot + - type: ItemSlots + slots: + lock_slot: + name: cp-lock-slot-component-slot-name-default + disableEject: true + insertOnInteract: false + ejectOnBreak: true + whitelist: + components: + - CPLock + - type: ContainerContainer + containers: + lock_slot: !type:ContainerSlot + +- type: entity + parent: CPBaseWoodDoor + id: CPWoodDoorTavern + suffix: Таверна + components: + - type: ItemSlots + slots: + lock_slot: + name: cp-lock-slot-component-slot-name-default + startingItem: LockTavern + disableEject: true + insertOnInteract: false + ejectOnBreak: true + whitelist: + components: + - CPLock \ No newline at end of file diff --git a/Resources/Prototypes/CrystallPunk/Entities/Structures/Furniture/chairs.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/chairs.yml similarity index 100% rename from Resources/Prototypes/CrystallPunk/Entities/Structures/Furniture/chairs.yml rename to Resources/Prototypes/_CP14/Entities/Structures/Furniture/chairs.yml diff --git a/Resources/Prototypes/CrystallPunk/Entities/Structures/Furniture/tables.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/tables.yml similarity index 100% rename from Resources/Prototypes/CrystallPunk/Entities/Structures/Furniture/tables.yml rename to Resources/Prototypes/_CP14/Entities/Structures/Furniture/tables.yml diff --git a/Resources/Prototypes/CrystallPunk/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/_CP14/Entities/Structures/Walls/walls.yml similarity index 79% rename from Resources/Prototypes/CrystallPunk/Entities/Structures/Walls/walls.yml rename to Resources/Prototypes/_CP14/Entities/Structures/Walls/walls.yml index 61cf0be2da..266632c0ab 100644 --- a/Resources/Prototypes/CrystallPunk/Entities/Structures/Walls/walls.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Walls/walls.yml @@ -37,6 +37,20 @@ key: CPwallswood base: wood +- type: entity + id: CaveStoneWall + name: каменная порода + parent: CPBaseWall + description: Прочная каменная природная стена. От нее веет пещерным холодом. + components: + - type: Sprite + sprite: CrystallPunk/Structures/Walls/cave_stone.rsi + - type: Icon + sprite: CrystallPunk/Structures/Walls/cave_stone.rsi + - type: IconSmooth + key: CPwallsbrick + base: stone + - type: entity id: StoneRuinFragment parent: BaseRock diff --git a/Resources/Prototypes/_CP14/Entities/keyrings.yml b/Resources/Prototypes/_CP14/Entities/keyrings.yml new file mode 100644 index 0000000000..1da63d30d1 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/keyrings.yml @@ -0,0 +1,41 @@ +- type: entity + parent: BaseItem + id: BaseKeyRing + suffix: Пустое + name: кольцо для ключей + description: Позволяет комфортно хранить большое количество ключей в одном месте. + components: + - type: CPKeyRing + - type: Sprite + sprite: CrystallPunk/Objects/keys.rsi + layers: + - state: keyring + - state: ring-0 + map: ["enum.StorageFillLayers.Fill"] + - type: Appearance + - type: StorageFillVisualizer + maxFillLevels: 4 + fillBaseName: ring + - type: Storage + grid: + - 0,0,5,0 + maxItemSize: Small + whitelist: + tags: + - CPKey + - type: UserInterface + interfaces: + - key: enum.StorageUiKey.Key + type: StorageBoundUserInterface + - type: ContainerContainer + containers: + storagebase: !type:Container + +- type: entity + parent: BaseKeyRing + id: KeyRingInnkeeper + suffix: Трактирщик + components: + - type: StorageFill + contents: + - id: KeyTavern \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/keys.yml b/Resources/Prototypes/_CP14/Entities/keys.yml new file mode 100644 index 0000000000..94b6d5c357 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/keys.yml @@ -0,0 +1,42 @@ +- type: entity + parent: BaseItem + id: BaseKey + abstract: true + name: ключ + description: Небольшая заковыристая железяка, открывающая определенные замки. Не отдавайте кому попало! + components: + - type: Tag + tags: + - CPKey + - type: Item + size: Tiny + - type: Sprite + sprite: CrystallPunk/Objects/keys.rsi + - type: CPKey + autoGenerateShape: Debug + - type: EmitSoundOnLand + sound: + path: /Audio/_CP14/Items/key_drop.ogg + params: + variation: 0.05 + +- type: entity + parent: BaseItem + id: BaseLockpick + name: отмычка + description: Воровской инструмент, при должном умении и сноровке позволяющий взламывать любые замки. + components: + - type: Sprite + sprite: CrystallPunk/Objects/keys.rsi + state: lockpick + - type: CPLockpick + +- type: entity + parent: BaseKey + id: KeyTavern + name: ключ от таверны + components: + - type: Sprite + state: key1 + - type: CPKey + autoGenerateShape: Tavern \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/locks.yml b/Resources/Prototypes/_CP14/Entities/locks.yml new file mode 100644 index 0000000000..8dc7183bb3 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/locks.yml @@ -0,0 +1,22 @@ +- type: entity + parent: BaseItem + abstract: true + id: BaseLock + name: стальной замок + description: Он запирает вещи. И вам потребуется ключ, чтобы открыть их обратно. + components: + - type: CPLock + lockPickDamageChance: 0.2 + autoGenerateShape: Debug + - type: Sprite + sprite: CrystallPunk/Objects/keys.rsi + layers: + - state: lock + +- type: entity + parent: BaseLock + id: LockTavern + name: замок от таверны + components: + - type: CPLock + autoGenerateShape: Tavern \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/LockCategories/LockCategory.yml b/Resources/Prototypes/_CP14/LockCategories/LockCategory.yml new file mode 100644 index 0000000000..e9cb6787a7 --- /dev/null +++ b/Resources/Prototypes/_CP14/LockCategories/LockCategory.yml @@ -0,0 +1,7 @@ +- type: CPLockCategory + id: Debug + complexity: 10 + +- type: CPLockCategory + id: Tavern + complexity: 3 \ No newline at end of file diff --git a/Resources/Prototypes/CrystallPunk/Roles/Jobs/Mercenary/adventurer.yml b/Resources/Prototypes/_CP14/Roles/Jobs/Mercenary/adventurer.yml similarity index 100% rename from Resources/Prototypes/CrystallPunk/Roles/Jobs/Mercenary/adventurer.yml rename to Resources/Prototypes/_CP14/Roles/Jobs/Mercenary/adventurer.yml diff --git a/Resources/Prototypes/CrystallPunk/Roles/Jobs/departments.yml b/Resources/Prototypes/_CP14/Roles/Jobs/departments.yml similarity index 100% rename from Resources/Prototypes/CrystallPunk/Roles/Jobs/departments.yml rename to Resources/Prototypes/_CP14/Roles/Jobs/departments.yml diff --git a/Resources/Prototypes/CrystallPunk/Roles/play_time_tracker.yml b/Resources/Prototypes/_CP14/Roles/play_time_tracker.yml similarity index 100% rename from Resources/Prototypes/CrystallPunk/Roles/play_time_tracker.yml rename to Resources/Prototypes/_CP14/Roles/play_time_tracker.yml diff --git a/Resources/Prototypes/CrystallPunk/Tiles/natural.yml b/Resources/Prototypes/_CP14/Tiles/natural.yml similarity index 100% rename from Resources/Prototypes/CrystallPunk/Tiles/natural.yml rename to Resources/Prototypes/_CP14/Tiles/natural.yml diff --git a/Resources/Prototypes/_CP14/tags.yml b/Resources/Prototypes/_CP14/tags.yml new file mode 100644 index 0000000000..036e2e097e --- /dev/null +++ b/Resources/Prototypes/_CP14/tags.yml @@ -0,0 +1,2 @@ +- type: Tag + id: CPKey \ No newline at end of file diff --git a/Resources/Textures/CrystallPunk/Objects/keys.rsi/base.png b/Resources/Textures/CrystallPunk/Objects/keys.rsi/base.png deleted file mode 100644 index 3832afa90690f6eb8298c019cb834fddab178169..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}r#xL8Ln2y} z6C_v{Cy4MEB&dWx-gGtlpYrF$PR=Kcx^;XFPP;B$A}Ij`arV_-+mvUVC}cQO6rSzv z2EsF(PcZ5{$*B7Hg!gc_dj5kyrHz0Fj(t+UB7{(sMZkRa#kBfLQQD@=>|BuWpgU|#X4A$9fjKkn;gJ6Tgi zkG^0CGn}}1x|U+W&nvEN`~FFO;b)9s4GEdy_`fPaq^Bv+L6?ESD$-_EMD)W1psyG_ MUHx3vIVCg!0P4?bT>t<8 diff --git a/Resources/Textures/CrystallPunk/Objects/keys.rsi/key1.png b/Resources/Textures/CrystallPunk/Objects/keys.rsi/key1.png new file mode 100644 index 0000000000000000000000000000000000000000..f1cbbc5907dd9d61f633a38c0dbd0791c6dcb85e GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}dp%toLn2y} z6C_v{Cy4Yk1sZUZS6~0r&&8{F%10tW z$!+4KNkYvlrkH>+kbQX5)$D)z(R-iSp9zwvefukyEyXa2A#mN=%&hYh zn&ar^Hp$UDc%<|{Ln2z= zUNGc3WFW%!VE+SA8LpXJl9N8ac;w4cC~)xZT0f`EXgI&j|0FsuB`<_0IaujJw}1JJJ6AFb9K2 z=%OF8jC{+zZREeZzH*+iAcQmf%N$SVwHIHs3toG%o^^VM9z#vtT((vN#THJ61tFbV wt~~zP6twgQ*CW-Le(8`J%F?7^S{Dyobx=TB>~7 z$;&sqrpax$_G^!2W%!*uKiMZ>RisnxjBwQ@4<9ix*va)9Djs8D01BR4dgna%o`0{Z iEW;nMC@C$f|IWgr9iXDpfB!wu#SEUVelF{r5}E+g5?*Tn literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Objects/keys.rsi/key12.png b/Resources/Textures/CrystallPunk/Objects/keys.rsi/key12.png new file mode 100644 index 0000000000000000000000000000000000000000..ecfa6ab9a297c1a05458c253919d405d53f36289 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}OFdm2Ln2z= zo;T!bF%V$A@P1SHhJfI+x<_tt=RFVOPLi^1R9ew~;gHz_!%d+smvY{0`>~$WhwYzy zLq|skQ%GrY>Fvn7W!qLszyAMv+ve-v``k}V>QL}AK9b2M*r@&3>3S|Z!+x9Rp7(8n*WM^<#$?|uD!^$UfTDkNJ_P+RB h=ej)zXv@Ew;%6emh0D9bxq%L5@O1TaS?83{1OUbTUiAO~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Objects/keys.rsi/key13.png b/Resources/Textures/CrystallPunk/Objects/keys.rsi/key13.png new file mode 100644 index 0000000000000000000000000000000000000000..3ccfd054371facb6a4e91b8a1ab69baafc1cfbd2 GIT binary patch literal 276 zcmV+v0qg#WP)Px#&PhZ;R9J=W(J^YnFcik|zeAu|GJ3GBN#MagPqQ>+?imW9LkVQhmQ00GFZK!2 zEr+lNuL2*SOFJo(ib{qkkRg!wn}qbF_elaFgb?E1MIlAok54z*nxVC(svBF?jrE(iU5}gd*Ukw_ynI{R)$2>-#>NaNl~5Kr z0BzU*)s{t0+x3)1PRNUlLzB8&xn{-;7&8E%RDuh&|2m*l@-Ng?0{92M?=~0zwGcuG aakGw!Mn-w69+Z>-0000Px#u}MThR9J=W(y9R!q8N~wPrNkZGh(T|1$0Is(?)5%zLPogIYS!;>Yj5y7( z){+;c&x_J`Wkdbb`MbU(bUB?_EoKqGe7W|{wHT9hK2p^Uc~SbRZX~T`1Hf~m(Ac>a x=UM=aNeDxQnv{5e*NyhO&DZ{bQc5ZHa}V$JJ>9AwFtPvu002ovPDHLkV1nSUY61WN literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Objects/keys.rsi/key15.png b/Resources/Textures/CrystallPunk/Objects/keys.rsi/key15.png new file mode 100644 index 0000000000000000000000000000000000000000..18a372694fefdd3a435fb9e28ad009ca255f8909 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}TRmMILn2z= zUfjra$UxxO$9mTbM>jg(_Ni2h6-l4(D8Mdw=WdD65xuwC9KVFDcCh_o(6c(K85Ho4 zjs4(nU-un%$`uz(3G({8+vC!fTkmR?-(`AGwcA*V&+gvo?n~dRV=u-uv@JOql5r`-5Dm|JY*f7=<`V^h@by!xEP1?YsGV+ z7U7HuK28x@b38l6SM1N&9M|pfi@Ln2y} z6C_v{Cy4Yk1sZU+qymlxuwgBlX7 b%zO+gQ(a5d`X@dEI-SAO)z4*}Q$iB})Gbpr literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Objects/keys.rsi/key17.png b/Resources/Textures/CrystallPunk/Objects/keys.rsi/key17.png new file mode 100644 index 0000000000000000000000000000000000000000..124b5c012e473a477c028812a72d91d774ceb0c9 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}3p`yMLn2z= zUNGcpHV|QZV81lH;Nsi6PILAqm|Ke;(K*Q(#qw6Mq=2`gr^Jg>^@50u)t~#HoIXAH ztIr@PD46=<*TL-My=K?S|2_z|y%jNk)%`g|vs_qQBNu9DcW^k(sJO5x&*Q2y)0xLD z+g66&zLF)Uen;M4=QUgI8h%s0$-8YC<`hfYo0sOb7ytfkJLmCkXXYdERlDP^_y>1% cbo{%?ZR{43c)dkB5a?D0Pgg&ebxsLQ0EUuT-T(jq literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Objects/keys.rsi/key18.png b/Resources/Textures/CrystallPunk/Objects/keys.rsi/key18.png new file mode 100644 index 0000000000000000000000000000000000000000..a60de847dd78eb525162364ac1cd03b846332ba1 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}`#oJ8Ln2z= zUNq!7WFT_vW4+^rqs$_k$}-L`?tb(}lBH1K;9XyJ$2XVe9ms2{V3v(pEGrXR(iObr zQ9@VugWtXB{S?7-H6$@0$DV^j-^3UWe5;3toj=Ic&Q* z>(Rd&t0eYgo>^tTnHd5lY_irR&f)voo@^}j#b)<4D|gNL8ax{g>qc)*wEMbl2TQ|q zure_J_hd{|?q`S-dLhvJd*yO`gwx-OZQQvvcGgQu&X J%Q~loCIAJ}bo^Mo|Z)c;Yr5xI8p>&|8w7N3fH-DL3P#rIuHBKZQoe$D!9~`T@J6A8VtTz%+>ebdZsqF@z;UBd7nSd=T>YHuz$|DGSrjtq|)&$pidY)UHx3v IIVCg!0Onz5ga7~l literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Objects/keys.rsi/key3.png b/Resources/Textures/CrystallPunk/Objects/keys.rsi/key3.png new file mode 100644 index 0000000000000000000000000000000000000000..96d8786e2422c1fe03ee3e36148913e30ee4b325 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}yFFbTLn2z= zUb5youOW~ zAzdc1bJx!tIKyYWL7_#!>5ujCWtr6$*Y@VIH@tp(uEc0tRr=!8%S)yl`pO(*@1W^A zDXnx;+SZk`|JdHzuq$O>%=Ohr&lv8!CYty{@Vhd@r$s97+~o^RWNPN#-*)#(%v5nz zhN$q2SVn<1x#gdqs?OSXOsqm~$NgNX-^@-Nibu}dGDLAXRmvEjlmvQ%!PC{xWt~$( F69532WvT!G literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Objects/keys.rsi/key4.png b/Resources/Textures/CrystallPunk/Objects/keys.rsi/key4.png new file mode 100644 index 0000000000000000000000000000000000000000..0aa950808da1890c1bd42447963715465053dfe4 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}2R&UJLn2z= zUNYo5WFT_vW4*(Lqs$_k$}-Mh))P%Xuh7xV@h;DbGfBLfX*cI1-dhW^w=^&A_A8w* ztxuMTZ{PhX6TW}i=itDh*z%)%mG{N8`W0=>b`0mQ&pugkW###(hA%~HZ~Z?0m(4+h zjZ48!EmVX}%TCQVwl+=mK+eWh(>||Ub^X|sjJFS}^%x@KfMjHxiS54UWn33u3o-0l zzowm0A~?y1v*8-w@-IEt_)2$_NoX_P5`VWXJG&li=}vy;1$Il4&b^oq^bCWitDnm{ Hr-UW|e5GoL literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Objects/keys.rsi/key5.png b/Resources/Textures/CrystallPunk/Objects/keys.rsi/key5.png new file mode 100644 index 0000000000000000000000000000000000000000..6d16265fc34d45a28777c0fe4954d3fbfe485d3f GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}yFFbTLn2z= zUNGc3WFT_vW4+^rqZb!W(44T)wqLJnbGpD0N0xH)xhxyI=Q)`3U*wBrwr%M4D>c03 zc~5KK{V6R^_D<)Y66CeAUffeJ_gnj}+nLM-yX|N6xX0g5JsxZ;^Tl;*^d#?Vx4!TC zp2Z+AtEJZBbazmYn1Gr=^qN;sYouDYeiuDk)5BL2p_?$wf`SsV|b+ znwsBlSE*Fdk5^D=5peorExIXlSH!NWwOj|@{#$T6lYOqXuEVz5*7db}=P+iNN^AKA zJwI=seZMN)i7Drk>0(EJ#xL#3={>HmJ1ji!KCED>IQuuMV*$faRtDGNWSwIX3|sml uQg3hH_=Vx$>SvohGwU5V6kC4mR6ly!qtJBK(;q;`GkCiCxvXPx#xJg7oR9J=W(Y*@7Fc84;e?`#6u|q$mJd-Ypv(F%ig9z?!ItgNy<`o2eiFW83 z=mWUu6ep!BVg?7n`z@D)OYV+<5JCv??*gBq)pqAP?G^y1^M%oH@b;e0jO+KhUhe`l ze2SD(gmFR`Cn%-RnQ=NZ?zu5QUX%~{CrzKCQ<@=A@jh+eMBzu~hGl;8eW*CeHDKw~FhnR@-9{YjZy2vvPNTH#KJF zPh(S1Qd-25d%b(3Ur*_!vb{E^C0;+d`{$IB`jV|~k>(n&*`l(KBwspX;J5i`;lGrb z!n@|_-^dMPWmvPl`lFr0%B*is4g3tQc}CTjF?{$j^E=}`c7}$at9$!R!@n`UbYK2> i;g2kCLBWgmyBS|+_+S1T-}eLPUPx#vq?ljR9J=W(yv3&(tmzXP-e32NB%ebP~ia?JEfS67A46 zkOy$lDNc zNPswweLZ+GATLUnrHRUm(p7a6(l$K6>2PE*n<#+keCdp_XdU?=09D=a>G0qHaNoKe zV2s5W3xL*chw00000NkvXXu0mjfM%HMU literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Objects/keys.rsi/keyring.png b/Resources/Textures/CrystallPunk/Objects/keys.rsi/keyring.png new file mode 100644 index 0000000000000000000000000000000000000000..d9632909897e7857e83cc45dc9a87d801b5220f7 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}vproLLn2z= zUQy&bWFXT1kza4aTb7oBg|l{XiA>sglePOXp9PQl;=7z}N{Sm=-d^N9^k04Um#@a_ z6+XQeo92D{?ml*nQ(bzlU7MI5l-SI8=3Dni@IzIc`P^s%T*?3d literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Objects/keys.rsi/lock.png b/Resources/Textures/CrystallPunk/Objects/keys.rsi/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..f5da11ad68e90c7dc14b7ca69754d1fa3001f962 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^TFU3qUM>IaQ&S#kCD+Ni>LE# zD*d_&ff_`XG>USI8?K4i(Gl~uz@bb}KtyoqjUqNSE~f)`Z%=lN^6Pte>gj3`%Z5co z4({Qzl}<}aoY3eJzVzu|vUi97Je%|ggKVLb&nAX8sV;f?*Iius_@_VvF1Ldk2|&QW ZkdWl`ZS`D#7GUr&c)I$ztaD0e0ss;gf;j*H literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Objects/keys.rsi/lockpick.png b/Resources/Textures/CrystallPunk/Objects/keys.rsi/lockpick.png new file mode 100644 index 0000000000000000000000000000000000000000..09bc94a0e1adcb6f14d336d983cb1e7e7f3d5abf GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}J3U<-Ln2y} z6C_v{Cy4Yk1sZU<9b{m3ixD~BPndMF+ON-YzKt1pn%Pw<(rqeOF|Yl=R%8ygqjS*$p{gXZ=56!jqA? z%BaK3(|AwaH<8u07P1$D!cRtAzVh$?B?Wc})uc*XMaSfSB*u1QZw;-5D2j067evu6{1-oD!Ma$N literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Objects/keys.rsi/ring-2.png b/Resources/Textures/CrystallPunk/Objects/keys.rsi/ring-2.png new file mode 100644 index 0000000000000000000000000000000000000000..22bed39b4229071cfed91616c5e82617dde66b18 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Gd*1#Ln2y} z6C_v{Cy4Yk1sZU7P4AOF87 z>&lg&=q`Nb(Dn24f@GLdGS_8h{a?RyWtWoMI%khQrWx-i>Ml_c@hD^1lzM&L{blt^ zE`9}3vsUq#`o2w3ci1FT@b*`(NSSx6YOOQFT_-Q+1|@?9)A~V9XyavIIBscdU+KE; QC(w}$p00i_>zopr0EzZb8UO$Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Objects/keys.rsi/ring-3.png b/Resources/Textures/CrystallPunk/Objects/keys.rsi/ring-3.png new file mode 100644 index 0000000000000000000000000000000000000000..289e821b5a8e7adfd866811f23a317109f27f0d5 GIT binary patch literal 261 zcmV+g0s8)lP)Px#zez+vR9J=Wk}(d#FbqW<#8o=9H$cqXAX#z~q>7P=YS2A!+kAQ>_zOAiqy zBh$@6r4sl}u_gO|+W`;+K@fz0M{x^o_eZ9&HCoY}HJa6P&ozJ|!#HICfMJ~SoFZEo z*_9OG#B+*pIvy0}mfKmyfHhh~IZt4o!uFuQ-ss`wtoeyxmoIlz?5jb_*^%>uru&KBp2tUIU=)+U8cjaPyJDaPU;cPEB*=VV?2IsKk4jv*1P zZ?A3SY%maMc^GWewWA?vqF({8HM>xbjN69I0&_jN1x1dW+jHput|dG5Cp=R5^xY-* zdj2#9bA6$Iwe)UIn+a literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/meta.json b/Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/meta.json new file mode 100644 index 0000000000..cfdbf13d6a --- /dev/null +++ b/Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/meta.json @@ -0,0 +1,46 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 48 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Created by TheShuEd (Discord) for CrystallPunk14", + "states": [ + { + "name": "wood0", + "directions": 4 + }, + { + "name": "wood1", + "directions": 4 + }, + { + "name": "wood2", + "directions": 4 + }, + { + "name": "wood3", + "directions": 4 + }, + { + "name": "wood4", + "directions": 4 + }, + { + "name": "wood5", + "directions": 4 + }, + { + "name": "wood6", + "directions": 4 + }, + { + "name": "wood7", + "directions": 4 + }, + { + "name": "full" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood0.png b/Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood0.png new file mode 100644 index 0000000000000000000000000000000000000000..7379d543e168aa901aa00f444ba45d3f1f52c7c0 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^4nUm1!3HGP9xZtRq!^2X+?^QKos)S9WH)=dIEGZr zc{|6@i#bq&t^Q~dztEnBq=|YH4&UI2Q=Xe4e8K62DbvfK4l~8?ouLP+_8+bMmGT7oN#~lvcRG~Gk+j3jEFypFK+jiS-$~R_QHDhwY z&)3#wZHyU=Qp^{aOxPB%X7D(0Uyx`JTVTkb>yXS4)v)Y0!$+TjH$M40XIwAa-k)Bj z`O&3g&U0T!nFO=l^A0g9^KGcBmEZgA^<(3^cFTVAJK{3v7{eBZUYJcEeKxf2jB}EC z@a&yg)c%`$mU0QcC}n*0exrRSb5E_{+L!=GKL_sje`dbh&x-CM6oc-v3ryUX`AAaf zc{Tg75Bl>IgO2u|{3u*tBj(zb>@vzhVl|KPbAfd6;cJXV}K? bGBwPsdBz3@88XiTPp(6#O#i%Nso z1zgxfeu0g^%5z`LX6w%Np2qy5({F0g-^zL3)(hVM{=b*mZ~k*u6PdI3S%e+9GlU4> zQ^p6^pDyL(cdJyY-d+2@Qp=_%xctWZU5Rr}z5f-K`A^7$L3e>Ck+`y}zT?h(L7Pvn oYQI)DKPz`&%3$;*5}(z7{!(>^mgdSuzz}EfboFyt=akR{0Ft+s?f?J) literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood2.png b/Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood2.png new file mode 100644 index 0000000000000000000000000000000000000000..7379d543e168aa901aa00f444ba45d3f1f52c7c0 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^4nUm1!3HGP9xZtRq!^2X+?^QKos)S9WH)=dIEGZr zc{|6@i#bq&t^Q~dztEnBq=|YH4&UI2Q=Xe4e8K62DbvfK4l~8?ouLP+_8+bMmGT7oN#~lvcRG~Gk+j3jEFypFK+jiS-$~R_QHDhwY z&)3#wZHyU=Qp^{aOxPB%X7D(0Uyx`JTVTkb>yXS4)v)Y0!$+TjH$M40XIwAa-k)Bj z`O&3g&U0T!nFO=l^A0g9^KGcBmEZgA^<(3^cFTVAJK{3v7{eBZUYJcEeKxf2jB}EC z@a&yg)c%`$mU0QcC}n*0exrRSb5E_{+L!=GKL_sje`dbh&x-CM6oc-v3ryUX`AAaf zc{Tg75Bl>IgO2u|{3u*tBj(zb>@vzhVl|KPbAfd6;cJXV}K? bGBwPsdBz3@88XiTPp(6#O#i%Nso z1zgxfeu0g^%5z`LX6w%Np2qy5({F0g-^zL3)(hVM{=b*mZ~k*u6PdI3S%e+9GlU4> zQ^p6^pDyL(cdJyY-d+2@Qp=_%xctWZU5Rr}z5f-K`A^7$L3e>Ck+`y}zT?h(L7Pvn oYQI)DKPz`&%3$;*5}(z7{!(>^mgdSuzz}EfboFyt=akR{0Ft+s?f?J) literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood4.png b/Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood4.png new file mode 100644 index 0000000000000000000000000000000000000000..4e2f0b9e1a0a0fb3a11de678783581762ffb7430 GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^4nUm1!3HGP9xZtRq!^2X+?^QKos)S9WJi0tIEGZr zd3)Q?i#brl?V-(2w*UB3_Itz1JN4m~HQXuA2)5@ z&pKv_V=Ha#ZKug#zfZ+r#~j0=rf}V%)_2q@ihclQe(Oi*@W1?k(3_!fp__FXP{K`DY(z+&q)A ziTl~puNAY8DK7u4dfB3;`p?4;d!mj0AD(pZew z1IAsf2D}ScO>p7a{2P8aJgNG-{)Z)Mo-bWD-US9bgQu&X%Q~loCIEXu BoY4RP literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood6.png b/Resources/Textures/CrystallPunk/Structures/Walls/TEMPLATE_LONG.rsi/wood6.png new file mode 100644 index 0000000000000000000000000000000000000000..4e2f0b9e1a0a0fb3a11de678783581762ffb7430 GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^4nUm1!3HGP9xZtRq!^2X+?^QKos)S9WJi0tIEGZr zd3)Q?i#brl?V-(2w*UB3_Itz1JN4m~HQXuA2)5@ z&pKv_V=Ha#ZKugZ&cgvb2LhIVZh2$xe$wu(fSrxUlHHCR^UwT0p78GX@7rhQKQGOBW1il{q_5we(`D$r-6WZSfrir ozdHZpKim5I4LIC@MbBsU^Xqx`O<2+A3Jd}UPgg&ebxsLQ0Eh=}p#T5? literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Structures/Walls/cave_stone.rsi/full.png b/Resources/Textures/CrystallPunk/Structures/Walls/cave_stone.rsi/full.png new file mode 100644 index 0000000000000000000000000000000000000000..1a8030fc5510a37056536473c6b97d3414a2d378 GIT binary patch literal 1039 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 Bm)HOR literal 0 HcmV?d00001 diff --git a/Resources/Textures/CrystallPunk/Structures/Walls/cave_stone.rsi/stone6.png b/Resources/Textures/CrystallPunk/Structures/Walls/cave_stone.rsi/stone6.png new file mode 100644 index 0000000000000000000000000000000000000000..8fe504833c58612e2b6e35e25c368ee43252fef5 GIT binary patch literal 1176 zcmV;J1ZVq+P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1T9HKK~#8N?VG=A z6hRnn6r#`EzVXYjmy^uS&D>oc7>k+T_CD|DXM;5CEU(EKJup^`kB|K|z>xbHLtqd<{IAuYZeKUq7=S0< zXe^hDeWScnIPtAKAe3wjfV(e#{p6P5Y%}+-gXB4Y_{aU_`gnkhAn}`dKu_d=iDO60 z-M>BJA*TC776zDq`>q%r8F6do+4J(WNlfvOMF=R{3&lRPGeA#-fa*PH|9f@CT_IKp zgyaVJ{NVtGL}jZiCSihBNK$oBohe;H)z9I5Kg{38+GGtD25T zCANiyX1^aQAe3k!(5`+@ojp_T(h|)8tunW={NmD5d6Jf>ApjVG5Rm)J^&z$ULy{_> zPOqKuIzdze_#vRi25i@tlBfny5~P$-+NkTQ0_1@li0%P?C9th-4n+3=B|(AkT*O1i zlAt<0wYOY*z6$syP}#o|J^ud^%>cf5LH5_@ubwW0o3+7q44#^(9w4ay%KoYV@`BVv ze;ZU7R0+-@5q7K!_~eoZgRRd%L!)iq8+f`JcvStF9LiwuKfnsY&Fx3ds;6u#0&j+0 z9|DSPD<0UZ?h88vIWc*BgE3N3g8_!tg(1p9#gXYVNi3lGFsd-;JAh*ASyY z$MtJh-Sykj_w_Hm8gi;BlJFd=Ky5j|iWGLbEByOPj;RR#%a!HzIorPZ>CEEaU-03uklzAT=wJpe8AWrTOs0@dyhBW7Jm1KqYwyAfn2xIU@v^ zDk0cH$nXo4e&}q4EIa@sFjw3^vadWXiu(^9mb)fatPPp24*_xjag7n=*18IbugVpn z21p(Ph>|<&KTAnGXI8w*q41~BTOqjzFjTef-3knVXQ%>b>KvK`vkC!g2nnV_&@5R` zu%Yr|=1F%OKuJ)d5Q<1Y*7e=N_m-}I7qH?5KT9wlQM4C$3=2brl0_>l@p`&Siu%Bc qK|uF8vjz(xiyTmHw?tS76vZEac3-VLXk=6X0000Yp>)L-??sC+Af-{$#5-*Va-y82yey>)0h%;Sr0^UHEi{H z&-}0M{P{~9FaZ$;94e6|y6qhPvm%*-EO$ym-#L}1ZruxyD4