From 14d41cf17108fe877b73a246215801cb9012040f Mon Sep 17 00:00:00 2001 From: Alex C <53302665+honeyed-lemons@users.noreply.github.com> Date: Thu, 26 Feb 2026 16:14:17 -0500 Subject: [PATCH 1/6] Den Special: Reagent Production (#2473) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LICENSE: MIT ## About the PR Replaced the usage of the old floof lewdtraitsystem for a new ReagentProductionSystem, which allows for the addition of new production types without the need for c#. This also slightly adjusts the production rates / capacities / expulsion of different reagents to be somewhat realistic (But not really) ## Why / Balance The old system we have from floof is frankly outdated and unintuitive. This system allows you to simply just right click on any fillable entity and fill it with any one of your available production types, no fuss. ## Technical details Adds the `ReagentProductionSystem` which uses `ReagentProductionTypePrototypes` in order to determine what an entity can or cannot produce, this system allows for any number of arbitrary production types to be added without the need for c#! This PR does not remove the old floof systems, but i can do that if you want ## Media Warning: the video i guess is nsfw https://github.com/user-attachments/assets/5b1abda1-b1ea-499d-9fc8-e3137a71c41b ## Requirements - [x] I have read and am following the [Pull Request and Changelog Guidelines](https://docs.spacestation14.com/en/general-development/codebase-info/pull-request-guidelines.html). - [x] I have added media to this PR or it does not require an ingame showcase. - [x] I have tested any changes or additions. - [x] I can confirm this PR contains no AI-generated content, and did not use any AI-generated content. ## Breaking changes N/A, traits have been adjusted accordingly and will not need to be replaced. **Changelog** :cl: - tweak: Cumming is more intuitive! Just open the context menu of any fill-able container and go ham (with consent)! (cherry picked from commit 986170b2195c8e046af0b9ad73b3a8e6b7ad8e30) --- .../Components/ReagentProducerComponent.cs | 25 +++ .../Events/ReagentProductionEvents.cs | 36 ++++ .../ReagentProductionTypePrototype.cs | 55 +++++ .../Systems/ReagentProductionSystem.cs | 198 ++++++++++++++++++ .../Systems/ReagentProductionTraitFunction.cs | 34 +++ .../_DEN/verbs/reagent-production-verb.ftl | 1 + .../ReagentProduction/production_types.yml | 41 ++++ Resources/Prototypes/_Floof/Traits/lewd.yml | 107 ++++++++++ 8 files changed, 497 insertions(+) create mode 100644 Content.Shared/_DEN/ReagentProduction/Components/ReagentProducerComponent.cs create mode 100644 Content.Shared/_DEN/ReagentProduction/Events/ReagentProductionEvents.cs create mode 100644 Content.Shared/_DEN/ReagentProduction/Prototypes/ReagentProductionTypePrototype.cs create mode 100644 Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionSystem.cs create mode 100644 Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionTraitFunction.cs create mode 100644 Resources/Locale/en-US/_DEN/verbs/reagent-production-verb.ftl create mode 100644 Resources/Prototypes/_DEN/ReagentProduction/production_types.yml create mode 100644 Resources/Prototypes/_Floof/Traits/lewd.yml diff --git a/Content.Shared/_DEN/ReagentProduction/Components/ReagentProducerComponent.cs b/Content.Shared/_DEN/ReagentProduction/Components/ReagentProducerComponent.cs new file mode 100644 index 0000000000..a53d1449de --- /dev/null +++ b/Content.Shared/_DEN/ReagentProduction/Components/ReagentProducerComponent.cs @@ -0,0 +1,25 @@ +using Content.Shared._DEN.ReagentProduction.Prototypes; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + + +namespace Content.Shared._DEN.ReagentProduction.Components; + +[RegisterComponent] +public sealed partial class ReagentProducerComponent : Component +{ + [DataField] + public List> ProductionTypes = []; + + /// + /// The next time to fill solution + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan NextUpdate; + + /// + /// The interval between updates. + /// + [DataField] + public TimeSpan UpdateInterval = TimeSpan.FromSeconds(10); +} diff --git a/Content.Shared/_DEN/ReagentProduction/Events/ReagentProductionEvents.cs b/Content.Shared/_DEN/ReagentProduction/Events/ReagentProductionEvents.cs new file mode 100644 index 0000000000..903d053fa5 --- /dev/null +++ b/Content.Shared/_DEN/ReagentProduction/Events/ReagentProductionEvents.cs @@ -0,0 +1,36 @@ +using Content.Shared._DEN.ReagentProduction.Prototypes; +using Content.Shared.DoAfter; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + + +namespace Content.Shared._DEN.ReagentProduction.Events; + +public sealed class ReagentProductionEvents +{ + [Serializable, NetSerializable,] + public sealed class ReagentProductionTypeAdded(ProtoId productionType) : EntityEventArgs + { + public ProtoId ProductionType { get; } = productionType; + } + + [Serializable, NetSerializable,] + public sealed class ReagentProductionTypeRemoved(ProtoId productionType) : EntityEventArgs + { + public ProtoId ProductionType { get; } = productionType; + } +} + +[Serializable, NetSerializable,] +public sealed partial class ReagentProductionFillEvent : DoAfterEvent +{ + public ProtoId ProductionType; + + public ReagentProductionFillEvent( ProtoId productionType) + { + ProductionType = productionType; + } + + public override DoAfterEvent Clone() => this; +} + diff --git a/Content.Shared/_DEN/ReagentProduction/Prototypes/ReagentProductionTypePrototype.cs b/Content.Shared/_DEN/ReagentProduction/Prototypes/ReagentProductionTypePrototype.cs new file mode 100644 index 0000000000..70dd061885 --- /dev/null +++ b/Content.Shared/_DEN/ReagentProduction/Prototypes/ReagentProductionTypePrototype.cs @@ -0,0 +1,55 @@ +using Content.Shared.Chemistry.Reagent; +using Content.Shared.FixedPoint; +using Robust.Shared.Prototypes; + +namespace Content.Shared._DEN.ReagentProduction.Prototypes; + +[Prototype] +public sealed class ReagentProductionTypePrototype : IPrototype +{ + [IdDataField] + public string ID { get; private set; } = default!; + + /// + /// Reagent to produce + /// + [DataField] + public ProtoId Reagent = "Cum"; + /// + /// The solution to produce into + /// + [DataField] + public string SolutionName = "balls"; //cum is stored in the balls? + /// + /// Maximum capacity of the solution + /// + [DataField] + public FixedPoint2 MaximumCapacity = 30; + + /// + /// Maximum amount you can expel at once + /// + [DataField] + public FixedPoint2 MaximumLoad = 10; + + /// + /// Doafter length + /// + [DataField] + public TimeSpan FillTime = TimeSpan.FromSeconds(3); + + /// + /// How many units are produced each update + /// + [DataField] + public FixedPoint2 UnitsPerProduction = 5; + + /// + /// Popup that occurs when your solution is empty + /// + [DataField] + public string DryPopup = "cum-verb-dry"; + + [DataField] + public string SuccessPopup = "cum-verb-success"; +} diff --git a/Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionSystem.cs b/Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionSystem.cs new file mode 100644 index 0000000000..19a70c4430 --- /dev/null +++ b/Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionSystem.cs @@ -0,0 +1,198 @@ +using Content.Shared.Chemistry.Components.SolutionManager; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.DoAfter; +using Content.Shared.FixedPoint; +using Content.Shared.IdentityManagement; +using Content.Shared.Mobs.Systems; +using Content.Shared.Popups; +using Content.Shared.Verbs; +using Enumerable = System.Linq.Enumerable; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; +using static Content.Shared._DEN.ReagentProduction.Events.ReagentProductionEvents; +using Content.Shared._DEN.ReagentProduction.Components; +using Content.Shared._DEN.ReagentProduction.Events; +using Content.Shared._DEN.ReagentProduction.Prototypes; + +namespace Content.Shared._DEN.ReagentProduction.Systems; + +public sealed class ReagentProductionSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly IPrototypeManager _protoManager = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!; + + private static readonly VerbCategory ReagentFillCategory = new("verb-categories-fill", "/Textures/_DEN/Interface/VerbIcons/lewd.svg.192dpi.png"); + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(ProductionTypeAdded); + SubscribeLocalEvent(ProductionTypeRemoved); + + SubscribeLocalEvent>(AddVerbs); + + SubscribeLocalEvent(FinishFillDoAfter); + SubscribeLocalEvent(OnMapInit); + + } + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + ent.Comp.NextUpdate = _gameTiming.CurTime + ent.Comp.UpdateInterval; + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var producerComponent, out var sol)) + { + if (!_mobState.IsAlive(uid)) + continue; + + if (_gameTiming.CurTime < producerComponent.NextUpdate) + continue; + + producerComponent.NextUpdate += producerComponent.UpdateInterval; + + // for every production type the producer has + foreach (var productionType in Enumerable.Select(producerComponent.ProductionTypes, productionTypeId => _protoManager.Index(productionTypeId))) + { + // ensure there's a solution to add to + _solutionContainer.EnsureSolution(uid, productionType.SolutionName, out var solution, productionType.MaximumCapacity); + + if (solution == null) + continue; + // do some math to figure out how much we can add + var amountToAdd = FixedPoint2.Clamp( + solution.MaxVolume - solution.Volume, + FixedPoint2.Zero, + productionType.UnitsPerProduction); + + if (amountToAdd <= 0) + return; + //and add it :) + solution.AddReagent(productionType.Reagent, amountToAdd); + } + } + } + + private void AddVerbs(Entity container, ref GetVerbsEvent args) + { + if (!args.CanInteract || !args.CanAccess || !TryComp(args.User, out var producerComp)) + return; + // Add a verb for every production type the producer has + foreach (var productionTypeId in producerComp.ProductionTypes) + { + if (!_protoManager.TryIndex(productionTypeId, out var productionType) || + !_protoManager.TryIndex(productionType.Reagent, out var reagent)) + continue; + var producer = args.User; + var verb = new InteractionVerb + { + Category = ReagentFillCategory, + Act = () => StartFillDoAfter((producer, producerComp), container, productionTypeId), + Text = reagent.LocalizedName, + CloseMenu = true, + Priority = 1 + }; + args.Verbs.Add(verb); + } + } + + private void StartFillDoAfter( + Entity user, + Entity target, + ProtoId productionTypeId + ) + { + var productionType = _protoManager.Index(productionTypeId); + + _doAfter.TryStartDoAfter( + new(EntityManager, user, productionType.FillTime, new ReagentProductionFillEvent(productionTypeId), user, target: target) + { + BreakOnMove = true, + BreakOnDropItem = true + }); + } + + private void FinishFillDoAfter(Entity ent, ref ReagentProductionFillEvent args) + { + if (!_protoManager.TryIndex(args.ProductionType, out var productionType) || args.Target == null || args.Cancelled) + return; + + if (!TryComp(args.Target.Value, out var refillableSolution)) + return; + + if (!_solutionContainer.TryGetSolution(ent.Owner, productionType.SolutionName, out var userSolutionComp)|| + !_solutionContainer.TryGetSolution(args.Target.Value, refillableSolution.Solution, out var targetSolutionComp)) + return; + + var targetSolution = targetSolutionComp.Value.Comp.Solution; + + // If theres no cum to cum you cant cum okay? + if (userSolutionComp.Value.Comp.Solution.Volume <= 0) + { + _popup.PopupEntity(Loc.GetString(productionType.DryPopup),ent,ent); + return; + } + + // Get available volume in target solution + var targetAvailableVolume = targetSolution.MaxVolume - targetSolution.Volume; + + // If theres no room just silently return + if (targetAvailableVolume <= 0) + return; + + // Get amount to add, attempts to add the largest amount with the maximum set from production type + var amountToAdd = + FixedPoint2.Clamp(targetAvailableVolume, FixedPoint2.Zero, productionType.MaximumLoad); + + var split = _solutionContainer.SplitSolution(userSolutionComp.Value, amountToAdd); + + var quantity = _solutionContainer.AddSolution(targetSolutionComp.Value, split); + _popup.PopupEntity( + Loc.GetString( + productionType.SuccessPopup, + ("amount", quantity), + ("target", Identity.Entity(args.Target.Value, EntityManager))), + args.Target.Value, + args.Args.User, + PopupType.Medium); + } + + public void AddProductionType(EntityUid entity, ReagentProductionTypePrototype prototypeType) + { + EnsureComp(entity); + + RaiseLocalEvent(entity, new ReagentProductionTypeAdded(prototypeType)); + } + + public void RemoveProductionType(EntityUid entity, ReagentProductionTypePrototype prototypeType) + { + EnsureComp(entity); + + RaiseLocalEvent(entity, new ReagentProductionTypeRemoved(prototypeType)); + } + private void ProductionTypeAdded(Entity ent, ref ReagentProductionTypeAdded args) + { + if (!_protoManager.TryIndex(args.ProductionType, out var productionType)) + return; + + ent.Comp.ProductionTypes.Add(args.ProductionType); + + _solutionContainer.EnsureSolution(ent.Owner, productionType.SolutionName,out _, out var solution, productionType.MaximumCapacity); + solution?.AddReagent(productionType.Reagent, productionType.MaximumCapacity); + } + private void ProductionTypeRemoved(Entity ent, ref ReagentProductionTypeRemoved args) + { + ent.Comp.ProductionTypes.Remove(args.ProductionType); + //If there are no more production types, just remove the component + if (ent.Comp.ProductionTypes.Count == 0) + RemCompDeferred(ent); + } +} diff --git a/Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionTraitFunction.cs b/Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionTraitFunction.cs new file mode 100644 index 0000000000..8ac325c57f --- /dev/null +++ b/Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionTraitFunction.cs @@ -0,0 +1,34 @@ +using Content.Shared._DEN.ReagentProduction.Prototypes; +using Content.Shared.Traits; +using JetBrains.Annotations; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.Manager; + + +namespace Content.Shared._DEN.ReagentProduction.Systems; + + +public sealed partial class ReagentProductionTraitFunction +{ + [UsedImplicitly] + public sealed partial class TraitAddReagentProduction : TraitFunction + { + [DataField, AlwaysPushInheritance,] + public List> ReagentProductionTypes = []; + + public override void OnPlayerSpawn( + EntityUid uid, + IComponentFactory factory, + IEntityManager entityManager, + ISerializationManager serializationManager + ) + { + var prototype = IoCManager.Resolve(); + var reagentProduction = entityManager.System(); + + foreach (var productionTypeId in ReagentProductionTypes) + if (prototype.TryIndex(productionTypeId, out var productionType)) + reagentProduction.AddProductionType(uid, productionType); + } + } +} diff --git a/Resources/Locale/en-US/_DEN/verbs/reagent-production-verb.ftl b/Resources/Locale/en-US/_DEN/verbs/reagent-production-verb.ftl new file mode 100644 index 0000000000..1b10bc50e2 --- /dev/null +++ b/Resources/Locale/en-US/_DEN/verbs/reagent-production-verb.ftl @@ -0,0 +1 @@ +verb-categories-fill = Fill with diff --git a/Resources/Prototypes/_DEN/ReagentProduction/production_types.yml b/Resources/Prototypes/_DEN/ReagentProduction/production_types.yml new file mode 100644 index 0000000000..e755ddc2da --- /dev/null +++ b/Resources/Prototypes/_DEN/ReagentProduction/production_types.yml @@ -0,0 +1,41 @@ +- type: reagentProductionType + id: CumProduction + reagent: Cum + solutionName: balls + maximumCapacity: 30 + maximumLoad: 10 + unitsPerProduction: 5 + dryPopup: cum-verb-dry + successPopup: cum-verb-success + +- type: reagentProductionType + id: BreastMilkProduction + reagent: Milk + solutionName: breasts + maximumCapacity: 50 + maximumLoad: 5 + fillTime: 1 + unitsPerProduction: 5 + dryPopup: milk-verb-dry + successPopup: milk-verb-success + +- type: reagentProductionType + id: SquirtProduction + reagent: NaturalLubricant + solutionName: pussy + maximumCapacity: 10 + maximumLoad: 2 + unitsPerProduction: 4 + dryPopup: squirt-verb-dry + successPopup: squirt-verb-success + +- type: reagentProductionType + id: HoneyProduction + reagent: Honey + solutionName: honeyStomach + maximumCapacity: 50 + maximumLoad: 5 + fillTime: 1 + unitsPerProduction: 5 + dryPopup: honey-verb-dry + successPopup: honey-verb-success diff --git a/Resources/Prototypes/_Floof/Traits/lewd.yml b/Resources/Prototypes/_Floof/Traits/lewd.yml new file mode 100644 index 0000000000..3b686b1f08 --- /dev/null +++ b/Resources/Prototypes/_Floof/Traits/lewd.yml @@ -0,0 +1,107 @@ +# SPDX-FileCopyrightText: 2024 Pierson Arnold +# SPDX-FileCopyrightText: 2025 Jakumba +# SPDX-FileCopyrightText: 2025 Rosycup +# SPDX-FileCopyrightText: 2025 Tabitha +# SPDX-FileCopyrightText: 2025 portfiend +# SPDX-FileCopyrightText: 2025 sleepyyapril +# +# SPDX-License-Identifier: AGPL-3.0-or-later AND MIT + +- type: trait + id: CumProducer + category: Lewd + slots: 0 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - StationAi + - Borg + - MedicalBorg + functions: + - !type:TraitAddReagentProduction # Den new reagent production system + reagentProductionTypes: + - CumProduction + +# components: +# - type: CumProducer +# solutionname: "penis" +# - type: SolutionContainerManager +# solutions: +# penis: +# maxVol: 25 +# reagents: +# - ReagentId: Cum +# Quantity: 25 + +- type: trait + id: MilkProducer + category: Lewd + slots: 0 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - StationAi + - Borg + - MedicalBorg + functions: + - !type:TraitAddReagentProduction # Den new reagent production system + reagentProductionTypes: + - BreastMilkProduction + + +# components: +# - type: MilkProducer +# solutionname: "breasts" +# - type: SolutionContainerManager +# solutions: +# breasts: +# maxVol: 50 +# reagents: +# - ReagentId: Milk +# Quantity: 50 + +- type: trait + id: SquirtProducer + category: Lewd + slots: 0 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - StationAi + - Borg + - MedicalBorg + functions: + - !type:TraitAddReagentProduction # Den new reagent production system + reagentProductionTypes: + - SquirtProduction + +# components: +# - type: SquirtProducer +# solutionname: "vagina" +# - type: SolutionContainerManager +# solutions: +# vagina: +# maxVol: 25 +# reagents: +# - ReagentId: NaturalLubricant +# Quantity: 25 + +- type: trait + id: HoneyProducer + category: TraitsPhysicalBiological + points: -1 # Point cost added to balance with removal of species restriction + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - StationAi + - Borg + - MedicalBorg + functions: + - !type:TraitAddReagentProduction # Den new reagent production system + reagentProductionTypes: + - HoneyProduction + From 9bca604f268013b970828ee8eeb80c81b93f943e Mon Sep 17 00:00:00 2001 From: Alex C <53302665+honeyed-lemons@users.noreply.github.com> Date: Sun, 1 Mar 2026 17:09:30 -0500 Subject: [PATCH 2/6] Reagent Production Cleanup + New Production Traits (#2480) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## About the PR Code wise, all i've done is make it so verb names are capitalized, however this PR does also: - Add synthetic cum, a type of cum lube, and synthetic lube, a water based lube. - Add Glycerol and Hydroxyethyl Cellulose, ingredients for creating synthetic lube. - Replace space lube in sexual lubricant with synthetic lube. - Add two new traits, one for each new lewd reagents. ## Why / Balance Capitalize verbs bc verbs are capitalized The new traits / lewd reagents are added to facilitate roleplay with our crew members who cannot naturally produce certain fluids. The new traits are incompatible with their natural counterparts, as to not let you make too many reagents on demand? Is than issue? i dunno. As for why the process for making the new reagents is so complex and (vaugely) realistic? I wanted to. I've made sure it's not possible to accidentally create synthetic lube! ## Technical details Me add capitalization Also I've moved the honey producer trait to den folders because we added it ## Media image ## Requirements - [x] I have read and am following the [Pull Request and Changelog Guidelines](https://docs.spacestation14.com/en/general-development/codebase-info/pull-request-guidelines.html). - [x] I have added media to this PR or it does not require an ingame showcase. - [x] I have tested any changes or additions. - [x] I can confirm this PR contains no AI-generated content, and did not use any AI-generated content. ## Breaking changes N/A **Changelog** :cl: - add: Traits to produce Synthetic Cum and Synthetic Lube! - add: Synthetic Cum and Synthetic Lube are now able to be made by a fairly complex chemical process. Have fun! (cherry picked from commit 3cf732c73b30c2b103ca5d13b95ad78513a22b4e) --- .../Systems/ReagentProductionSystem.cs | 18 +++--- .../en-US/_DEN/reagents/meta/chemicals.ftl | 5 ++ .../Locale/en-US/_DEN/reagents/meta/lewd.ftl | 5 ++ Resources/Locale/en-US/_DEN/traits/lewd.ftl | 15 +++++ .../en-US/_DEN/verbs/lewd-reagent-verbs.ftl | 5 ++ .../ReagentProduction/production_types.yml | 22 ++++++++ .../Prototypes/_DEN/Reagents/chemicals.yml | 24 ++++++++ Resources/Prototypes/_DEN/Reagents/lewd.yml | 27 +++++++++ .../_DEN/Recipes/Reactions/chemicals.yml | 22 ++++++++ .../_DEN/Recipes/Reactions/lewd.yml | 22 ++++++++ Resources/Prototypes/_DEN/Traits/lewd.yml | 56 +++++++++++++++++++ .../_DEN/VASH/Entities/Objects/sexlube.yml | 38 +++++++++++++ Resources/Prototypes/_Floof/Traits/lewd.yml | 31 ++++------ 13 files changed, 263 insertions(+), 27 deletions(-) create mode 100644 Resources/Locale/en-US/_DEN/reagents/meta/chemicals.ftl create mode 100644 Resources/Locale/en-US/_DEN/reagents/meta/lewd.ftl create mode 100644 Resources/Locale/en-US/_DEN/traits/lewd.ftl create mode 100644 Resources/Locale/en-US/_DEN/verbs/lewd-reagent-verbs.ftl create mode 100644 Resources/Prototypes/_DEN/Reagents/chemicals.yml create mode 100644 Resources/Prototypes/_DEN/Reagents/lewd.yml create mode 100644 Resources/Prototypes/_DEN/Recipes/Reactions/chemicals.yml create mode 100644 Resources/Prototypes/_DEN/Recipes/Reactions/lewd.yml create mode 100644 Resources/Prototypes/_DEN/Traits/lewd.yml create mode 100644 Resources/Prototypes/_DEN/VASH/Entities/Objects/sexlube.yml diff --git a/Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionSystem.cs b/Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionSystem.cs index 19a70c4430..d73f93cffe 100644 --- a/Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionSystem.cs +++ b/Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionSystem.cs @@ -1,3 +1,8 @@ +// SPDX-FileCopyrightText: 2026 Alex C +// +// SPDX-License-Identifier: MIT + +using System.Globalization; using Content.Shared.Chemistry.Components.SolutionManager; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.EntitySystems; @@ -49,12 +54,10 @@ public override void Update(float frameTime) { base.Update(frameTime); var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var producerComponent, out var sol)) + while (query.MoveNext(out var uid, out var producerComponent, out _)) { - if (!_mobState.IsAlive(uid)) - continue; - - if (_gameTiming.CurTime < producerComponent.NextUpdate) + // If the mob is dead OR it isnt time for the next update, don't move foward + if (!_mobState.IsAlive(uid) || _gameTiming.CurTime < producerComponent.NextUpdate) continue; producerComponent.NextUpdate += producerComponent.UpdateInterval; @@ -91,14 +94,15 @@ private void AddVerbs(Entity container, ref GetVerb if (!_protoManager.TryIndex(productionTypeId, out var productionType) || !_protoManager.TryIndex(productionType.Reagent, out var reagent)) continue; + var producer = args.User; var verb = new InteractionVerb { Category = ReagentFillCategory, Act = () => StartFillDoAfter((producer, producerComp), container, productionTypeId), - Text = reagent.LocalizedName, + Text = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(reagent.LocalizedName), CloseMenu = true, - Priority = 1 + Priority = -1 }; args.Verbs.Add(verb); } diff --git a/Resources/Locale/en-US/_DEN/reagents/meta/chemicals.ftl b/Resources/Locale/en-US/_DEN/reagents/meta/chemicals.ftl new file mode 100644 index 0000000000..1ddad48b08 --- /dev/null +++ b/Resources/Locale/en-US/_DEN/reagents/meta/chemicals.ftl @@ -0,0 +1,5 @@ +reagent-name-glycerol = glycerol +reagent-desc-glycerol = A sweet tasting, colorless, and oderless hydrating chemical. + +reagent-name-hydro-cellulose = hydroxyethyl cellulose +reagent-desc-hydro-cellulose = A commonly used thickening agent, often found in foods, lubes, and cosmetics. diff --git a/Resources/Locale/en-US/_DEN/reagents/meta/lewd.ftl b/Resources/Locale/en-US/_DEN/reagents/meta/lewd.ftl new file mode 100644 index 0000000000..9a2718255e --- /dev/null +++ b/Resources/Locale/en-US/_DEN/reagents/meta/lewd.ftl @@ -0,0 +1,5 @@ +reagent-name-synth-cum = synthetic cum +reagent-desc-synth-cum = A flavorless lubricant made to look like cum + +reagent-name-synth-lube = synthetic lube +reagent-desc-synth-lube = Flavorless lubricant, made with maximum slipperyness in mind! Silicon free. diff --git a/Resources/Locale/en-US/_DEN/traits/lewd.ftl b/Resources/Locale/en-US/_DEN/traits/lewd.ftl new file mode 100644 index 0000000000..9cf17846f5 --- /dev/null +++ b/Resources/Locale/en-US/_DEN/traits/lewd.ftl @@ -0,0 +1,15 @@ +trait-name-SynthCumProducer = Synthetic Cum Producer (Synthetic Cock) +trait-description-SynthCumProducer = This trait allows you to fill containers (such as beakers) with synthetic cum, to + suit your roleplay needs. [italic][color=orange] + Always keep server rules in mind[/color] and absolutely [color=red]do not expose people + to lewd reagents without their explicit consent[/color]. This includes, for example, + leaving it in public where other people can find it, or tricking people into + consuming it. [color=red]You will be banned.[/color][/italic] + +trait-name-SynthLubeProducer = Synthetic Lube Producer (Lube Dispenser?) +trait-description-SynthLubeProducer = This trait allows you to fill containers (such as beakers) with synthetic lubricant, to + suit your roleplay needs. [italic][color=orange] + Always keep server rules in mind[/color] and absolutely [color=red]do not expose people + to lewd reagents without their explicit consent[/color]. This includes, for example, + leaving it in public where other people can find it, or tricking people into + consuming it. [color=red]You will be banned.[/color][/italic] diff --git a/Resources/Locale/en-US/_DEN/verbs/lewd-reagent-verbs.ftl b/Resources/Locale/en-US/_DEN/verbs/lewd-reagent-verbs.ftl new file mode 100644 index 0000000000..a8ee5c7fe7 --- /dev/null +++ b/Resources/Locale/en-US/_DEN/verbs/lewd-reagent-verbs.ftl @@ -0,0 +1,5 @@ +synth-lube-verb-dry = Your lube tube is empty. +synth-lube-verb-success = You dispense {$amount}u of synthetic lubricant into {THE($target)}. + +synth-cum-verb-dry = Your synthetic balls are empty. +synth-cum-verb-success = You dispense {$amount}u of synthetic cum into {THE($target)}. diff --git a/Resources/Prototypes/_DEN/ReagentProduction/production_types.yml b/Resources/Prototypes/_DEN/ReagentProduction/production_types.yml index e755ddc2da..23c26f183c 100644 --- a/Resources/Prototypes/_DEN/ReagentProduction/production_types.yml +++ b/Resources/Prototypes/_DEN/ReagentProduction/production_types.yml @@ -39,3 +39,25 @@ unitsPerProduction: 5 dryPopup: honey-verb-dry successPopup: honey-verb-success + +- type: reagentProductionType + id: SynthCumProduction + reagent: SyntheticCum + solutionName: syntheticBalls #I guess???????? + maximumCapacity: 50 + maximumLoad: 10 + fillTime: 3 + unitsPerProduction: 10 + dryPopup: synth-cum-verb-dry + successPopup: synth-cum-verb-success + +- type: reagentProductionType + id: SynthLubeProduction + reagent: SyntheticLubricant + solutionName: syntheticLubeTube #yupppp + maximumCapacity: 70 + maximumLoad: 30 + fillTime: 3 + unitsPerProduction: 2 + dryPopup: synth-lube-verb-dry + successPopup: synth-lube-verb-success diff --git a/Resources/Prototypes/_DEN/Reagents/chemicals.yml b/Resources/Prototypes/_DEN/Reagents/chemicals.yml new file mode 100644 index 0000000000..3ad2dbce8d --- /dev/null +++ b/Resources/Prototypes/_DEN/Reagents/chemicals.yml @@ -0,0 +1,24 @@ +- type: reagent + id: Glycerol + group: Foods + name: reagent-name-glycerol + desc: reagent-desc-glycerol + color: "#E9EAF2" + flavor: sweet + viscosity: 0.35 + physicalDesc: reagent-physical-desc-thick + metabolisms: + Drink: + effects: + - !type:SatiateThirst + factor: 6 + +- type: reagent + id: HydroxyethylCellulose + color: "#E9EAF2" + group: Foods + name: reagent-name-hydro-cellulose + desc: reagent-desc-hydro-cellulose + flavor: nothing + viscosity: 0.35 + physicalDesc: reagent-physical-desc-thick diff --git a/Resources/Prototypes/_DEN/Reagents/lewd.yml b/Resources/Prototypes/_DEN/Reagents/lewd.yml new file mode 100644 index 0000000000..63b319c114 --- /dev/null +++ b/Resources/Prototypes/_DEN/Reagents/lewd.yml @@ -0,0 +1,27 @@ +- type: reagent + id: SyntheticCum + parent: Cum + name: reagent-name-synth-cum + desc: reagent-desc-synth-cum + flavor: nothing + metabolisms: + Drink: + effects: + - !type:SatiateThirst + factor: 0.1 + noRandom: true + +- type: reagent + id: SyntheticLubricant + parent: NaturalLubricant + name: reagent-name-synth-lube + desc: reagent-desc-synth-lube + color: "#d6d6d6" + physicalDesc: reagent-physical-desc-shiny + flavor: nothing + metabolisms: + Drink: + effects: + - !type:SatiateThirst + factor: 0.1 + noRandom: true diff --git a/Resources/Prototypes/_DEN/Recipes/Reactions/chemicals.yml b/Resources/Prototypes/_DEN/Recipes/Reactions/chemicals.yml new file mode 100644 index 0000000000..5495fa89cb --- /dev/null +++ b/Resources/Prototypes/_DEN/Recipes/Reactions/chemicals.yml @@ -0,0 +1,22 @@ +# This is NOT accurate. +- type: reaction + id: Glycerol + minTemp: 373.15 + reactants: + Water: + amount: 3 + Fat: + amount: 1 + products: + Glycerol: 4 + +- type: reaction + id: HydroxyethylCellulose + reactants: + Cellulose: + amount: 1 + SodiumHydroxide: + amount: 1 + products: + HydroxyethylCellulose: 1 + SodiumHydroxide: 1 diff --git a/Resources/Prototypes/_DEN/Recipes/Reactions/lewd.yml b/Resources/Prototypes/_DEN/Recipes/Reactions/lewd.yml new file mode 100644 index 0000000000..9dfc5919bc --- /dev/null +++ b/Resources/Prototypes/_DEN/Recipes/Reactions/lewd.yml @@ -0,0 +1,22 @@ +- type: reaction + id: SyntheticLubricant + minTemp: 398.15 + requiredMixerCategories: + - Stir + reactants: + Water: + amount: 2 + Glycerol: + amount: 1 + products: + SyntheticLubricant: 3 + +- type: reaction + id: SyntheticCum + reactants: + SyntheticLubricant: + amount: 3 + SodiumCarbonate: + amount: 1 + products: + SyntheticCum: 4 diff --git a/Resources/Prototypes/_DEN/Traits/lewd.yml b/Resources/Prototypes/_DEN/Traits/lewd.yml new file mode 100644 index 0000000000..7b516e99a8 --- /dev/null +++ b/Resources/Prototypes/_DEN/Traits/lewd.yml @@ -0,0 +1,56 @@ +- type: trait + id: SynthCumProducer + category: Lewd + slots: 0 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - StationAi + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - CumProducer + functions: + - !type:TraitAddReagentProduction # Den new reagent production system + reagentProductionTypes: + - SynthCumProduction + +- type: trait + id: SynthLubeProducer + category: Lewd + slots: 0 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - StationAi + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - SquirtProducer + functions: + - !type:TraitAddReagentProduction # Den new reagent production system + reagentProductionTypes: + - SynthLubeProduction + +- type: trait + id: HoneyProducer + category: TraitsPhysicalBiological + points: -1 # Point cost added to balance with removal of species restriction + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - StationAi + - Borg + - MedicalBorg + functions: + - !type:TraitAddReagentProduction + reagentProductionTypes: + - HoneyProduction + diff --git a/Resources/Prototypes/_DEN/VASH/Entities/Objects/sexlube.yml b/Resources/Prototypes/_DEN/VASH/Entities/Objects/sexlube.yml new file mode 100644 index 0000000000..141ee1e16e --- /dev/null +++ b/Resources/Prototypes/_DEN/VASH/Entities/Objects/sexlube.yml @@ -0,0 +1,38 @@ +# SPDX-FileCopyrightText: 2025 Eightballll +# SPDX-FileCopyrightText: 2025 KekaniCreates +# SPDX-FileCopyrightText: 2025 portfiend +# SPDX-FileCopyrightText: 2025 sleepyyapril +# +# SPDX-License-Identifier: MIT AND AGPL-3.0-or-later + +- type: entity # Pretty much a copy of the Water Bottle, shifted all sex-lube like. Copied from Entities/Objects/Consumable/Drinks/drinks_bottles.yml + parent: [BaseObjectVerbsLewd, DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseInventory] + id: SexLube + name: sexual lubricant + description: A bottle of synthetic lubricant to help with sexual activity. #Too straight to the point, although I'm not sure what else you use lube for than sex lmao -KC + components: + - type: Item + size: Small + - type: SolutionContainerManager + solutions: + drink: + maxVol: 20 #it probably doesn't need to be that big. If you want more, go ask the Chemist or get a Toybox.-KC + reagents: + - ReagentId: SyntheticLubricant # DEN + Quantity: 20 + - type: Sprite + sprite: _DEN/VASH/Objects/bottlelube.rsi + layers: + - state: icon + map: ["enum.OpenableVisuals.Layer"] + - state: icon-1 + map: ["enum.SolutionContainerLayers.Fill"] + visible: false + - type: Appearance + - type: SolutionContainerVisuals + maxFillLevels: 5 + fillBaseName: icon- + inHandsMaxFillLevels: 2 + inHandsFillBaseName: -fill- + - type: Openable + closeable: true #this ain't a packet, you should be able to reseal it. diff --git a/Resources/Prototypes/_Floof/Traits/lewd.yml b/Resources/Prototypes/_Floof/Traits/lewd.yml index 3b686b1f08..51380aec15 100644 --- a/Resources/Prototypes/_Floof/Traits/lewd.yml +++ b/Resources/Prototypes/_Floof/Traits/lewd.yml @@ -18,8 +18,12 @@ - StationAi - Borg - MedicalBorg + - !type:CharacterTraitRequirement # DEN + inverted: true + traits: + - SynthCumProducer functions: - - !type:TraitAddReagentProduction # Den new reagent production system + - !type:TraitAddReagentProduction # DEN reagentProductionTypes: - CumProduction @@ -46,7 +50,7 @@ - Borg - MedicalBorg functions: - - !type:TraitAddReagentProduction # Den new reagent production system + - !type:TraitAddReagentProduction # DEN reagentProductionTypes: - BreastMilkProduction @@ -73,8 +77,12 @@ - StationAi - Borg - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - SynthLubeProducer functions: - - !type:TraitAddReagentProduction # Den new reagent production system + - !type:TraitAddReagentProduction # DEN reagentProductionTypes: - SquirtProduction @@ -88,20 +96,3 @@ # reagents: # - ReagentId: NaturalLubricant # Quantity: 25 - -- type: trait - id: HoneyProducer - category: TraitsPhysicalBiological - points: -1 # Point cost added to balance with removal of species restriction - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - StationAi - - Borg - - MedicalBorg - functions: - - !type:TraitAddReagentProduction # Den new reagent production system - reagentProductionTypes: - - HoneyProduction - From ca05f2c7698e28c8c2de3ab2dde464ed3c1d54cd Mon Sep 17 00:00:00 2001 From: honeyed-lemons Date: Tue, 3 Mar 2026 23:17:47 -0500 Subject: [PATCH 3/6] Add everything else :D --- .../Components/ReagentProducerComponent.cs | 1 - .../ReagentProductionSystem.cs | 39 +++---- .../Events/ReagentProductionEvents.cs | 5 +- .../ReagentProductionTypePrototype.cs | 9 +- .../Systems/ReagentProductionTraitFunction.cs | 34 ------ .../TraitFunctions.ReagentProduction.cs | 46 ++++++++ .../Locale/en-US/_DEN/guidebook/guides.ftl | 2 + .../Locale/en-US/_DEN/reagents/meta/lewd.ftl | 8 +- .../Locale/en-US/_DEN/traits/categories.ftl | 1 + Resources/Locale/en-US/_DEN/traits/lewd.ftl | 49 ++++++--- Resources/Locale/en-US/_DEN/traits/quirks.ftl | 2 + .../en-US/_DEN/verbs/lewd-reagent-verbs.ftl | 5 - .../_DEN/verbs/reagent-production-verb.ftl | 1 - .../_DEN/verbs/reagent-production-verbs.ftl | 19 ++++ Resources/Prototypes/Guidebook/chemicals.yml | 1 + .../_DEN/EntityTraits/categories.yml | 8 ++ .../Prototypes/_DEN/EntityTraits/lewd.yml | 56 ++++++++++ .../Prototypes/_DEN/EntityTraits/quirks.yml | 10 ++ .../Prototypes/_DEN/Guidebook/chemicals.yml | 5 + .../Prototypes/_DEN/Reagents/chemicals.yml | 2 +- Resources/Prototypes/_DEN/Reagents/lewd.yml | 51 +++++++-- Resources/Prototypes/_DEN/Traits/lewd.yml | 56 ---------- .../_DEN/VASH/Entities/Objects/sexlube.yml | 38 ------- Resources/Prototypes/_Floof/Traits/lewd.yml | 98 ------------------ .../Guidebook/_DEN/ChemicalTabs/Lewd.xml | 5 + .../_DEN/Interface/VerbIcons/ATTRIBUTION.txt | 3 + .../_DEN/Interface/VerbIcons/lewd.svg | 65 ++++++++++++ .../Interface/VerbIcons/lewd.svg.192dpi.png | Bin 0 -> 12517 bytes .../VerbIcons/lewd.svg.192dpi.png.yml | 2 + 29 files changed, 340 insertions(+), 281 deletions(-) rename Content.Shared/_DEN/ReagentProduction/{Systems => EntitySystems}/ReagentProductionSystem.cs (91%) delete mode 100644 Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionTraitFunction.cs create mode 100644 Content.Shared/_DEN/Traits/TraitFunctions/TraitFunctions.ReagentProduction.cs create mode 100644 Resources/Locale/en-US/_DEN/guidebook/guides.ftl create mode 100644 Resources/Locale/en-US/_DEN/traits/quirks.ftl delete mode 100644 Resources/Locale/en-US/_DEN/verbs/lewd-reagent-verbs.ftl delete mode 100644 Resources/Locale/en-US/_DEN/verbs/reagent-production-verb.ftl create mode 100644 Resources/Locale/en-US/_DEN/verbs/reagent-production-verbs.ftl create mode 100644 Resources/Prototypes/_DEN/EntityTraits/lewd.yml create mode 100644 Resources/Prototypes/_DEN/Guidebook/chemicals.yml delete mode 100644 Resources/Prototypes/_DEN/Traits/lewd.yml delete mode 100644 Resources/Prototypes/_DEN/VASH/Entities/Objects/sexlube.yml delete mode 100644 Resources/Prototypes/_Floof/Traits/lewd.yml create mode 100644 Resources/ServerInfo/Guidebook/_DEN/ChemicalTabs/Lewd.xml create mode 100644 Resources/Textures/_DEN/Interface/VerbIcons/ATTRIBUTION.txt create mode 100644 Resources/Textures/_DEN/Interface/VerbIcons/lewd.svg create mode 100644 Resources/Textures/_DEN/Interface/VerbIcons/lewd.svg.192dpi.png create mode 100644 Resources/Textures/_DEN/Interface/VerbIcons/lewd.svg.192dpi.png.yml diff --git a/Content.Shared/_DEN/ReagentProduction/Components/ReagentProducerComponent.cs b/Content.Shared/_DEN/ReagentProduction/Components/ReagentProducerComponent.cs index a53d1449de..36effc22b0 100644 --- a/Content.Shared/_DEN/ReagentProduction/Components/ReagentProducerComponent.cs +++ b/Content.Shared/_DEN/ReagentProduction/Components/ReagentProducerComponent.cs @@ -2,7 +2,6 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; - namespace Content.Shared._DEN.ReagentProduction.Components; [RegisterComponent] diff --git a/Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionSystem.cs b/Content.Shared/_DEN/ReagentProduction/EntitySystems/ReagentProductionSystem.cs similarity index 91% rename from Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionSystem.cs rename to Content.Shared/_DEN/ReagentProduction/EntitySystems/ReagentProductionSystem.cs index d73f93cffe..ed323eb95c 100644 --- a/Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionSystem.cs +++ b/Content.Shared/_DEN/ReagentProduction/EntitySystems/ReagentProductionSystem.cs @@ -1,10 +1,9 @@ -// SPDX-FileCopyrightText: 2026 Alex C -// -// SPDX-License-Identifier: MIT - using System.Globalization; -using Content.Shared.Chemistry.Components.SolutionManager; +using Content.Shared._DEN.ReagentProduction.Components; +using Content.Shared._DEN.ReagentProduction.Events; +using Content.Shared._DEN.ReagentProduction.Prototypes; using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Components.SolutionManager; using Content.Shared.Chemistry.EntitySystems; using Content.Shared.DoAfter; using Content.Shared.FixedPoint; @@ -12,15 +11,12 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Popups; using Content.Shared.Verbs; -using Enumerable = System.Linq.Enumerable; using Robust.Shared.Prototypes; using Robust.Shared.Timing; +using Enumerable = System.Linq.Enumerable; using static Content.Shared._DEN.ReagentProduction.Events.ReagentProductionEvents; -using Content.Shared._DEN.ReagentProduction.Components; -using Content.Shared._DEN.ReagentProduction.Events; -using Content.Shared._DEN.ReagentProduction.Prototypes; -namespace Content.Shared._DEN.ReagentProduction.Systems; +namespace Content.Shared._DEN.ReagentProduction.EntitySystems; public sealed class ReagentProductionSystem : EntitySystem { @@ -31,7 +27,7 @@ public sealed class ReagentProductionSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!; - private static readonly VerbCategory ReagentFillCategory = new("verb-categories-fill", "/Textures/_DEN/Interface/VerbIcons/lewd.svg.192dpi.png"); + public static readonly VerbCategory ReagentFillCategory = new("verb-categories-fill", "/Textures/_DEN/Interface/VerbIcons/lewd.svg.192dpi.png"); public override void Initialize() { @@ -43,8 +39,8 @@ public override void Initialize() SubscribeLocalEvent(FinishFillDoAfter); SubscribeLocalEvent(OnMapInit); - } + private void OnMapInit(Entity ent, ref MapInitEvent args) { ent.Comp.NextUpdate = _gameTiming.CurTime + ent.Comp.UpdateInterval; @@ -86,8 +82,16 @@ public override void Update(float frameTime) private void AddVerbs(Entity container, ref GetVerbsEvent args) { - if (!args.CanInteract || !args.CanAccess || !TryComp(args.User, out var producerComp)) + if (!args.Using.HasValue || !args.CanInteract || !args.CanAccess) + return; + + var user = args.User; + + if (!TryComp(user, out var producerComp)) + { return; + } + // Add a verb for every production type the producer has foreach (var productionTypeId in producerComp.ProductionTypes) { @@ -95,14 +99,12 @@ private void AddVerbs(Entity container, ref GetVerb !_protoManager.TryIndex(productionType.Reagent, out var reagent)) continue; - var producer = args.User; var verb = new InteractionVerb { Category = ReagentFillCategory, - Act = () => StartFillDoAfter((producer, producerComp), container, productionTypeId), + Act = () => StartFillDoAfter((user, producerComp), container, productionTypeId), Text = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(reagent.LocalizedName), - CloseMenu = true, - Priority = -1 + Priority = -1, }; args.Verbs.Add(verb); } @@ -117,7 +119,7 @@ ProtoId productionTypeId var productionType = _protoManager.Index(productionTypeId); _doAfter.TryStartDoAfter( - new(EntityManager, user, productionType.FillTime, new ReagentProductionFillEvent(productionTypeId), user, target: target) + new(EntityManager, user, productionType.DoAfterLength, new ReagentProductionFillEvent(productionTypeId), user, target: target) { BreakOnMove = true, BreakOnDropItem = true @@ -182,6 +184,7 @@ public void RemoveProductionType(EntityUid entity, ReagentProductionTypePrototyp RaiseLocalEvent(entity, new ReagentProductionTypeRemoved(prototypeType)); } + private void ProductionTypeAdded(Entity ent, ref ReagentProductionTypeAdded args) { if (!_protoManager.TryIndex(args.ProductionType, out var productionType)) diff --git a/Content.Shared/_DEN/ReagentProduction/Events/ReagentProductionEvents.cs b/Content.Shared/_DEN/ReagentProduction/Events/ReagentProductionEvents.cs index 903d053fa5..b705ed3358 100644 --- a/Content.Shared/_DEN/ReagentProduction/Events/ReagentProductionEvents.cs +++ b/Content.Shared/_DEN/ReagentProduction/Events/ReagentProductionEvents.cs @@ -31,6 +31,9 @@ public ReagentProductionFillEvent( ProtoId produ ProductionType = productionType; } - public override DoAfterEvent Clone() => this; + public override DoAfterEvent Clone() + { + return this; + } } diff --git a/Content.Shared/_DEN/ReagentProduction/Prototypes/ReagentProductionTypePrototype.cs b/Content.Shared/_DEN/ReagentProduction/Prototypes/ReagentProductionTypePrototype.cs index 70dd061885..9b0b69071c 100644 --- a/Content.Shared/_DEN/ReagentProduction/Prototypes/ReagentProductionTypePrototype.cs +++ b/Content.Shared/_DEN/ReagentProduction/Prototypes/ReagentProductionTypePrototype.cs @@ -5,7 +5,7 @@ namespace Content.Shared._DEN.ReagentProduction.Prototypes; [Prototype] -public sealed class ReagentProductionTypePrototype : IPrototype +public sealed partial class ReagentProductionTypePrototype : IPrototype { [IdDataField] public string ID { get; private set; } = default!; @@ -14,7 +14,7 @@ public sealed class ReagentProductionTypePrototype : IPrototype /// Reagent to produce /// [DataField] - public ProtoId Reagent = "Cum"; + public ProtoId Reagent = "Water"; /// /// The solution to produce into /// @@ -32,11 +32,8 @@ public sealed class ReagentProductionTypePrototype : IPrototype [DataField] public FixedPoint2 MaximumLoad = 10; - /// - /// Doafter length - /// [DataField] - public TimeSpan FillTime = TimeSpan.FromSeconds(3); + public TimeSpan DoAfterLength = TimeSpan.FromSeconds(3); /// /// How many units are produced each update diff --git a/Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionTraitFunction.cs b/Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionTraitFunction.cs deleted file mode 100644 index 8ac325c57f..0000000000 --- a/Content.Shared/_DEN/ReagentProduction/Systems/ReagentProductionTraitFunction.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Content.Shared._DEN.ReagentProduction.Prototypes; -using Content.Shared.Traits; -using JetBrains.Annotations; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.Manager; - - -namespace Content.Shared._DEN.ReagentProduction.Systems; - - -public sealed partial class ReagentProductionTraitFunction -{ - [UsedImplicitly] - public sealed partial class TraitAddReagentProduction : TraitFunction - { - [DataField, AlwaysPushInheritance,] - public List> ReagentProductionTypes = []; - - public override void OnPlayerSpawn( - EntityUid uid, - IComponentFactory factory, - IEntityManager entityManager, - ISerializationManager serializationManager - ) - { - var prototype = IoCManager.Resolve(); - var reagentProduction = entityManager.System(); - - foreach (var productionTypeId in ReagentProductionTypes) - if (prototype.TryIndex(productionTypeId, out var productionType)) - reagentProduction.AddProductionType(uid, productionType); - } - } -} diff --git a/Content.Shared/_DEN/Traits/TraitFunctions/TraitFunctions.ReagentProduction.cs b/Content.Shared/_DEN/Traits/TraitFunctions/TraitFunctions.ReagentProduction.cs new file mode 100644 index 0000000000..96dfc09b8f --- /dev/null +++ b/Content.Shared/_DEN/Traits/TraitFunctions/TraitFunctions.ReagentProduction.cs @@ -0,0 +1,46 @@ +using Content.Shared._DEN.ReagentProduction.EntitySystems; +using Content.Shared._DEN.ReagentProduction.Prototypes; +using JetBrains.Annotations; +using Robust.Shared.Prototypes; + +namespace Content.Shared._DEN.Traits.TraitFunctions; + +[UsedImplicitly] +public sealed partial class AddReagentProductionTrait : ITraitFunction +{ + /// + /// Reagent Production types this trait provides. + /// + [DataField(required: true)] public List> ProductionTypes { get; private set; } = []; + + [ViewVariables] public List? AddedComponents = null; + + public void OnTraitAdded(EntityUid owner, EntityManager entityManager) + { + + var prototypeManager = IoCManager.Resolve(); + var reagentProduction = entityManager.System(); + + foreach (var productionType in ProductionTypes) + { + if (!prototypeManager.TryIndex(productionType, out var prototype)) + continue; + + reagentProduction.AddProductionType(owner, prototype); + } + } + + public void OnTraitRemoved(EntityUid owner, EntityManager entityManager) + { + var prototypeManager = IoCManager.Resolve(); + var reagentProduction = entityManager.System(); + + foreach (var productionType in ProductionTypes) + { + if (!prototypeManager.TryIndex(productionType, out var prototype)) + continue; + + reagentProduction.RemoveProductionType(owner, prototype); + } + } +} diff --git a/Resources/Locale/en-US/_DEN/guidebook/guides.ftl b/Resources/Locale/en-US/_DEN/guidebook/guides.ftl new file mode 100644 index 0000000000..96cd47026b --- /dev/null +++ b/Resources/Locale/en-US/_DEN/guidebook/guides.ftl @@ -0,0 +1,2 @@ +# Chemical Tabs +guide-entry-lewd = Lewd diff --git a/Resources/Locale/en-US/_DEN/reagents/meta/lewd.ftl b/Resources/Locale/en-US/_DEN/reagents/meta/lewd.ftl index 9a2718255e..828445c3d5 100644 --- a/Resources/Locale/en-US/_DEN/reagents/meta/lewd.ftl +++ b/Resources/Locale/en-US/_DEN/reagents/meta/lewd.ftl @@ -1,5 +1,11 @@ +reagent-name-cum = cum +reagent-desc-cum = A sticky cloudy-white liquid. + +reagent-name-nat-lube = natural lubricant +reagent-desc-nat-lube = A slippery clear liquid. + reagent-name-synth-cum = synthetic cum -reagent-desc-synth-cum = A flavorless lubricant made to look like cum +reagent-desc-synth-cum = A flavorless lubricant made to look like cum. reagent-name-synth-lube = synthetic lube reagent-desc-synth-lube = Flavorless lubricant, made with maximum slipperyness in mind! Silicon free. diff --git a/Resources/Locale/en-US/_DEN/traits/categories.ftl b/Resources/Locale/en-US/_DEN/traits/categories.ftl index ea2c28cb06..59fc07d97a 100644 --- a/Resources/Locale/en-US/_DEN/traits/categories.ftl +++ b/Resources/Locale/en-US/_DEN/traits/categories.ftl @@ -1,2 +1,3 @@ trait-category-species-morphs = Morphotypes trait-category-species-specific = Species-specific +trait-category-lewd = Lewd diff --git a/Resources/Locale/en-US/_DEN/traits/lewd.ftl b/Resources/Locale/en-US/_DEN/traits/lewd.ftl index 9cf17846f5..54263bd518 100644 --- a/Resources/Locale/en-US/_DEN/traits/lewd.ftl +++ b/Resources/Locale/en-US/_DEN/traits/lewd.ftl @@ -1,15 +1,34 @@ -trait-name-SynthCumProducer = Synthetic Cum Producer (Synthetic Cock) -trait-description-SynthCumProducer = This trait allows you to fill containers (such as beakers) with synthetic cum, to - suit your roleplay needs. [italic][color=orange] - Always keep server rules in mind[/color] and absolutely [color=red]do not expose people - to lewd reagents without their explicit consent[/color]. This includes, for example, - leaving it in public where other people can find it, or tricking people into - consuming it. [color=red]You will be banned.[/color][/italic] - -trait-name-SynthLubeProducer = Synthetic Lube Producer (Lube Dispenser?) -trait-description-SynthLubeProducer = This trait allows you to fill containers (such as beakers) with synthetic lubricant, to - suit your roleplay needs. [italic][color=orange] - Always keep server rules in mind[/color] and absolutely [color=red]do not expose people - to lewd reagents without their explicit consent[/color]. This includes, for example, - leaving it in public where other people can find it, or tricking people into - consuming it. [color=red]You will be banned.[/color][/italic] +trait-cum-producer-name = Cum Producer +trait-cum-producer-desc = This trait allows you to fill containers (such as beakers) with cum, to suit your roleplay needs. + + Keep server rules in mind and ABSOLUTELY NEVER expose people to lewd reagents without their explicit consent. + This includes, for example, leaving it in public places for others to see, or tricking people into consuming it. + You WILL be banned for breaking this rule. + +trait-synth-cum-producer-name = Synthetic Cum Producer +trait-synth-cum-producer-desc = This trait allows you to fill containers (such as beakers) with synthetic cum, to suit your roleplay needs. + + Keep server rules in mind and ABSOLUTELY NEVER expose people to lewd reagents without their explicit consent. + This includes, for example, leaving it in public places for others to see, or tricking people into consuming it. + You WILL be banned for breaking this rule. + +trait-squirt-producer-name = Natural Lubricant Producer +trait-squirt-producer-desc = This trait allows you to fill containers (such as beakers) with your natural lubricant, to suit your roleplay needs. + + Keep server rules in mind and ABSOLUTELY NEVER expose people to lewd reagents without their explicit consent. + This includes, for example, leaving it in public places for others to see, or tricking people into consuming it. + You WILL be banned for breaking this rule. + +trait-synth-lube-producer-name = Synthetic Lube Producer +trait-synth-lube-producer-desc = This trait allows you to fill containers (such as beakers) with synthetic lube, to suit your roleplay needs. + + Keep server rules in mind and ABSOLUTELY NEVER expose people to lewd reagents without their explicit consent. + This includes, for example, leaving it in public places for others to see, or tricking people into consuming it. + You WILL be banned for breaking this rule. + +trait-milk-producer-name = Breast Milk Producer +trait-milk-producer-desc = This trait allows you to fill containers (such as beakers) with milk, to suit your roleplay needs. + + Keep server rules in mind and ABSOLUTELY NEVER expose people to lewd reagents without their explicit consent. + This includes, for example, leaving it in public places for others to see, or tricking people into consuming it. + You WILL be banned for breaking this rule. diff --git a/Resources/Locale/en-US/_DEN/traits/quirks.ftl b/Resources/Locale/en-US/_DEN/traits/quirks.ftl new file mode 100644 index 0000000000..c585ddeb3d --- /dev/null +++ b/Resources/Locale/en-US/_DEN/traits/quirks.ftl @@ -0,0 +1,2 @@ +trait-honey-producer-name = Honey Stomach +trait-honey-producer-desc = Your abdomen contains an extra stomach that processes nutrients into honey. diff --git a/Resources/Locale/en-US/_DEN/verbs/lewd-reagent-verbs.ftl b/Resources/Locale/en-US/_DEN/verbs/lewd-reagent-verbs.ftl deleted file mode 100644 index a8ee5c7fe7..0000000000 --- a/Resources/Locale/en-US/_DEN/verbs/lewd-reagent-verbs.ftl +++ /dev/null @@ -1,5 +0,0 @@ -synth-lube-verb-dry = Your lube tube is empty. -synth-lube-verb-success = You dispense {$amount}u of synthetic lubricant into {THE($target)}. - -synth-cum-verb-dry = Your synthetic balls are empty. -synth-cum-verb-success = You dispense {$amount}u of synthetic cum into {THE($target)}. diff --git a/Resources/Locale/en-US/_DEN/verbs/reagent-production-verb.ftl b/Resources/Locale/en-US/_DEN/verbs/reagent-production-verb.ftl deleted file mode 100644 index 1b10bc50e2..0000000000 --- a/Resources/Locale/en-US/_DEN/verbs/reagent-production-verb.ftl +++ /dev/null @@ -1 +0,0 @@ -verb-categories-fill = Fill with diff --git a/Resources/Locale/en-US/_DEN/verbs/reagent-production-verbs.ftl b/Resources/Locale/en-US/_DEN/verbs/reagent-production-verbs.ftl new file mode 100644 index 0000000000..4734db5b37 --- /dev/null +++ b/Resources/Locale/en-US/_DEN/verbs/reagent-production-verbs.ftl @@ -0,0 +1,19 @@ +verb-categories-fill = Fill with + +cum-verb-dry = Your cum tank is empty. +cum-verb-success = You fill {THE($target)} with {$amount}u of cum from your cock. + +milk-verb-dry = Your breasts are empty. +milk-verb-success = You fill {THE($target)} with {$amount}u of milk from your breasts. + +squirt-verb-dry = You're too dry. +squirt-verb-success = You fill {THE($target)} with {$amount}u of natural lubricant. + +synth-lube-verb-dry = Your lube tube is empty. +synth-lube-verb-success = You dispense {$amount}u of synthetic lubricant into {THE($target)}. + +synth-cum-verb-dry = Your synthetic balls are empty. +synth-cum-verb-success = You dispense {$amount}u of synthetic cum into {THE($target)}. + +honey-verb-dry = Your honey stomach is empty. +honey-verb-success = You fill {THE($target)} with {$amount}u of honey from your extra stomach. diff --git a/Resources/Prototypes/Guidebook/chemicals.yml b/Resources/Prototypes/Guidebook/chemicals.yml index 730d7b3045..7313c192a9 100644 --- a/Resources/Prototypes/Guidebook/chemicals.yml +++ b/Resources/Prototypes/Guidebook/chemicals.yml @@ -12,6 +12,7 @@ - Botanical - Biological - Special + - Lewd # DEN - Others filterEnabled: True diff --git a/Resources/Prototypes/_DEN/EntityTraits/categories.yml b/Resources/Prototypes/_DEN/EntityTraits/categories.yml index 723ce83024..2f3e085d77 100644 --- a/Resources/Prototypes/_DEN/EntityTraits/categories.yml +++ b/Resources/Prototypes/_DEN/EntityTraits/categories.yml @@ -1,3 +1,4 @@ +# Species - type: traitCategory id: SpeciesMorphs name: trait-category-species-morphs @@ -8,3 +9,10 @@ id: SpeciesSpecific priority: -10 name: trait-category-species-specific + +# Misc +- type: traitCategory + id: Lewd + name: trait-category-lewd + priority: 20 + maxTraitPoints: 3 diff --git a/Resources/Prototypes/_DEN/EntityTraits/lewd.yml b/Resources/Prototypes/_DEN/EntityTraits/lewd.yml new file mode 100644 index 0000000000..480ee70980 --- /dev/null +++ b/Resources/Prototypes/_DEN/EntityTraits/lewd.yml @@ -0,0 +1,56 @@ +# Reagent Production Traits + +- type: entityTrait + id: CumProducer + name: trait-cum-producer-name + description: trait-cum-producer-desc + category: Lewd + cost: 1 + functions: + - !type:AddReagentProductionTrait + productionTypes: + - CumProduction + +- type: entityTrait + id: SyntheticCumProducer + name: trait-synth-cum-producer-name + description: trait-synth-cum-producer-desc + category: Lewd + cost: 1 + functions: + - !type:AddReagentProductionTrait + productionTypes: + - SynthCumProduction + +- type: entityTrait + id: SquirtProducer + name: trait-squirt-producer-name + description: trait-squirt-producer-desc + category: Lewd + cost: 1 + functions: + - !type:AddReagentProductionTrait + productionTypes: + - SquirtProduction + +- type: entityTrait + id: SyntheticLubeProducer + name: trait-synth-lube-producer-name + description: trait-synth-lube-producer-desc + category: Lewd + cost: 1 + functions: + - !type:AddReagentProductionTrait + productionTypes: + - SynthLubeProduction + +- type: entityTrait + id: MilkProducer + name: trait-milk-producer-name + description: trait-milk-producer-desc + category: Lewd + cost: 1 + functions: + - !type:AddReagentProductionTrait + productionTypes: + - BreastMilkProduction diff --git a/Resources/Prototypes/_DEN/EntityTraits/quirks.yml b/Resources/Prototypes/_DEN/EntityTraits/quirks.yml index d03d373ac0..b8ebd8dda7 100644 --- a/Resources/Prototypes/_DEN/EntityTraits/quirks.yml +++ b/Resources/Prototypes/_DEN/EntityTraits/quirks.yml @@ -42,3 +42,13 @@ - type: DamagedSiliconAccent enableChargeCorruption: false damageAtMaxCorruption: 100 + +- type: entityTrait + id: HoneyProducer + name: trait-honey-producer-name + description: trait-honey-producer-desc + category: Quirks + functions: + - !type:AddReagentProductionTrait + productionTypes: + - HoneyProduction diff --git a/Resources/Prototypes/_DEN/Guidebook/chemicals.yml b/Resources/Prototypes/_DEN/Guidebook/chemicals.yml new file mode 100644 index 0000000000..7caf5c713e --- /dev/null +++ b/Resources/Prototypes/_DEN/Guidebook/chemicals.yml @@ -0,0 +1,5 @@ +- type: guideEntry + id: Lewd + name: guide-entry-lewd + text: "/ServerInfo/Guidebook/_DEN/ChemicalTabs/Lewd.xml" + filterEnabled: True diff --git a/Resources/Prototypes/_DEN/Reagents/chemicals.yml b/Resources/Prototypes/_DEN/Reagents/chemicals.yml index 3ad2dbce8d..112025cc18 100644 --- a/Resources/Prototypes/_DEN/Reagents/chemicals.yml +++ b/Resources/Prototypes/_DEN/Reagents/chemicals.yml @@ -8,7 +8,7 @@ viscosity: 0.35 physicalDesc: reagent-physical-desc-thick metabolisms: - Drink: + Digestion: effects: - !type:SatiateThirst factor: 6 diff --git a/Resources/Prototypes/_DEN/Reagents/lewd.yml b/Resources/Prototypes/_DEN/Reagents/lewd.yml index 63b319c114..311eddd7f3 100644 --- a/Resources/Prototypes/_DEN/Reagents/lewd.yml +++ b/Resources/Prototypes/_DEN/Reagents/lewd.yml @@ -1,3 +1,26 @@ +- type: reagent + id: Cum + name: reagent-name-cum + group: Lewd + desc: reagent-desc-cum + physicalDesc: reagent-physical-desc-sticky + flavor: salty + color: "#ffffff" + viscosity: 0.35 + recognizable: true + evaporationSpeed: 0.3 + metabolisms: + Digestion: + effects: + - !type:SatiateThirst + factor: 0.2 + - !type:SatiateHunger + factor: 1 + footstepSound: + collection: FootstepSticky + params: + volume: 6 + - type: reagent id: SyntheticCum parent: Cum @@ -5,23 +28,39 @@ desc: reagent-desc-synth-cum flavor: nothing metabolisms: - Drink: + Digestion: effects: - !type:SatiateThirst factor: 0.1 - noRandom: true + +- type: reagent + id: NaturalLubricant + name: reagent-name-nat-lube + desc: reagent-desc-nat-lube + parent: SpaceLube + group: Lewd + physicalDesc: reagent-physical-desc-shiny + flavor: funny + color: "#d6d6d6" + evaporationSpeed: 0.3 + metabolisms: + Digestion: + effects: + - !type:SatiateThirst + factor: 0.3 + footstepSound: + collection: FootstepSticky + params: + volume: 4 - type: reagent id: SyntheticLubricant parent: NaturalLubricant name: reagent-name-synth-lube desc: reagent-desc-synth-lube - color: "#d6d6d6" - physicalDesc: reagent-physical-desc-shiny flavor: nothing metabolisms: - Drink: + Digestion: effects: - !type:SatiateThirst factor: 0.1 - noRandom: true diff --git a/Resources/Prototypes/_DEN/Traits/lewd.yml b/Resources/Prototypes/_DEN/Traits/lewd.yml deleted file mode 100644 index 7b516e99a8..0000000000 --- a/Resources/Prototypes/_DEN/Traits/lewd.yml +++ /dev/null @@ -1,56 +0,0 @@ -- type: trait - id: SynthCumProducer - category: Lewd - slots: 0 - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - StationAi - - Borg - - MedicalBorg - - !type:CharacterTraitRequirement - inverted: true - traits: - - CumProducer - functions: - - !type:TraitAddReagentProduction # Den new reagent production system - reagentProductionTypes: - - SynthCumProduction - -- type: trait - id: SynthLubeProducer - category: Lewd - slots: 0 - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - StationAi - - Borg - - MedicalBorg - - !type:CharacterTraitRequirement - inverted: true - traits: - - SquirtProducer - functions: - - !type:TraitAddReagentProduction # Den new reagent production system - reagentProductionTypes: - - SynthLubeProduction - -- type: trait - id: HoneyProducer - category: TraitsPhysicalBiological - points: -1 # Point cost added to balance with removal of species restriction - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - StationAi - - Borg - - MedicalBorg - functions: - - !type:TraitAddReagentProduction - reagentProductionTypes: - - HoneyProduction - diff --git a/Resources/Prototypes/_DEN/VASH/Entities/Objects/sexlube.yml b/Resources/Prototypes/_DEN/VASH/Entities/Objects/sexlube.yml deleted file mode 100644 index 141ee1e16e..0000000000 --- a/Resources/Prototypes/_DEN/VASH/Entities/Objects/sexlube.yml +++ /dev/null @@ -1,38 +0,0 @@ -# SPDX-FileCopyrightText: 2025 Eightballll -# SPDX-FileCopyrightText: 2025 KekaniCreates -# SPDX-FileCopyrightText: 2025 portfiend -# SPDX-FileCopyrightText: 2025 sleepyyapril -# -# SPDX-License-Identifier: MIT AND AGPL-3.0-or-later - -- type: entity # Pretty much a copy of the Water Bottle, shifted all sex-lube like. Copied from Entities/Objects/Consumable/Drinks/drinks_bottles.yml - parent: [BaseObjectVerbsLewd, DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseInventory] - id: SexLube - name: sexual lubricant - description: A bottle of synthetic lubricant to help with sexual activity. #Too straight to the point, although I'm not sure what else you use lube for than sex lmao -KC - components: - - type: Item - size: Small - - type: SolutionContainerManager - solutions: - drink: - maxVol: 20 #it probably doesn't need to be that big. If you want more, go ask the Chemist or get a Toybox.-KC - reagents: - - ReagentId: SyntheticLubricant # DEN - Quantity: 20 - - type: Sprite - sprite: _DEN/VASH/Objects/bottlelube.rsi - layers: - - state: icon - map: ["enum.OpenableVisuals.Layer"] - - state: icon-1 - map: ["enum.SolutionContainerLayers.Fill"] - visible: false - - type: Appearance - - type: SolutionContainerVisuals - maxFillLevels: 5 - fillBaseName: icon- - inHandsMaxFillLevels: 2 - inHandsFillBaseName: -fill- - - type: Openable - closeable: true #this ain't a packet, you should be able to reseal it. diff --git a/Resources/Prototypes/_Floof/Traits/lewd.yml b/Resources/Prototypes/_Floof/Traits/lewd.yml deleted file mode 100644 index 51380aec15..0000000000 --- a/Resources/Prototypes/_Floof/Traits/lewd.yml +++ /dev/null @@ -1,98 +0,0 @@ -# SPDX-FileCopyrightText: 2024 Pierson Arnold -# SPDX-FileCopyrightText: 2025 Jakumba -# SPDX-FileCopyrightText: 2025 Rosycup -# SPDX-FileCopyrightText: 2025 Tabitha -# SPDX-FileCopyrightText: 2025 portfiend -# SPDX-FileCopyrightText: 2025 sleepyyapril -# -# SPDX-License-Identifier: AGPL-3.0-or-later AND MIT - -- type: trait - id: CumProducer - category: Lewd - slots: 0 - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - StationAi - - Borg - - MedicalBorg - - !type:CharacterTraitRequirement # DEN - inverted: true - traits: - - SynthCumProducer - functions: - - !type:TraitAddReagentProduction # DEN - reagentProductionTypes: - - CumProduction - -# components: -# - type: CumProducer -# solutionname: "penis" -# - type: SolutionContainerManager -# solutions: -# penis: -# maxVol: 25 -# reagents: -# - ReagentId: Cum -# Quantity: 25 - -- type: trait - id: MilkProducer - category: Lewd - slots: 0 - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - StationAi - - Borg - - MedicalBorg - functions: - - !type:TraitAddReagentProduction # DEN - reagentProductionTypes: - - BreastMilkProduction - - -# components: -# - type: MilkProducer -# solutionname: "breasts" -# - type: SolutionContainerManager -# solutions: -# breasts: -# maxVol: 50 -# reagents: -# - ReagentId: Milk -# Quantity: 50 - -- type: trait - id: SquirtProducer - category: Lewd - slots: 0 - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - StationAi - - Borg - - MedicalBorg - - !type:CharacterTraitRequirement - inverted: true - traits: - - SynthLubeProducer - functions: - - !type:TraitAddReagentProduction # DEN - reagentProductionTypes: - - SquirtProduction - -# components: -# - type: SquirtProducer -# solutionname: "vagina" -# - type: SolutionContainerManager -# solutions: -# vagina: -# maxVol: 25 -# reagents: -# - ReagentId: NaturalLubricant -# Quantity: 25 diff --git a/Resources/ServerInfo/Guidebook/_DEN/ChemicalTabs/Lewd.xml b/Resources/ServerInfo/Guidebook/_DEN/ChemicalTabs/Lewd.xml new file mode 100644 index 0000000000..aeaaf2f135 --- /dev/null +++ b/Resources/ServerInfo/Guidebook/_DEN/ChemicalTabs/Lewd.xml @@ -0,0 +1,5 @@ + +# Lewd +The reagents listed in this category includes bodily fluids and libido enhancing stimulants. + + diff --git a/Resources/Textures/_DEN/Interface/VerbIcons/ATTRIBUTION.txt b/Resources/Textures/_DEN/Interface/VerbIcons/ATTRIBUTION.txt new file mode 100644 index 0000000000..8d0a923ba2 --- /dev/null +++ b/Resources/Textures/_DEN/Interface/VerbIcons/ATTRIBUTION.txt @@ -0,0 +1,3 @@ +All icons are public domain. + +lewd.svg by portfiend (GitHub) diff --git a/Resources/Textures/_DEN/Interface/VerbIcons/lewd.svg b/Resources/Textures/_DEN/Interface/VerbIcons/lewd.svg new file mode 100644 index 0000000000..1baa326034 --- /dev/null +++ b/Resources/Textures/_DEN/Interface/VerbIcons/lewd.svg @@ -0,0 +1,65 @@ + + + +18+ diff --git a/Resources/Textures/_DEN/Interface/VerbIcons/lewd.svg.192dpi.png b/Resources/Textures/_DEN/Interface/VerbIcons/lewd.svg.192dpi.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1ab44a29e8410a4774d8fd18894812b32b15a8 GIT binary patch literal 12517 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�|QS~j=R3sR1=|9MsjH#NOAc#a*GL@DQUyH~9F92|2{ zgeOUBfTg2W!2!vHyOFos2WTh)%y9>jpWTatftj9S4&G;RaQ%_ci@$~^L3TY?`6-8u z8l?*G49355TBE;DmBO?#BS>Xc6nRR;=Npr+aA~=->3{58-vgmU7hR$0A0s-aT^$J3 z0F#)>8Q9w}N&?69;WXzVz3M~lN~SccK}%m}DncYnA_;JA(~KXap4t==~qAe88Vr@rw8S@AB7tQ7&!LeQPe` zt3JB(>+iMhqG1(9MV;>{92fuBnHl=AFeN87daipYj`?|$bg4z-qEvbA`>rVaN^TK` zwcfh?P-)IaSWJqm{YcaX!>#GAsdF*V1KNv(7AhTpD@pIGvYe<6}0lV^N&s=)`M>1g4mxShRWthWya&1O9E6Oub?Us4?9K$8~zp<5lKZvUVgxJ}zt)8R0au{ii~ z!IOl-lf-_F+T9EwXv>i27$+B(Sp4+M5E)a_)-Y~ub?`M^kH6*B~_lB@J zONiHzr466%h}J6SrKE6i*xEm&*0_b>$HthCG8}dJQ1Ax=gP5zx1zTaJbEiknU>wQjbOBa+IAOq&Y<&)(o zYCL*QzfhLS5DK}b%kjx%_`tXz0WN#}vq+m{6hFnU()~SF>Y<5K# zVNG4I1??XOtty6*1f%0cub1RMifkoUQ>6hxNZ3ayzO9U>*X$=B(z^t$tVB( z%1xKR|GxFlGAFaw7Jvr zw^HKb{H3jCj<=N=A5~WQ=-dfluYEfb5nZmSn{XNKh^y`yAtWu$gUH;)D%!_eC2M)-4 zRNoGE8sTezGCVB(YF|R!gV3yP5(A-L&_9waL>!GW!=-1Gi8Lw^S`UUlAx`y9iqze} z(!W6JLb3-GF>_Rv@|YiqpiFpc(kKdr__v$0HZ|;o6MjT@Pe}l?>>ma`A^T$+Z`IO~bYNfJ8X4j+S6 zw4ckMxwo_Mnk4hKmQvBW@;^lY9+1iTfh0o#bX>d@skfcH7cdCLW;%mniAB@u-bU?L3aS+?O>V{;@y(_G>;`d5s$z! zstKxLrU^3vKO2nLqohx=%a4|@G|^W5I1=|?}$Ghg#E(taBcec4vEB% znU^1^k;5{(Jk*I?eJC*65UVAabm-a0lgwc$~4} zP;?-+h5V9(tGs{4b6AY6=+fA2v`)aYcl%#=R!=!|CIV#-ueDr3FjRPf>)9JYWSN^v z3`VtJ@~a2QxQBd)C29k`^OSV)@FJw-ddbqw+f|_wz)Q344_esc%4GLwM`2vGfZ)qZ z&7et0Mlihb9_G8Q!7{dY;~0t?Tj*<+gQQV zvmk4W;TWbs#fW?1x+F+(yG2Tg2kQ3D;-eD4B4y8C|NHfScKE*y0*;~0wfaD^(a2Z$ QUlf3askKSjQJ1U#56~=fx&QzG literal 0 HcmV?d00001 diff --git a/Resources/Textures/_DEN/Interface/VerbIcons/lewd.svg.192dpi.png.yml b/Resources/Textures/_DEN/Interface/VerbIcons/lewd.svg.192dpi.png.yml new file mode 100644 index 0000000000..5c43e23305 --- /dev/null +++ b/Resources/Textures/_DEN/Interface/VerbIcons/lewd.svg.192dpi.png.yml @@ -0,0 +1,2 @@ +sample: + filter: true From b33cf61127b0e9fd572f2e98613529f831b3c459 Mon Sep 17 00:00:00 2001 From: honeyed-lemons Date: Thu, 5 Mar 2026 15:21:19 -0500 Subject: [PATCH 4/6] fix prediction --- .../ReagentProduction/Components/ReagentProducerComponent.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Content.Shared/_DEN/ReagentProduction/Components/ReagentProducerComponent.cs b/Content.Shared/_DEN/ReagentProduction/Components/ReagentProducerComponent.cs index 36effc22b0..cbff5b03b6 100644 --- a/Content.Shared/_DEN/ReagentProduction/Components/ReagentProducerComponent.cs +++ b/Content.Shared/_DEN/ReagentProduction/Components/ReagentProducerComponent.cs @@ -1,13 +1,14 @@ using Content.Shared._DEN.ReagentProduction.Prototypes; +using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Shared._DEN.ReagentProduction.Components; -[RegisterComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class ReagentProducerComponent : Component { - [DataField] + [DataField, AutoNetworkedField] public List> ProductionTypes = []; /// From b7c80686bb0ac45ec2a1b94114ff6a7ac7ba5fbf Mon Sep 17 00:00:00 2001 From: honeyed-lemons Date: Thu, 5 Mar 2026 21:27:23 -0500 Subject: [PATCH 5/6] further fix prediction --- .../EntitySystems/ReagentProductionSystem.cs | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/Content.Shared/_DEN/ReagentProduction/EntitySystems/ReagentProductionSystem.cs b/Content.Shared/_DEN/ReagentProduction/EntitySystems/ReagentProductionSystem.cs index ed323eb95c..68e1ecb667 100644 --- a/Content.Shared/_DEN/ReagentProduction/EntitySystems/ReagentProductionSystem.cs +++ b/Content.Shared/_DEN/ReagentProduction/EntitySystems/ReagentProductionSystem.cs @@ -82,15 +82,13 @@ public override void Update(float frameTime) private void AddVerbs(Entity container, ref GetVerbsEvent args) { + var user = args.User; + if (!args.Using.HasValue || !args.CanInteract || !args.CanAccess) return; - var user = args.User; - if (!TryComp(user, out var producerComp)) - { return; - } // Add a verb for every production type the producer has foreach (var productionTypeId in producerComp.ProductionTypes) @@ -105,6 +103,7 @@ private void AddVerbs(Entity container, ref GetVerb Act = () => StartFillDoAfter((user, producerComp), container, productionTypeId), Text = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(reagent.LocalizedName), Priority = -1, + CloseMenu = false, }; args.Verbs.Add(verb); } @@ -119,16 +118,16 @@ ProtoId productionTypeId var productionType = _protoManager.Index(productionTypeId); _doAfter.TryStartDoAfter( - new(EntityManager, user, productionType.DoAfterLength, new ReagentProductionFillEvent(productionTypeId), user, target: target) + new DoAfterArgs(EntityManager, user, productionType.DoAfterLength, new ReagentProductionFillEvent(productionTypeId), user, target: target) { BreakOnMove = true, - BreakOnDropItem = true + BreakOnDropItem = true, }); } private void FinishFillDoAfter(Entity ent, ref ReagentProductionFillEvent args) { - if (!_protoManager.TryIndex(args.ProductionType, out var productionType) || args.Target == null || args.Cancelled) + if (!_protoManager.TryIndex(args.ProductionType, out var productionType) || args.Target == null || args.Cancelled || args.Handled) return; if (!TryComp(args.Target.Value, out var refillableSolution)) @@ -140,10 +139,10 @@ private void FinishFillDoAfter(Entity ent, ref Reagent var targetSolution = targetSolutionComp.Value.Comp.Solution; - // If theres no cum to cum you cant cum okay? + // If there's no cum to cum you cant cum okay? if (userSolutionComp.Value.Comp.Solution.Volume <= 0) { - _popup.PopupEntity(Loc.GetString(productionType.DryPopup),ent,ent); + _popup.PopupPredicted(Loc.GetString(productionType.DryPopup),args.Args.User,args.Args.User); return; } @@ -159,16 +158,18 @@ private void FinishFillDoAfter(Entity ent, ref Reagent FixedPoint2.Clamp(targetAvailableVolume, FixedPoint2.Zero, productionType.MaximumLoad); var split = _solutionContainer.SplitSolution(userSolutionComp.Value, amountToAdd); - var quantity = _solutionContainer.AddSolution(targetSolutionComp.Value, split); - _popup.PopupEntity( + + _popup.PopupPredicted( Loc.GetString( productionType.SuccessPopup, ("amount", quantity), ("target", Identity.Entity(args.Target.Value, EntityManager))), - args.Target.Value, + args.Args.User, args.Args.User, PopupType.Medium); + + args.Handled = true; } public void AddProductionType(EntityUid entity, ReagentProductionTypePrototype prototypeType) From 8a4fdee1c0e8930545b212e5de08a058457bb699 Mon Sep 17 00:00:00 2001 From: honeyed-lemons Date: Thu, 5 Mar 2026 21:34:01 -0500 Subject: [PATCH 6/6] kill honey --- .../Prototypes/_DEN/EntityTraits/quirks.yml | 18 ++++++++-------- .../ReagentProduction/production_types.yml | 21 ++++++++++--------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/Resources/Prototypes/_DEN/EntityTraits/quirks.yml b/Resources/Prototypes/_DEN/EntityTraits/quirks.yml index b8ebd8dda7..ef69cafb97 100644 --- a/Resources/Prototypes/_DEN/EntityTraits/quirks.yml +++ b/Resources/Prototypes/_DEN/EntityTraits/quirks.yml @@ -43,12 +43,12 @@ enableChargeCorruption: false damageAtMaxCorruption: 100 -- type: entityTrait - id: HoneyProducer - name: trait-honey-producer-name - description: trait-honey-producer-desc - category: Quirks - functions: - - !type:AddReagentProductionTrait - productionTypes: - - HoneyProduction +#- type: entityTrait +# id: HoneyProducer +# name: trait-honey-producer-name +# description: trait-honey-producer-desc +# category: Quirks +# functions: +# - !type:AddReagentProductionTrait +# productionTypes: +# - HoneyProduction diff --git a/Resources/Prototypes/_DEN/ReagentProduction/production_types.yml b/Resources/Prototypes/_DEN/ReagentProduction/production_types.yml index 23c26f183c..383781336d 100644 --- a/Resources/Prototypes/_DEN/ReagentProduction/production_types.yml +++ b/Resources/Prototypes/_DEN/ReagentProduction/production_types.yml @@ -29,16 +29,17 @@ dryPopup: squirt-verb-dry successPopup: squirt-verb-success -- type: reagentProductionType - id: HoneyProduction - reagent: Honey - solutionName: honeyStomach - maximumCapacity: 50 - maximumLoad: 5 - fillTime: 1 - unitsPerProduction: 5 - dryPopup: honey-verb-dry - successPopup: honey-verb-success +# Apparently we don't have honey yet??? fucking bunk. +#- type: reagentProductionType +# id: HoneyProduction +# reagent: Honey +# solutionName: honeyStomach +# maximumCapacity: 50 +# maximumLoad: 5 +# fillTime: 1 +# unitsPerProduction: 5 +# dryPopup: honey-verb-dry +# successPopup: honey-verb-success - type: reagentProductionType id: SynthCumProduction