diff --git a/Content.Client/Lobby/LobbyUIController.cs b/Content.Client/Lobby/LobbyUIController.cs index 6b1620b4bf0..16d9866fa8b 100644 --- a/Content.Client/Lobby/LobbyUIController.cs +++ b/Content.Client/Lobby/LobbyUIController.cs @@ -565,6 +565,21 @@ public EntityUid LoadProfileEntity(HumanoidCharacterProfile? humanoid, JobProtot { // Special type like borg or AI, do not spawn a human just spawn the entity. dummyEnt = EntityManager.SpawnEntity(previewEntity, MapCoordinates.Nullspace); + + // Lust-start + // У синтов тоже могут быть лоадауты, брух + if (humanoid != null && job != null && jobClothes) + { + GiveDummyJobClothes(dummyEnt, humanoid, job); + + if (_prototypeManager.HasIndex(LoadoutSystem.GetJobPrototype(job.ID))) + { + var loadout = humanoid.GetLoadoutOrDefault(LoadoutSystem.GetJobPrototype(job.ID), _playerManager.LocalSession, humanoid.Species, EntityManager, _prototypeManager, sponsorPrototypes); + GiveDummyLoadout(dummyEnt, loadout, jobClothes); + } + } + // Lust-end + return dummyEnt; } else if (humanoid is not null) diff --git a/Content.Server/Station/Systems/StationSpawningSystem.cs b/Content.Server/Station/Systems/StationSpawningSystem.cs index 6f3c3700abb..4c96176f387 100644 --- a/Content.Server/Station/Systems/StationSpawningSystem.cs +++ b/Content.Server/Station/Systems/StationSpawningSystem.cs @@ -27,6 +27,8 @@ using Robust.Shared.Prototypes; using Robust.Shared.Utility; using Content.Sunrise.Interfaces.Shared; +using Content.Shared.Clothing.Components; +using Content.Server._Lust.Silicons.Borgs; namespace Content.Server.Station.Systems; @@ -145,6 +147,14 @@ public EntityUid SpawnPlayerMob( // Make sure custom names get handled, what is gameticker control flow whoopy. if (loadout != null) { + // Lust-start + EquipRoleLoadout(jobEntity, loadout, roleProto!); + if (prototype.StartingGear is not null) + { + var startingGear = _prototypeManager.Index(prototype.StartingGear); + EquipStartingGear(jobEntity, startingGear, raiseEvent: false); + } + // Lust-end EquipRoleName(jobEntity, loadout, roleProto!); } diff --git a/Content.Server/_Lust/Borgs/BorgModuleInnateComponent.cs b/Content.Server/_Lust/Borgs/BorgModuleInnateComponent.cs new file mode 100644 index 00000000000..c500cc08076 --- /dev/null +++ b/Content.Server/_Lust/Borgs/BorgModuleInnateComponent.cs @@ -0,0 +1,44 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Server._Lust.Silicons.Borgs; + +/// +/// Компонент, позволяющий давать боргам действия (экшены) и компоненты через модуль +/// +[RegisterComponent] +public sealed partial class BorgModuleInnateComponent : Component +{ + /// + /// Предметы, которые активируются прямо в руке + /// + [DataField] + public List UseItems = new(); + + /// + /// Предметы, с помощью которых можно взаимодействовать с сущностями + /// + [DataField] + public List InteractionItems = new(); + + /// + /// Компоненты, которые будут добавлены боргу при установке модуля + /// Будут удалены после его изъятия! + /// + [DataField] + public ComponentRegistry InnateComponents = new(); + + /// + /// Айди добавленных предметов этим модулем + /// Данный список нужен сугубо для корректной очистки + /// + [ViewVariables, Access(typeof(BorgModuleInnateSystem))] + public List InnateItems = new(); + + /// + /// Экшены для борга, созданные данным модулем + /// Данный список нужен сугубо для корректной очистки + /// + [ViewVariables, Access(typeof(BorgModuleInnateSystem))] + public List Actions = new(); +} diff --git a/Content.Server/_Lust/Borgs/BorgModuleInnateSystem.cs b/Content.Server/_Lust/Borgs/BorgModuleInnateSystem.cs new file mode 100644 index 00000000000..e93245ea9c1 --- /dev/null +++ b/Content.Server/_Lust/Borgs/BorgModuleInnateSystem.cs @@ -0,0 +1,214 @@ +using Content.Shared._Lust.Silicons.Borgs; +using Content.Shared.Actions; +using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; +using Content.Shared.Silicons.Borgs.Components; +using Content.Shared.UserInterface; +using Robust.Shared.Containers; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Server._Lust.Silicons.Borgs; + +/// +/// Система выдачи встраиваемых предметов и компонентов через модуль. +/// +public sealed class BorgModuleInnateSystem : EntitySystem +{ + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly ActionContainerSystem _actionContainer = default!; + [Dependency] private readonly SharedContainerSystem _containers = default!; + [Dependency] private readonly MetaDataSystem _metadata = default!; + [Dependency] private readonly SharedInteractionSystem _interactions = default!; + + // Название контейнера-хранилища встроенных предметов + private const string InnateItemsContainerId = "module_innate_items"; + + // Прототипы действий над предметами + private static readonly EntProtoId InnateUseItemAction = "ModuleInnateUseItemAction"; + private static readonly EntProtoId InnateInteractionItemAction = "ModuleInnateInteractionItemAction"; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInstalled); + SubscribeLocalEvent(OnUninstalled); + + SubscribeLocalEvent(OnInnateUseItem); + SubscribeLocalEvent(OnInnateInteractionItem); + } + + /// + /// Добавляет нужные компоненты и предметы при "установке" модуля + /// + private void OnInstalled(Entity module, ref BorgModuleInstalledEvent args) + { + var containerManager = EnsureComp(args.ChassisEnt); + _containers.EnsureContainer(args.ChassisEnt, InnateItemsContainerId, containerManager); + + EntityManager.AddComponents(args.ChassisEnt, module.Comp.InnateComponents); + + if (!_containers.TryGetContainer(args.ChassisEnt, InnateItemsContainerId, out var container)) + return; + + AddItems(args.ChassisEnt, module, container); + } + + /// + /// Удаляет нужные компоненты и предметы при "удалении" модуля + /// + private void OnUninstalled(Entity module, ref BorgModuleUninstalledEvent args) + { + foreach (var action in module.Comp.Actions) + { + _actions.RemoveAction(args.ChassisEnt, action); + QueueDel(action); + } + foreach (var item in module.Comp.InnateItems) + QueueDel(item); + + module.Comp.Actions.Clear(); + module.Comp.InnateItems.Clear(); + + EntityManager.RemoveComponents(args.ChassisEnt, module.Comp.InnateComponents); + } + + /// + /// Добавляет предметы в контейнер, а также создаёт экшены их активации в модуле для тела киборга + /// + private void AddItems(EntityUid chassis, Entity module, BaseContainer container) + { + foreach (var itemProto in module.Comp.UseItems) + { + if (itemProto is null) + continue; + + AddUseItem(itemProto.Value, chassis, module, container); + } + + foreach (var itemProto in module.Comp.InteractionItems) + { + if (itemProto is null) + continue; + + AddInteractionItem(itemProto.Value, chassis, module, container); + } + } + + /// + /// Добавляет предмет, который активируется в руке, вместе с экшеном для его активации + /// + private void AddUseItem( + EntProtoId itemProto, + EntityUid chassis, + Entity module, + BaseContainer container + ) + { + var item = CreateInnateItem(itemProto, module, container); + var ev = new ModuleInnateUseItem(item); + var action = CreateAction(item, ev, InnateUseItemAction); + AssignAction(chassis, module, action); + } + + /// + /// Добавляет предмет, который активируется выбором цели, вместе с экшеном для его активации + /// + private void AddInteractionItem( + EntProtoId itemProto, + EntityUid chassis, + Entity module, + BaseContainer container + ) + { + var item = CreateInnateItem(itemProto, module, container); + var ev = new ModuleInnateInteractionItem(item); + var action = CreateAction(item, ev, InnateInteractionItemAction); + AssignAction(chassis, module, action); + } + + /// + /// Создает предмет для использования через экшены согласно прототипу в заданном контейнере + /// + /// Сущность предмета + private EntityUid CreateInnateItem( + EntProtoId itemProto, + Entity module, + BaseContainer container + ) + { + var item = Spawn(itemProto); + module.Comp.InnateItems.Add(item); + + // Модифицируем компач юай, чтобы борг наверняка мог его использовать + if (TryComp(item, out var activatableUIComponent)) + { + activatableUIComponent.RequiresComplex = false; + activatableUIComponent.InHandsOnly = false; + activatableUIComponent.RequireActiveHand = false; + Dirty(item, activatableUIComponent); + } + + // Сохраняем его в контейнере предметов модуля + _containers.Insert(item, container); + + return item; + } + + /// + /// Согласно прототипу и событию создает экшен для активации данной сущности-предмета + /// + /// Сущность экшена + private EntityUid CreateAction(EntityUid item, BaseActionEvent assignedEvent, EntProtoId actionProto) + { + var actionEnt = Spawn(actionProto); + // Подгружаем спрайт для экшена из прото предмета + _actions.SetIcon(actionEnt, new SpriteSpecifier.EntityPrototype(MetaData(item).EntityPrototype!.ID)); + // Заготовка события для экшена + _actions.SetEvent(actionEnt, assignedEvent); + + // Даем экшену название и описание предмета + _metadata.SetEntityName(actionEnt, MetaData(item).EntityName); + _metadata.SetEntityDescription(actionEnt, MetaData(item).EntityDescription); + return actionEnt; + } + + /// + /// Добавляет экшен в шасси и сохраняет его в контейнере модуля + /// + private void AssignAction(EntityUid chassis, Entity module, EntityUid action) + { + // Добавляем экшн в список экшенов и в список компача + _actionContainer.AddAction(module.Owner, action); + _actions.AddAction(chassis, action, module.Owner); + module.Comp.Actions.Add(action); + } + + /// + /// Обработчик события использования предмета как будто он в руке + /// + private void OnInnateUseItem(Entity ent, ref ModuleInnateUseItem args) + { + var ev = new UseInHandEvent(args.Performer); + RaiseLocalEvent(args.Item, ev); + args.Handled = true; + } + + /// + /// Обработчик события использования предмета на заданной цели + /// + private void OnInnateInteractionItem(Entity ent, ref ModuleInnateInteractionItem args) + { + _interactions.InteractUsing( + args.Performer, + args.Item, + args.Target, + Transform(args.Target).Coordinates, + false, + false, + false + ); + args.Handled = true; + } +} diff --git a/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs b/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs index 1039edef301..797c02a9a46 100644 --- a/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs +++ b/Content.Server/_Sunrise/InteractionsPanel/InteractionsPanel.Interactions.cs @@ -43,6 +43,7 @@ private void InitializeInteractions() SubscribeLocalEvent>(AddInteractionsVerb); SubscribeLocalEvent(OnInteractionsComponentInit); + SubscribeLocalEvent(OnInteractionsComponentRemove); SubscribeLocalEvent(ClothingDidEquipped); SubscribeLocalEvent(ClothingDidUnequipped); @@ -174,6 +175,11 @@ private void OnInteractionsComponentInit(EntityUid uid, InteractionsComponent co _ui.SetUi(uid, InteractionWindowUiKey.Key, interfaceData); } + private void OnInteractionsComponentRemove(Entity ent, ref ComponentRemove args) + { + _ui.CloseUi(ent.Owner, InteractionWindowUiKey.Key); + } + private void OnInteractionMessageReceived(Entity ent, ref InteractionMessage args) { var target = ent.Comp.CurrentTarget; @@ -579,6 +585,9 @@ private void AddInteractionsVerb(Entity ent, ref GetVerbs if (!TryComp(args.User, out var interfaceComponent)) return; + if (!HasComp(args.User)) + return; + if (_mobState.IsIncapacitated(args.Target) || _mobState.IsIncapacitated(args.User)) return; diff --git a/Content.Shared/Preferences/Loadouts/LoadoutPrototype.cs b/Content.Shared/Preferences/Loadouts/LoadoutPrototype.cs index 6f9f5a587f5..59940ba761a 100644 --- a/Content.Shared/Preferences/Loadouts/LoadoutPrototype.cs +++ b/Content.Shared/Preferences/Loadouts/LoadoutPrototype.cs @@ -50,6 +50,10 @@ public sealed partial class LoadoutPrototype : IPrototype, IEquipmentLoadout [DataField] public Dictionary> Storage { get; set; } = new(); + /// + [DataField] + public Dictionary> Container { get; set; } = new(); + // Sunrise-Sponsors-Start [DataField] public bool SponsorOnly; diff --git a/Content.Shared/Roles/StartingGearPrototype.cs b/Content.Shared/Roles/StartingGearPrototype.cs index 2088b4a24a5..508cc0ac9da 100644 --- a/Content.Shared/Roles/StartingGearPrototype.cs +++ b/Content.Shared/Roles/StartingGearPrototype.cs @@ -33,6 +33,11 @@ public sealed partial class StartingGearPrototype : IPrototype, IInheritingProto [DataField] [AlwaysPushInheritance] public Dictionary> Storage { get; set; } = new(); + + /// + [DataField] + [AlwaysPushInheritance] + public Dictionary> Container { get; set; } = new(); } /// @@ -55,6 +60,12 @@ public interface IEquipmentLoadout /// public Dictionary> Storage { get; set; } + /// + /// Inserts entities into the specified container. + /// + public Dictionary> Container { get; set; } + + /// /// Gets the entity prototype ID of a slot in this starting gear. /// diff --git a/Content.Shared/Station/SharedStationSpawningSystem.cs b/Content.Shared/Station/SharedStationSpawningSystem.cs index 70a74f38594..da6a5063171 100644 --- a/Content.Shared/Station/SharedStationSpawningSystem.cs +++ b/Content.Shared/Station/SharedStationSpawningSystem.cs @@ -9,6 +9,7 @@ using Content.Shared.Storage; using Content.Shared.Storage.EntitySystems; using Robust.Shared.Collections; +using Robust.Shared.Containers; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Utility; @@ -24,6 +25,7 @@ public abstract class SharedStationSpawningSystem : EntitySystem [Dependency] private readonly MetaDataSystem _metadata = default!; [Dependency] private readonly SharedStorageSystem _storage = default!; [Dependency] private readonly SharedTransformSystem _xformSystem = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; private EntityQuery _handsQuery; private EntityQuery _inventoryQuery; @@ -178,6 +180,24 @@ public void EquipStartingGear(EntityUid entity, IEquipmentLoadout? startingGear, } } + if (startingGear.Container.Count > 0) + { + var coords = _xformSystem.GetMapCoordinates(entity); + var contManager = EnsureComp(entity); + foreach (var (containerKey, entProtos) in startingGear.Container) + { + if (entProtos == null || entProtos.Count == 0) + continue; + + var cont = _container.EnsureContainer(entity, containerKey, contManager); + foreach (var entProto in entProtos) + { + var spawnedEntity = Spawn(entProto, coords); + _container.Insert(spawnedEntity, cont); + } + } + } + if (raiseEvent) { var ev = new StartingGearEquippedEvent(entity); diff --git a/Content.Shared/_Lust/Borgs/BorgModuleInnateEvents.cs b/Content.Shared/_Lust/Borgs/BorgModuleInnateEvents.cs new file mode 100644 index 00000000000..809924e74d8 --- /dev/null +++ b/Content.Shared/_Lust/Borgs/BorgModuleInnateEvents.cs @@ -0,0 +1,31 @@ +using Content.Shared.Actions; + +namespace Content.Shared._Lust.Silicons.Borgs; + +/// +/// Ивент на активацию встроенного предмета +/// +public sealed partial class ModuleInnateUseItem : InstantActionEvent +{ + public readonly EntityUid Item; + + public ModuleInnateUseItem(EntityUid item) + : this() + { + Item = item; + } +} + +/// +/// Ивент на активацию встроенного предмета с взаимодействием с целью +/// +public sealed partial class ModuleInnateInteractionItem : EntityTargetActionEvent +{ + public readonly EntityUid Item; + + public ModuleInnateInteractionItem(EntityUid item) + : this() + { + Item = item; + } +} diff --git a/Resources/Locale/en-US/_prototypes/_lust/entities/objects/specific/robotics/borg_modules.ftl b/Resources/Locale/en-US/_prototypes/_lust/entities/objects/specific/robotics/borg_modules.ftl new file mode 100644 index 00000000000..edb1667e71c --- /dev/null +++ b/Resources/Locale/en-US/_prototypes/_lust/entities/objects/specific/robotics/borg_modules.ftl @@ -0,0 +1,2 @@ +ent-BorgModuleLustful = lustful cyborg module + .desc = Questionable cyborg module that can be installed into any cyborg to fulfill lustful desires of the crew. Don't pay attention to white marks - that's thermal paste. diff --git a/Resources/Locale/en-US/_prototypes/_lust/entities/objects/specific/robotics/borg_tools.ftl b/Resources/Locale/en-US/_prototypes/_lust/entities/objects/specific/robotics/borg_tools.ftl new file mode 100644 index 00000000000..7ed5a247aaf --- /dev/null +++ b/Resources/Locale/en-US/_prototypes/_lust/entities/objects/specific/robotics/borg_tools.ftl @@ -0,0 +1,2 @@ +ent-HypoBorgLustful = lustful borg hypospray + .desc = A cyborg hypospray that produces various excitatory chemicals to inject into people. diff --git a/Resources/Locale/en-US/_strings/_lust/_strings/research/technologies.ftl b/Resources/Locale/en-US/_strings/_lust/_strings/research/technologies.ftl new file mode 100644 index 00000000000..7231ad494b8 --- /dev/null +++ b/Resources/Locale/en-US/_strings/_lust/_strings/research/technologies.ftl @@ -0,0 +1 @@ +research-technology-lustful-modules = Сyborg modules for sex diff --git a/Resources/Locale/ru-RU/_lust/_strings/preferences/loadout-groups.ftl b/Resources/Locale/ru-RU/_lust/_strings/preferences/loadout-groups.ftl index abe08a25769..725b5f02798 100644 --- a/Resources/Locale/ru-RU/_lust/_strings/preferences/loadout-groups.ftl +++ b/Resources/Locale/ru-RU/_lust/_strings/preferences/loadout-groups.ftl @@ -7,3 +7,4 @@ loadout-group-IAA-uniform = АВД, форма loadout-group-IAA-backpack = Деловые сумки loadout-group-IAA-outerClothing = АВД, верхняя одежда loadout-group-IAA-neck = АВД, шея +loadout-group-borg-modules = Дополнительные модули diff --git a/Resources/Locale/ru-RU/_prototypes/_lust/entities/objects/specific/robotics/borg_modules.ftl b/Resources/Locale/ru-RU/_prototypes/_lust/entities/objects/specific/robotics/borg_modules.ftl new file mode 100644 index 00000000000..8c3964c6378 --- /dev/null +++ b/Resources/Locale/ru-RU/_prototypes/_lust/entities/objects/specific/robotics/borg_modules.ftl @@ -0,0 +1,2 @@ +ent-BorgModuleLustful = модуль похоти киборга + .desc = Сомнительный модуль, который может быть установлен в любого киборга для исполнения похотливых желаний экипажа. Не обращайте внимания на белые пятна - это термопаста. diff --git a/Resources/Locale/ru-RU/_prototypes/_lust/entities/objects/specific/robotics/borg_tools.ftl b/Resources/Locale/ru-RU/_prototypes/_lust/entities/objects/specific/robotics/borg_tools.ftl new file mode 100644 index 00000000000..17327c9c1db --- /dev/null +++ b/Resources/Locale/ru-RU/_prototypes/_lust/entities/objects/specific/robotics/borg_tools.ftl @@ -0,0 +1,2 @@ +ent-HypoBorgLustful = гипоспрей киборга для похотей + .desc = Версия гипоспрея для киборга, которая производит различные возбуждающие химикаты для инъекции людям. diff --git a/Resources/Locale/ru-RU/_strings/_lust/_strings/research/technologies.ftl b/Resources/Locale/ru-RU/_strings/_lust/_strings/research/technologies.ftl new file mode 100644 index 00000000000..e964e22c687 --- /dev/null +++ b/Resources/Locale/ru-RU/_strings/_lust/_strings/research/technologies.ftl @@ -0,0 +1 @@ +research-technology-lustful-modules = Модули киборгов для секса diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/robotics.yml b/Resources/Prototypes/Recipes/Lathes/Packs/robotics.yml index 82cb2919016..058181c113b 100644 --- a/Resources/Prototypes/Recipes/Lathes/Packs/robotics.yml +++ b/Resources/Prototypes/Recipes/Lathes/Packs/robotics.yml @@ -44,6 +44,7 @@ - BorgModuleAdvancedClowning - BorgModuleAdvancedChemical - BorgModuleAdvancedMining + - BorgModuleLustful # Lust-edit - type: latheRecipePack id: MechParts diff --git a/Resources/Prototypes/_Lust/Entities/ERP/Toys/toys.yml b/Resources/Prototypes/_Lust/Entities/ERP/Toys/toys.yml index 403de82bf5c..27ad4c5e7e1 100644 --- a/Resources/Prototypes/_Lust/Entities/ERP/Toys/toys.yml +++ b/Resources/Prototypes/_Lust/Entities/ERP/Toys/toys.yml @@ -9,7 +9,16 @@ unequipDelay: 4 - type: entity - parent: [BaseItem, BaseERPPlug] + abstract: true + id: ERPToy + parent: BaseItem + components: + - type: Tag + tags: + - ERPToy + +- type: entity + parent: [ERPToy, BaseERPPlug] id: ERPNormalDildo name: normal dildo description: Just a based dildo, nothing else. Should I tell you where you can put it? @@ -22,7 +31,7 @@ sprite: _Lust/ERP/Toys/dildo.rsi - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPNormalFleshlight name: human fleshlight description: Just a based fleshlight, nothing else. Should I tell you what you can put inside? @@ -35,7 +44,7 @@ sprite: _Lust/ERP/Toys/fleshlight.rsi - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPDildoAvian name: avian dildo description: This dildo is modeled after avian anatomy. Ready to soar to new heights of pleasure? @@ -48,7 +57,7 @@ sprite: _Lust/ERP/Toys/d_avian.rsi - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPDildoDragon name: dragon dildo description: This dildo has a dragon-inspired design. Are you ready to feel hot adventure? @@ -61,7 +70,7 @@ sprite: _Lust/ERP/Toys/d_dragon.rsi - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPDildoEquine name: equine dildo description: Designed to resemble equine anatomy, this dildo offers a wild ride! @@ -74,7 +83,7 @@ sprite: _Lust/ERP/Toys/d_equine.rsi - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPDildoKnot name: knot dildo description: This knot dildo is perfect for those looking for a snug fit. Get ready for a tight experience! @@ -87,7 +96,7 @@ sprite: _Lust/ERP/Toys/d_knot.rsi - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPDildoTentacle name: tentacle dildo description: With a tentacle design, this dildo is for those adventurous enough to embrace the unknown! @@ -100,7 +109,7 @@ sprite: _Lust/ERP/Toys/d_tentacle.rsi - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPGreenFleshlight name: green slime fleshlight description: Just a green fleshlight, nothing else. Ready to explore the green zone? @@ -113,7 +122,7 @@ sprite: _Lust/ERP/Toys/fl_green.rsi - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPRedFleshlight name: red demon fleshlight description: Just a red fleshlight, nothing else. Are you ready for a hot experience? @@ -126,7 +135,7 @@ sprite: _Lust/ERP/Toys/fl_red.rsi - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPTealFleshlight name: teal vulpkanin fleshlight description: Just a teal fleshlight, nothing else. Dive into the depths of pleasure. @@ -139,7 +148,7 @@ sprite: _Lust/ERP/Toys/fl_teal.rsi - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPYellowFleshlight name: yellow felinid fleshlight description: Just a yellow fleshlight, nothing else. Brighten up your intimate moments. @@ -153,7 +162,6 @@ - type: entity id: ERPShibariRope - abstract: true name: shibari rope description: This rope is designed for shibari, the art of Japanese rope bondage. Ready to tie up some pleasure? components: @@ -171,6 +179,7 @@ - type: Tag tags: - Handcuffs + - ERPToy - type: MeleeWeapon wideAnimationRotation: 90 animation: WeaponArcDisarm @@ -200,7 +209,7 @@ sprite: _Lust/ERP/Stuff/Shibari/shibari_white.rsi - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPBeads name: beads description: Several anal balls of different sizes, tied on a strong thread. @@ -214,7 +223,7 @@ sprite: _Lust/ERP/Toys/beads.rsi - type: entity - parent: [BaseItem] + parent: [ERPToy] id: ERPWhip name: whip description: A black whip designed for passionate bed games. @@ -244,7 +253,7 @@ Blunt: 0 - type: entity - parent: [BaseItem] + parent: [ERPToy] id: ERPStrapOn name: strap on description: A belted dildo designed for couples who want to switch roles. @@ -262,7 +271,7 @@ - belt - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPVibroEgg name: vibro egg description: A small pink egg-like device connected to the remote. @@ -291,7 +300,7 @@ - Off - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPVibroStick name: vibro stick description: A standard vibrator that can deliver a sea of pleasurable sensations. @@ -315,7 +324,7 @@ - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPPlug1 name: plug description: Pink anal plug, which can deliver unusual sensations in the corresponding orifice. @@ -329,7 +338,7 @@ sprite: _Lust/ERP/Toys/plug.rsi - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPPlug2 name: plug description: Pink anal plug, which can deliver unusual sensations in the corresponding orifice. @@ -343,7 +352,7 @@ sprite: _Lust/ERP/Toys/plug.rsi - type: entity - parent: [BaseItem, BaseERPPlug] + parent: [ERPToy, BaseERPPlug] id: ERPPlug3 name: plug description: Pink anal plug, which can deliver unusual sensations in the corresponding orifice. @@ -357,7 +366,7 @@ sprite: _Lust/ERP/Toys/plug.rsi - type: entity - parent: [BaseItem] + parent: [ERPToy] id: ERPFoxTailPlug name: fox tail plug description: Time to some roleplaying. @@ -377,7 +386,7 @@ unequipDelay: 4 - type: entity - parent: [BaseItem] + parent: [ERPToy] id: ERPCatTailPlug name: cat tail plug description: Murr! @@ -405,7 +414,7 @@ - /Audio/_Lust/Interactions/whip/whip_3.ogg - type: entity - parent: BaseItem + parent: ERPToy id: ToyHandcuffs name: toy handcuffs description: Soft toy handcuffs. Classic! @@ -425,6 +434,7 @@ - type: Tag tags: - Handcuffs + - ERPToy - type: MeleeWeapon wideAnimationRotation: 90 animation: WeaponArcDisarm diff --git a/Resources/Prototypes/_Lust/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/_Lust/Entities/Objects/Specific/Robotics/borg_modules.yml new file mode 100644 index 00000000000..5e5594419ba --- /dev/null +++ b/Resources/Prototypes/_Lust/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -0,0 +1,43 @@ +- type: entity + id: BorgModuleLustful + parent: [ BaseBorgModule, BaseProviderBorgModule ] + name: lustful cyborg module + components: + - type: Sprite + layers: + - state: lustful + - state: icon-lustful + - type: ItemBorgModule + hands: + - item: ERPDildoDragon + hand: + emptyRepresentative: ERPDildoDragon + whitelist: + tags: + - ERPToy + - item: ERPRedFleshlight + hand: + emptyRepresentative: ERPRedFleshlight + whitelist: + tags: + - ERPToy + - item: ERPVibroStick + hand: + emptyRepresentative: ERPVibroStick + whitelist: + tags: + - ERPToy + - item: ERPShibariRope + hand: + emptyRepresentative: ERPShibariRope + whitelist: + tags: + - ERPToy + - item: HypoBorgLustful + - type: BorgModuleInnate + innateComponents: + - type: Interactions + - type: ErpStatus + erp: Yes + - type: BorgModuleIcon + icon: { sprite: Interface/Actions/actions_borg.rsi, state: lustful-module } diff --git a/Resources/Prototypes/_Lust/Entities/Objects/Specific/Robotics/borg_tools.yml b/Resources/Prototypes/_Lust/Entities/Objects/Specific/Robotics/borg_tools.yml new file mode 100644 index 00000000000..dd57e7471dd --- /dev/null +++ b/Resources/Prototypes/_Lust/Entities/Objects/Specific/Robotics/borg_tools.yml @@ -0,0 +1,50 @@ +# Либо новый файл для этого, либо прописать здесь +# угадайте что я выбрал +- type: injectorMode + abstract: true + id: MicroHyposprayMode + parent: BaseHyposprayMode + transferAmounts: + - 1 + +- type: injectorMode + parent: [ BaseHyposprayMode, BaseInjectMode ] + id: MicroHyposprayInjectMode + +- type: entity + parent: HypoBorgStandard + id: HypoBorgLustful + name: lustful borg hypospray + description: A cyborg hypospray that produces various excitatory chemicals to inject into people. + categories: [ HideSpawnMenu ] + components: + - type: Sprite + sprite: Objects/Specific/Medical/hypospray.rsi + state: borghypolustful + - type: Item + sprite: Objects/Specific/Medical/hypospray.rsi + - type: Injector + solutionName: hypospray + activeModeProtoId: MicroHyposprayInjectMode + allowedModes: + - MicroHyposprayInjectMode + currentTransferAmount: 1 + - type: SolutionContainerManager + solutions: + hypospray: + maxVol: 1 + - type: SolutionRegeneration + solution: hypospray + generated: + reagents: + - ReagentId: Aphrodisiac + Quantity: 1 + - type: SolutionRegenerationSwitcher + options: + - ReagentId: Aphrodisiac + Quantity: 1 + - ReagentId: Stonium + Quantity: 1 + - ReagentId: Laughter + Quantity: 1 + keepSolution: false diff --git a/Resources/Prototypes/_Lust/Loadouts/Silicons/borg.yml b/Resources/Prototypes/_Lust/Loadouts/Silicons/borg.yml new file mode 100644 index 00000000000..228477a4f0b --- /dev/null +++ b/Resources/Prototypes/_Lust/Loadouts/Silicons/borg.yml @@ -0,0 +1,5 @@ +- type: loadout + id: BorgAdditionalModuleLustful + container: + borg_module: + - BorgModuleLustful diff --git a/Resources/Prototypes/_Lust/Recipes/Lathes/robot_modules.yml b/Resources/Prototypes/_Lust/Recipes/Lathes/robot_modules.yml new file mode 100644 index 00000000000..1932d1c317e --- /dev/null +++ b/Resources/Prototypes/_Lust/Recipes/Lathes/robot_modules.yml @@ -0,0 +1,9 @@ +- type: latheRecipe + parent: BaseGoldBorgModuleRecipe + id: BorgModuleLustful + result: BorgModuleLustful + materials: + Steel: 500 + Glass: 500 + Plastic: 250 + Plasma: 250 diff --git a/Resources/Prototypes/_Lust/Research/civilianservices.yml b/Resources/Prototypes/_Lust/Research/civilianservices.yml new file mode 100644 index 00000000000..d00deec093e --- /dev/null +++ b/Resources/Prototypes/_Lust/Research/civilianservices.yml @@ -0,0 +1,11 @@ +- type: technology + id: LustfulCyborgModules + name: research-technology-lustful-modules + icon: + sprite: Objects/Specific/Robotics/borgmodule.rsi + state: lustful + discipline: CivilianServices + tier: 2 + cost: 3000 + recipeUnlocks: + - BorgModuleLustful diff --git a/Resources/Prototypes/_Lust/loadout_groups.yml b/Resources/Prototypes/_Lust/loadout_groups.yml index 0cdaf8007c9..0c5d671c0a0 100644 --- a/Resources/Prototypes/_Lust/loadout_groups.yml +++ b/Resources/Prototypes/_Lust/loadout_groups.yml @@ -41,3 +41,11 @@ name: loadout-group-IAA-neck loadouts: - IAACloak + +- type: loadoutGroup + id: BorgAdditionalModules + maxLimit: 4 + minLimit: 0 + name: loadout-group-borg-modules + loadouts: + - BorgAdditionalModuleLustful diff --git a/Resources/Prototypes/_Lust/tags.yml b/Resources/Prototypes/_Lust/tags.yml index a38401a3903..d7ac26ba4c2 100644 --- a/Resources/Prototypes/_Lust/tags.yml +++ b/Resources/Prototypes/_Lust/tags.yml @@ -7,3 +7,6 @@ - type: Tag id: MagazineAR2 + +- type: Tag + id: ERPToy diff --git a/Resources/Prototypes/_Sunrise/Actions/innate_actions.yml b/Resources/Prototypes/_Sunrise/Actions/innate_actions.yml index 5a8d8b68447..6f602f3e566 100644 --- a/Resources/Prototypes/_Sunrise/Actions/innate_actions.yml +++ b/Resources/Prototypes/_Sunrise/Actions/innate_actions.yml @@ -22,3 +22,30 @@ checkCanInteract: false - type: InstantAction event: !type:InnateInstantActionEvent + +- type: entity + parent: BaseAction + id: ModuleInnateUseItemAction + components: + - type: Action + useDelay: 1 + itemIconStyle: BigAction + checkCanInteract: false + temporary: true + - type: InstantAction + event: !type:ModuleInnateUseItem + +- type: entity + parent: BaseAction + id: ModuleInnateInteractionItemAction + components: + - type: Action + useDelay: 1 + itemIconStyle: BigAction + checkCanInteract: false + temporary: true + - type: TargetAction + range: 3 + ignoreContainer: true + - type: EntityTargetAction + event: !type:ModuleInnateInteractionItem diff --git a/Resources/Prototypes/_Sunrise/Entities/Effects/overlays.yml b/Resources/Prototypes/_Sunrise/Entities/Effects/overlays.yml index 073290d0310..36b0cb0ded3 100644 --- a/Resources/Prototypes/_Sunrise/Entities/Effects/overlays.yml +++ b/Resources/Prototypes/_Sunrise/Entities/Effects/overlays.yml @@ -20,6 +20,18 @@ radius: 20 softness: 20 +# for borgs +- type: entity + id: EffectNightVisionBlue + categories: [ HideSpawnMenu ] + name: night vision + components: + - type: PointLight + color: "#3cb6b0" + energy: 0.5 + radius: 20 + softness: 20 + - type: entity id: EffectNightVisioSpecies categories: [ HideSpawnMenu ] diff --git a/Resources/Prototypes/_Sunrise/Loadouts/role_loadouts.yml b/Resources/Prototypes/_Sunrise/Loadouts/role_loadouts.yml index a66a803cdc1..2a70d11eb3f 100644 --- a/Resources/Prototypes/_Sunrise/Loadouts/role_loadouts.yml +++ b/Resources/Prototypes/_Sunrise/Loadouts/role_loadouts.yml @@ -546,41 +546,73 @@ id: JobPeaceBorg nameDataset: NamesBorg canCustomizeName: true + # Lust-start + groups: + - BorgAdditionalModules + # Lust-end - type: roleLoadout id: JobJanitorBorg nameDataset: NamesBorg canCustomizeName: true + # Lust-start + groups: + - BorgAdditionalModules + # Lust-end - type: roleLoadout id: JobMiningBorg nameDataset: NamesBorg canCustomizeName: true + # Lust-start + groups: + - BorgAdditionalModules + # Lust-end - type: roleLoadout id: JobClownBorg nameDataset: NamesBorg canCustomizeName: true + # Lust-start + groups: + - BorgAdditionalModules + # Lust-end - type: roleLoadout id: JobEngineerBorg nameDataset: NamesBorg canCustomizeName: true + # Lust-start + groups: + - BorgAdditionalModules + # Lust-end - type: roleLoadout id: JobServiceBorg nameDataset: NamesBorg canCustomizeName: true + # Lust-start + groups: + - BorgAdditionalModules + # Lust-end - type: roleLoadout id: JobMedicalBorg nameDataset: NamesBorg canCustomizeName: true + # Lust-start + groups: + - BorgAdditionalModules + # Lust-end - type: roleLoadout id: JobSecurityBorg nameDataset: NamesBorg canCustomizeName: true + # Lust-start + groups: + - BorgAdditionalModules + # Lust-end - type: roleLoadout id: JobComMaid diff --git a/Resources/Textures/Interface/Actions/actions_borg.rsi/lustful-module.png b/Resources/Textures/Interface/Actions/actions_borg.rsi/lustful-module.png new file mode 100644 index 00000000000..7017aa70f58 Binary files /dev/null and b/Resources/Textures/Interface/Actions/actions_borg.rsi/lustful-module.png differ diff --git a/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json b/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json index 036949dd8ed..185fca65a45 100644 --- a/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json +++ b/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/cdbcb1e858b11f083994a7a269ed67ef5b452ce9, inflatable module by FungiFellow (GitHub), Module actions by Scarky0. chem, adv-chem, and adv-mining by mubururu_, xenoborg actions by Samuka-C (github), advclown by ThatGuyUSA. c20r and esword by RedBookcase on Github, artistry-module by Kittygyat, with help from TiniestShark", + "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/cdbcb1e858b11f083994a7a269ed67ef5b452ce9, inflatable module by FungiFellow (GitHub), Module actions by Scarky0. chem, adv-chem, and adv-mining by mubururu_, xenoborg actions by Samuka-C (github), advclown by ThatGuyUSA. c20r and esword by RedBookcase on Github, artistry-module by Kittygyat, with help from TiniestShark, lustful-module by crestoedge (github)", "size": { "x": 32, "y": 32 @@ -186,6 +186,9 @@ }, { "name": "select-type" + }, + { + "name": "lustful-module" } ] } diff --git a/Resources/Textures/Objects/Specific/Medical/hypospray.rsi/borghypolustful.png b/Resources/Textures/Objects/Specific/Medical/hypospray.rsi/borghypolustful.png new file mode 100644 index 00000000000..12398b33dd5 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Medical/hypospray.rsi/borghypolustful.png differ diff --git a/Resources/Textures/Objects/Specific/Medical/hypospray.rsi/meta.json b/Resources/Textures/Objects/Specific/Medical/hypospray.rsi/meta.json index 8ad20c2effb..ccdf94e0172 100644 --- a/Resources/Textures/Objects/Specific/Medical/hypospray.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Medical/hypospray.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d, modified with fill sprites by SlamBamActionman (github), borghypo fill sprites by SirWarock (Github)", + "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d, modified with fill sprites by SlamBamActionman (github), borghypo fill sprites by SirWarock (Github), borghypolustful (based on borghypo) by crestoedge(github)", "size": { "x": 32, "y": 32 @@ -10,6 +10,9 @@ { "name": "borghypo" }, + { + "name": "borghypolustful" + }, { "name": "borghypo_s" }, diff --git a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-lustful.png b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-lustful.png new file mode 100644 index 00000000000..af8706b99bb Binary files /dev/null and b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-lustful.png differ diff --git a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/lustful.png b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/lustful.png new file mode 100644 index 00000000000..8601d0b2bb5 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/lustful.png differ diff --git a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json index 73985cb7ae1..89170a3a3f4 100644 --- a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC0-1.0", - "copyright": "Created by EmoGarbage404 (github) for Space Station 14. icon-construction.png created by deltanedas (github). syndicateborgbomb.png created by Mangohydra (github). icon-chem.png & icon-mining-adv.png created by mubururu_ (github) icon-inflatable.png made by FungiFellow (GitHub), Xenoborg modules sprites by Samuka-C (github), icon-artistry by Kittygyat", + "copyright": "Created by EmoGarbage404 (github) for Space Station 14. icon-construction.png created by deltanedas (github). syndicateborgbomb.png created by Mangohydra (github). icon-chem.png & icon-mining-adv.png created by mubururu_ (github) icon-inflatable.png made by FungiFellow (GitHub), Xenoborg modules sprites by Samuka-C (github), icon-artistry by Kittygyat, icon-lustful and lustful by crestoedge (github)", "size": { "x": 32, "y": 32 @@ -160,6 +160,9 @@ { "name": "icon-syndicate" }, + { + "name": "icon-lustful" + }, { "name": "janitor" }, @@ -248,6 +251,9 @@ }, { "name": "NT" + }, + { + "name": "lustful" } ]