diff --git a/Content.Server/FloofStation/Traits/Components/CumProducerComponent.cs b/Content.Server/FloofStation/Traits/Components/CumProducerComponent.cs new file mode 100644 index 00000000000..5ae63f3285b --- /dev/null +++ b/Content.Server/FloofStation/Traits/Components/CumProducerComponent.cs @@ -0,0 +1,40 @@ +using Content.Shared.FixedPoint; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.FloofStation.Traits; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; +using Robust.Shared.GameStates; + +namespace Content.Server.FloofStation.Traits; + +[RegisterComponent, Access(typeof(LewdTraitSystem))] +public sealed partial class CumProducerComponent : Component +{ + [DataField("solutionname")] + public string SolutionName = "penis"; + + [DataField] + public ProtoId ReagentId = "Cum"; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField("maxVol")] + public FixedPoint2 MaxVolume = FixedPoint2.New(25); + + public Entity? Solution = null; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField("reVol")] + public FixedPoint2 QuantityPerUpdate = 5; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField("reHunger")] + public float HungerUsage = 10f; + + [DataField] + public TimeSpan GrowthDelay = TimeSpan.FromSeconds(10); + + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan NextGrowth = TimeSpan.FromSeconds(0); +} diff --git a/Content.Server/FloofStation/Traits/Components/MilkProducerComponent.cs b/Content.Server/FloofStation/Traits/Components/MilkProducerComponent.cs new file mode 100644 index 00000000000..6595deb52ea --- /dev/null +++ b/Content.Server/FloofStation/Traits/Components/MilkProducerComponent.cs @@ -0,0 +1,40 @@ +using Content.Shared.FixedPoint; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.FloofStation.Traits; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; +using Robust.Shared.GameStates; + +namespace Content.Server.FloofStation.Traits; + +[RegisterComponent, Access(typeof(LewdTraitSystem))] +public sealed partial class MilkProducerComponent : Component +{ + [DataField("solutionname")] + public string SolutionName = "breasts"; + + [DataField] + public ProtoId ReagentId = "Milk"; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField("maxVol")] + public FixedPoint2 MaxVolume = FixedPoint2.New(50); + + public Entity? Solution = null; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField("reVol")] + public FixedPoint2 QuantityPerUpdate = 5; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField("reHunger")] + public float HungerUsage = 10f; + + [DataField] + public TimeSpan GrowthDelay = TimeSpan.FromSeconds(10); + + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan NextGrowth = TimeSpan.FromSeconds(0); +} diff --git a/Content.Server/FloofStation/Traits/LewdTraitSystem.cs b/Content.Server/FloofStation/Traits/LewdTraitSystem.cs new file mode 100644 index 00000000000..8787b19a8b8 --- /dev/null +++ b/Content.Server/FloofStation/Traits/LewdTraitSystem.cs @@ -0,0 +1,411 @@ +using Content.Server.Chemistry.Containers.EntitySystems; +using Content.Shared.Chemistry.EntitySystems; +using Content.Server.Popups; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Components.SolutionManager; +using Content.Shared.DoAfter; +using Content.Shared.IdentityManagement; +using Content.Shared.Mobs.Systems; +using Content.Shared.Nutrition.Components; +using Content.Shared.Nutrition.EntitySystems; +using Content.Shared.Popups; +using Content.Shared.Verbs; +using Content.Shared.FloofStation.Traits.Events; +using Robust.Shared.Timing; +using JetBrains.Annotations; + +namespace Content.Server.FloofStation.Traits; + +[UsedImplicitly] +public sealed class LewdTraitSystem : EntitySystem +{ + [Dependency] private readonly HungerSystem _hunger = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!; + + public override void Initialize() + { + base.Initialize(); + + //Initializers + SubscribeLocalEvent(OnComponentInitCum); + SubscribeLocalEvent(OnComponentInitMilk); + //SubscribeLocalEvent(OnComponentInitSquirt); //Unused-Trait is WIP + + //Verbs + SubscribeLocalEvent>(AddCumVerb); + SubscribeLocalEvent>(AddCumInsideVerb); + SubscribeLocalEvent>(AddCumInsideInjectableVerb); + SubscribeLocalEvent>(AddMilkVerb); + //SubscribeLocalEvent>(AddSquirtVerb); //Unused-Trait is WIP + + //Events + SubscribeLocalEvent(OnDoAfterCum); + SubscribeLocalEvent(OnDoAfterMilk); + //SubscribeLocalEvent(OnDoAfterSquirt); //Unused-Trait is WIP + } + + #region event handling + private void OnComponentInitCum(Entity entity, ref ComponentStartup args) + { + if (!_solutionContainer.EnsureSolution(entity.Owner, + entity.Comp.SolutionName, + out var solutionCum)) + return; + + solutionCum.MaxVolume = entity.Comp.MaxVolume; + + solutionCum.AddReagent(entity.Comp.ReagentId, entity.Comp.MaxVolume - solutionCum.Volume); + } + + private void OnComponentInitMilk(Entity entity, ref ComponentStartup args) + { + if (!_solutionContainer.EnsureSolution(entity.Owner, + entity.Comp.SolutionName, + out var solutionMilk)) + return; + + solutionMilk.MaxVolume = entity.Comp.MaxVolume; + + solutionMilk.AddReagent(entity.Comp.ReagentId, entity.Comp.MaxVolume - solutionMilk.Volume); + } + + //private void OnComponentInitSquirt(Entity entity, ref ComponentStartup args) //Unused-Trait is WIP + //{ + // var solutionSquirt = _solutionContainer.EnsureSolution(entity.Owner, entity.Comp.SolutionName); + // solutionSquirt.MaxVolume = entity.Comp.MaxVolume; + + // solutionSquirt.AddReagent(entity.Comp.ReagentId, entity.Comp.MaxVolume - solutionSquirt.Volume); + //} + + public void AddCumVerb(Entity entity, ref GetVerbsEvent args) + { + if (args.Using == null || + !args.CanInteract || + args.User != args.Target || + !EntityManager.HasComponent(args.Using.Value)) //see if removing this part lets you milk on the ground. + return; + + _solutionContainer.EnsureSolution(entity.Owner, entity.Comp.SolutionName, out _); + + var user = args.User; + var used = args.Using.Value; + + InnateVerb verbCum = new() + { + Act = () => AttemptCum(entity, user, used), + Text = Loc.GetString($"cum-verb-get-text"), + Priority = 1 + }; + args.Verbs.Add(verbCum); + } + + public void AddCumInsideVerb(EntityUid uid, RefillableSolutionComponent component, GetVerbsEvent args) + { + if (!args.CanInteract || !TryComp(args.User, out var cumProducer)) + return; + + _solutionContainer.EnsureSolution(args.User, cumProducer.SolutionName, out _); + + var user = args.User; + var target = uid; + + AlternativeVerb verbCumInside = new() + { + Act = () => AttemptCum((args.User, cumProducer), user, target), + Text = Loc.GetString("cum-verb-inside-text"), + Priority = 2 + }; + args.Verbs.Add(verbCumInside); + } + + // Handle cumming inside entities with InjectableSolutionComponent (e.g., players) + public void AddCumInsideInjectableVerb(EntityUid uid, InjectableSolutionComponent component, GetVerbsEvent args) + { + if (!args.CanInteract || !TryComp(args.User, out var cumProducer)) + return; + + _solutionContainer.EnsureSolution(args.User, cumProducer.SolutionName, out _); + + var user = args.User; + var target = uid; + + AlternativeVerb verbCumInside = new() + { + Act = () => AttemptCum((args.User, cumProducer), user, target), + Text = Loc.GetString("cum-verb-inside-text"), + Priority = 2 + }; + args.Verbs.Add(verbCumInside); + } + + public void AddMilkVerb(Entity entity, ref GetVerbsEvent args) + { + if (args.Using == null || + !args.CanInteract || + args.User != args.Target || + !EntityManager.HasComponent(args.Using.Value)) //see if removing this part lets you milk on the ground. + return; + + _solutionContainer.EnsureSolution(entity.Owner, entity.Comp.SolutionName, out _); + + var user = args.User; + var used = args.Using.Value; + + InnateVerb verbMilk = new() + { + Act = () => AttemptMilk(entity, user, used), + Text = Loc.GetString($"milk-verb-get-text"), + Priority = 1 + }; + args.Verbs.Add(verbMilk); + } + + //public void AddSquirtVerb(Entity entity, ref GetVerbsEvent args) //Unused-Trait is WIP + //{ + // if (args.Using == null || + // !args.CanInteract || + // !EntityManager.HasComponent(args.Using.Value)) //see if removing this part lets you milk on the ground. + // return; + + // _solutionContainer.EnsureSolution(entity.Owner, entity.Comp.SolutionName); + + // var user = args.User; + // var used = args.Using.Value; + + // InnateVerb verbSquirt = new() + // { + // Act = () => AttemptSquirt(entity, user, used), + // Text = Loc.GetString($"squirt-verb-get-text"), + // Priority = 1 + // }; + // args.Verbs.Add(verbSquirt); + //} + + private void OnDoAfterCum(Entity entity, ref CummingDoAfterEvent args) + { + if (args.Cancelled || args.Handled || args.Args.Used == null) + return; + + if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution)) + return; + + // Try refillable solution first (containers like beakers) + if (_solutionContainer.TryGetRefillableSolution(args.Args.Used.Value, out var targetSoln, out var targetSolution)) + { + args.Handled = true; + var quantity = solution.Volume; + if (quantity == 0) + { + _popupSystem.PopupEntity(Loc.GetString("cum-verb-dry"), entity.Owner, args.Args.User); + return; + } + + if (quantity > targetSolution.AvailableVolume) + quantity = targetSolution.AvailableVolume; + + var split = _solutionContainer.SplitSolution(entity.Comp.Solution.Value, quantity); + _solutionContainer.TryAddSolution(targetSoln.Value, split); + _popupSystem.PopupEntity(Loc.GetString("cum-verb-success", ("amount", quantity), ("target", Identity.Entity(args.Args.Used.Value, EntityManager))), entity.Owner, args.Args.User, PopupType.Medium); + return; + } + + // Try injectable solution (entities like players with stomachs) + if (_solutionContainer.TryGetInjectableSolution(args.Args.Used.Value, out var injectSoln, out var injectSolution)) + { + args.Handled = true; + var quantity = solution.Volume; + if (quantity == 0) + { + _popupSystem.PopupEntity(Loc.GetString("cum-verb-dry"), entity.Owner, args.Args.User); + return; + } + + if (quantity > injectSolution.AvailableVolume) + quantity = injectSolution.AvailableVolume; + + var split = _solutionContainer.SplitSolution(entity.Comp.Solution.Value, quantity); + _solutionContainer.TryAddSolution(injectSoln.Value, split); + _popupSystem.PopupEntity(Loc.GetString("cum-verb-success", ("amount", quantity), ("target", Identity.Entity(args.Args.Used.Value, EntityManager))), entity.Owner, args.Args.User, PopupType.Medium); + return; + } + } + + private void OnDoAfterMilk(Entity entity, ref MilkingDoAfterEvent args) + { + if (args.Cancelled || args.Handled || args.Args.Used == null) + return; + + if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution)) + return; + + if (!_solutionContainer.TryGetRefillableSolution(args.Args.Used.Value, out var targetSoln, out var targetSolution)) + return; + + args.Handled = true; + var quantity = solution.Volume; + if (quantity == 0) + { + _popupSystem.PopupEntity(Loc.GetString("milk-verb-dry"), entity.Owner, args.Args.User); + return; + } + + if (quantity > targetSolution.AvailableVolume) + quantity = targetSolution.AvailableVolume; + + var split = _solutionContainer.SplitSolution(entity.Comp.Solution.Value, quantity); + _solutionContainer.TryAddSolution(targetSoln.Value, split); + _popupSystem.PopupEntity(Loc.GetString("milk-verb-success", ("amount", quantity), ("target", Identity.Entity(args.Args.Used.Value, EntityManager))), entity.Owner, args.Args.User, PopupType.Medium); + } + + //private void OnDoAfterSquirt(Entity entity, ref SquirtingDoAfterEvent args) //Unused-Trait is WIP + //{ + // if (args.Cancelled || args.Handled || args.Args.Used == null) + // return; + + // if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution)) + // return; + + // if (!_solutionContainer.TryGetRefillableSolution(args.Args.Used.Value, out var targetSoln, out var targetSolution)) + // return; + + // args.Handled = true; + // var quantity = solution.Volume; + // if (quantity == 0) + // { + // _popupSystem.PopupEntity(Loc.GetString("squirt-verb-dry"), entity.Owner, args.Args.User); + // return; + // } + + // if (quantity > targetSolution.AvailableVolume) + // quantity = targetSolution.AvailableVolume; + + // var split = _solutionContainer.SplitSolution(entity.Comp.Solution.Value, quantity); + // _solutionContainer.TryAddSolution(targetSoln.Value, split); + // _popupSystem.PopupEntity(Loc.GetString("squirt-verb-success", ("amount", quantity), ("target", Identity.Entity(args.Args.Used.Value, EntityManager))), entity.Owner, args.Args.User, PopupType.Medium); + //} + #endregion + + #region utilities + private void AttemptCum(Entity lewd, EntityUid userUid, EntityUid containerUid) + { + if (!HasComp(userUid)) + return; + + var doargs = new DoAfterArgs(EntityManager, userUid, 5, new CummingDoAfterEvent(), lewd, lewd, used: containerUid) + { + BreakOnMove = true, + BreakOnDamage = true, + MovementThreshold = 1.0f, + }; + + _doAfterSystem.TryStartDoAfter(doargs); + } + + private void AttemptMilk(Entity lewd, EntityUid userUid, EntityUid containerUid) + { + if (!HasComp(userUid)) + return; + + var doargs = new DoAfterArgs(EntityManager, userUid, 5, new MilkingDoAfterEvent(), lewd, lewd, used: containerUid) + { + BreakOnMove = true, + BreakOnDamage = true, + MovementThreshold = 1.0f, + }; + + _doAfterSystem.TryStartDoAfter(doargs); + } + + //private void AttemptSquirt(Entity lewd, EntityUid userUid, EntityUid containerUid) //Unused-Trait is WIP + //{ + // if (!HasComp(userUid)) + // return; + + // var doargs = new DoAfterArgs(EntityManager, userUid, 5, new SquirtingDoAfterEvent(), lewd, lewd, used: containerUid) + // { + // BreakOnUserMove = true, + // BreakOnDamage = true, + // BreakOnTargetMove = true, + // MovementThreshold = 1.0f, + // }; + + // _doAfterSystem.TryStartDoAfter(doargs); + //} + + public override void Update(float frameTime) + { + base.Update(frameTime); + var queryCum = EntityQueryEnumerator(); //SquirtProducerComponent -unused , + var queryMilk = EntityQueryEnumerator(); + var now = _timing.CurTime; + + while (queryCum.MoveNext(out var uid, out var containerCum)) + { + if (now < containerCum.NextGrowth) + continue; + + containerCum.NextGrowth = now + containerCum.GrowthDelay; + + if (_mobState.IsDead(uid)) + continue; + + if (EntityManager.TryGetComponent(uid, out HungerComponent? hunger)) + { + if (_hunger.GetHungerThreshold(hunger) < HungerThreshold.Okay) + continue; + + _hunger.ModifyHunger(uid, -containerCum.HungerUsage, hunger); + } + + if (!_solutionContainer.ResolveSolution(uid, containerCum.SolutionName, ref containerCum.Solution)) + continue; + + _solutionContainer.TryAddReagent(containerCum.Solution.Value, containerCum.ReagentId, containerCum.QuantityPerUpdate, out _); + } + + while (queryMilk.MoveNext(out var uid, out var containerMilk)) + { + if (now < containerMilk.NextGrowth) + continue; + + containerMilk.NextGrowth = now + containerMilk.GrowthDelay; + + if (_mobState.IsDead(uid)) + continue; + + if (EntityManager.TryGetComponent(uid, out HungerComponent? hunger)) + { + if (_hunger.GetHungerThreshold(hunger) < HungerThreshold.Okay) + continue; + + _hunger.ModifyHunger(uid, -containerMilk.HungerUsage, hunger); + } + + if (!_solutionContainer.ResolveSolution(uid, containerMilk.SolutionName, ref containerMilk.Solution)) + continue; + + _solutionContainer.TryAddReagent(containerMilk.Solution.Value, containerMilk.ReagentId, containerMilk.QuantityPerUpdate, out _); + } + + //if (!(now < containerSquirt.NextGrowth)) //Unused-Trait is WIP + //{ + // containerSquirt.NextGrowth = now + containerSquirt.GrowthDelay; + + // + // if (EntityManager.TryGetComponent(uid, out HungerComponent? hunger)) + // { + // + // if (!(_hunger.GetHungerThreshold(hunger) < HungerThreshold.Okay)) + // _hunger.ModifyHunger(uid, -containerSquirt.HungerUsage, hunger); + // } + + // if (_solutionContainer.ResolveSolution(uid, containerSquirt.SolutionName, ref containerSquirt.Solution)) + // _solutionContainer.TryAddReagent(containerSquirt.Solution.Value, containerSquirt.ReagentId, containerSquirt.QuantityPerUpdate, out _); + //} + } + #endregion +} diff --git a/Resources/Locale/en-US/Blep/consent.ftl b/Resources/Locale/en-US/Blep/consent.ftl index 11cc35e897b..b5f407baad9 100644 --- a/Resources/Locale/en-US/Blep/consent.ftl +++ b/Resources/Locale/en-US/Blep/consent.ftl @@ -20,7 +20,7 @@ consent-GenitalMarkings-name = See Genital Markings consent-GenitalMarkings-desc = Turn this on to allow showing/hiding genital markings in-game. consent-Aphrodisiacs-name = Be affected by aphrodisiacs -consent-Aphrodisiacs-desc = Turn this on to be affected by philterex and libidozenithine. +consent-Aphrodisiacs-desc = Turn this on to be affected by pomelustine, philterex, and libidozenithine. consent-Cum-name = Interact with cum consent-Cum-desc = Turn this on for cum to have any meaningful interaction with you. diff --git a/Resources/Locale/en-US/floofstation/cum/cum-verb.ftl b/Resources/Locale/en-US/floofstation/cum/cum-verb.ftl new file mode 100644 index 00000000000..4fabff00df4 --- /dev/null +++ b/Resources/Locale/en-US/floofstation/cum/cum-verb.ftl @@ -0,0 +1,6 @@ +cum-verb-dry = Your Balls are empty. +cum-verb-success = You fill {THE($target)} with {$amount}u of cum from your cock. +cum-verb-success-ground = You pump out some cum all over the ground! + +cum-verb-get-text = Cum +cum-verb-inside-text = Cum inside diff --git a/Resources/Locale/en-US/floofstation/milk/milk-verb.ftl b/Resources/Locale/en-US/floofstation/milk/milk-verb.ftl new file mode 100644 index 00000000000..e26c0dec0aa --- /dev/null +++ b/Resources/Locale/en-US/floofstation/milk/milk-verb.ftl @@ -0,0 +1,5 @@ +milk-verb-dry = Your breasts are empty. +milk-verb-success = You fill {THE($target)} with {$amount}u of milk from your leaky breasts. +milk-verb-success-ground = You squirt out some milk all over the ground! + +milk-verb-get-text = Milk diff --git a/Resources/Locale/en-US/floofstation/traits/traits.ftl b/Resources/Locale/en-US/floofstation/traits/traits.ftl new file mode 100644 index 00000000000..30c2cfbb548 --- /dev/null +++ b/Resources/Locale/en-US/floofstation/traits/traits.ftl @@ -0,0 +1,29 @@ +trait-cum-producer-name = Cum Producer +trait-cum-producer-desc = Your body produces cum that can be extracted into containers. (25u) + +trait-milk-producer-name = Milk Producer +trait-milk-producer-desc = Your body produces milk that can be extracted into containers. (50u) + +trait-cum-cascade-name = Cum Cascade +trait-cum-cascade-desc = Your body produces a truly huge quantity of cum. (100u) + +trait-cum-flood-name = Cum Flood +trait-cum-flood-desc = Your body produces an frankly worrying quantity of cum. (250u) + +trait-bluespace-balls-name = Bluespace Balls +trait-bluespace-balls-desc = Through augmentation, genetic enhancement, or bluespace implants, your body produces an absolutely massive flood of cum. (1000u) + +trait-barrel-balls-name = Bluespace Barrel Balls +trait-barrel-balls-desc = Somehow... someway... you make so much cum that you can fill a bluespace barrel in one shot. Pocket dimensions fear you. (15000u) + +trait-milk-cascade-name = Milk Cascade +trait-milk-cascade-desc = Your body produces a truly huge quantity of milk. (100u) + +trait-milk-flood-name = Milk Flood +trait-milk-flood-desc = Your body produces an frankly worrying quantity of milk. (250u) + +trait-bluespace-breasts-name = Bluespace Breasts +trait-bluespace-breasts-desc = Through augmentation, genetic enhancement, or bluespace implants, your body produces an absolutely massive flood of milk. (1000u) + +trait-barrel-breasts-name = Bluespace Barrel Breasts +trait-barrel-breasts-desc = You are capable of such vast quantities of milk that you can fill a bluespace barrel in one go. Go outshine the cheese caves.(15000u) diff --git a/Resources/Locale/en-US/reagents/floofstation/aphrodisiacs/meta/medicine.ftl b/Resources/Locale/en-US/reagents/floofstation/aphrodisiacs/meta/medicine.ftl index 965936bfd57..20cd4df96ff 100644 --- a/Resources/Locale/en-US/reagents/floofstation/aphrodisiacs/meta/medicine.ftl +++ b/Resources/Locale/en-US/reagents/floofstation/aphrodisiacs/meta/medicine.ftl @@ -1,5 +1,5 @@ -reagent-name-PomegranteJuice = Pomegrante Juice -reagent-desc-PomegranteJuice = A supposed aphrodisiac, present naturally within certain fruits such as pomegranate, usually in too small of a dose to do too much harm. +reagent-name-pomelustine = pomelustine +reagent-desc-pomelustine = A mild aphrodisiac, present naturally within certain fruits such as pomegranate, usually in too small of a dose to do too much harm. reagent-name-philterex = philterex reagent-desc-philterex = A strong aphrodisiac, not yet regulated by Space Law. It is known for its high use in particular sectors. diff --git a/Resources/Locale/en-US/reagents/floofstation/drinks.ftl b/Resources/Locale/en-US/reagents/floofstation/drinks.ftl new file mode 100644 index 00000000000..0f77ef58b6b --- /dev/null +++ b/Resources/Locale/en-US/reagents/floofstation/drinks.ftl @@ -0,0 +1,2 @@ +reagent-name-NNN = Nikko's Naughty Nectar +reagent-desc-NNN = A sticky, musky white liquid that tastes of blueberries. diff --git a/Resources/Locale/en-US/reagents/floofstation/natural_sauce.ftl b/Resources/Locale/en-US/reagents/floofstation/natural_sauce.ftl new file mode 100644 index 00000000000..887f9d8ba59 --- /dev/null +++ b/Resources/Locale/en-US/reagents/floofstation/natural_sauce.ftl @@ -0,0 +1,2 @@ +reagent-name-cum = cum +reagent-desc-cum = A sticky cloudy-white liquid. diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index d07531ca077..3d16291d88a 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -65,3 +65,12 @@ trait-spanish-desc = Hola seƱor, donde esta la biblioteca. trait-painnumbness-name = Numb trait-painnumbness-desc = You lack any sense of feeling pain, being unaware of how hurt you may be. + +trait-name-CumProducer = Cock +trait-description-CumProducer = You have a schlong between your legs. + +trait-name-MilkProducer = Boobs +trait-description-MilkProducer = You have a pair of large mammaries. + +trait-name-SquirtProducer = Pussy +trait-description-SquirtProducer = You have a slit between your legs. diff --git a/Resources/Maps/_Flooftier/Shuttles/gondola.yml b/Resources/Maps/_Flooftier/Shuttles/gondola.yml index 3049502c024..da0e9213d27 100644 --- a/Resources/Maps/_Flooftier/Shuttles/gondola.yml +++ b/Resources/Maps/_Flooftier/Shuttles/gondola.yml @@ -1977,14 +1977,13 @@ entities: - type: Transform pos: 0.5,-16.5 parent: 1 -# Phoenix Edit -# - proto: CrateLewdToys -# entities: -# - uid: 513 -# components: -# - type: Transform -# pos: 3.5,-3.5 -# parent: 1 +- proto: CrateLewdToys + entities: + - uid: 513 + components: + - type: Transform + pos: 3.5,-3.5 + parent: 1 - proto: CurtainsBlack entities: - uid: 320 diff --git a/Resources/Maps/_HL/coremasquerade.yml b/Resources/Maps/_HL/coremasquerade.yml index 582a53fbe2b..3232c8272e5 100644 --- a/Resources/Maps/_HL/coremasquerade.yml +++ b/Resources/Maps/_HL/coremasquerade.yml @@ -99788,14 +99788,13 @@ entities: - type: Transform pos: 15.5,28.5 parent: 2 -# Phoenix Edit -# - proto: CrateLewdToys -# entities: -# - uid: 15015 -# components: -# - type: Transform -# pos: -32.5,32.5 -# parent: 2 +- proto: CrateLewdToys + entities: + - uid: 15015 + components: + - type: Transform + pos: -32.5,32.5 + parent: 2 - proto: CrateMachine entities: - uid: 15016 diff --git a/Resources/Maps/core.yml b/Resources/Maps/core.yml index f67c956df08..e42288d0586 100644 --- a/Resources/Maps/core.yml +++ b/Resources/Maps/core.yml @@ -67240,14 +67240,13 @@ entities: - type: Transform pos: 15.5,28.5 parent: 2 -# Phoenix Edit -# - proto: CrateLewdToys -# entities: -# - uid: 11150 -# components: -# - type: Transform -# pos: -32.5,32.5 -# parent: 2 +- proto: CrateLewdToys + entities: + - uid: 11150 + components: + - type: Transform + pos: -32.5,32.5 + parent: 2 - proto: CrateMachine entities: - uid: 1014 diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml b/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml index bc594df6273..fc34b86287a 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml @@ -148,42 +148,42 @@ - id: WeaponSniperMosin # Frontier: WeaponSniperMosin