Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions Content.Client/_Arcane/ErpPanel/ErpPanelWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,9 @@ private bool CheckRequirements(EntityUid user, EntityUid target, PanelInteractio
{
var passed = true;

if (IsErpInteraction(interaction) && !CanUseErp(user, target))
return false;

var transform = _entManager.System<TransformSystem>();
if (!transform.InRange(user, target, interaction.Range))
passed = false;
Expand All @@ -355,4 +358,23 @@ private bool CheckRequirements(EntityUid user, EntityUid target, PanelInteractio

return passed;
}

private bool IsErpInteraction(PanelInteractionPrototype interaction)
{
return interaction.Tags.Contains(ErpPanelConstants.ErpInteractionTag);
}

private bool CanUseErp(EntityUid user, EntityUid target)
{
if (_entManager.TryGetComponent<ErpStatusComponent>(user, out var userStatus) &&
userStatus.Preference == ErpPreference.No)
return false;

if (user != target &&
_entManager.TryGetComponent<ErpStatusComponent>(target, out var targetStatus) &&
targetStatus.Preference == ErpPreference.No)
return false;

return true;
}
}
26 changes: 22 additions & 4 deletions Content.Server/_Arcane/ErpPanel/ErpPanelSystem.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Content.Server.Chat.Systems;
using Content.Server.Chat.Systems;
using Content.Server.Interaction;
using Content.Shared._Arcane.ERP;
using Content.Shared._Arcane.ErpPanel;
Expand Down Expand Up @@ -233,9 +233,6 @@ private bool IsValidUI(EntityUid user, EntityUid target)
if (!HasComp<ArousalComponent>(user) || !HasComp<ArousalComponent>(target))
return false;

if (TryComp<ErpStatusComponent>(target, out var targetStatus) && targetStatus.Preference == ErpPreference.No)
return false;

return true;
}

Expand All @@ -259,12 +256,33 @@ private bool IsValidInteraction(EntityUid user, EntityUid target, PanelInteracti
if (!HasComp<ArousalComponent>(user) || !HasComp<ArousalComponent>(target))
return false;

if (IsErpInteraction(interaction) && !CanUseErp(user, target))
return false;

if (userPanel.Cooldowns.TryGetValue(interaction.ID, out var lastUse) && lastUse + interaction.Cooldown > _ticking.CurTime)
return false;

return true;
}

private bool IsErpInteraction(PanelInteractionPrototype interaction)
{
return interaction.Tags.Contains(ErpPanelConstants.ErpInteractionTag);
}

private bool CanUseErp(EntityUid user, EntityUid target)
{
if (TryComp<ErpStatusComponent>(user, out var userStatus) && userStatus.Preference == ErpPreference.No)
return false;

if (user != target &&
TryComp<ErpStatusComponent>(target, out var targetStatus) &&
targetStatus.Preference == ErpPreference.No)
return false;

return true;
}

private bool CheckRequirements(EntityUid user, EntityUid target, PanelInteractionPrototype interaction)
{
var passed = true;
Expand Down
8 changes: 8 additions & 0 deletions Content.Shared/_Arcane/ErpPanel/ErpPanelPrototypes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@

namespace Content.Shared._Arcane.ErpPanel;

public static class ErpPanelConstants
{
public const string ErpInteractionTag = "RequiresERP";
}

[Prototype]
public sealed partial class PanelInteractionPrototype : IPrototype
{
Expand All @@ -29,6 +34,9 @@ public sealed partial class PanelInteractionPrototype : IPrototype
[DataField]
public List<ResPath> Sounds = new();

[DataField]
public HashSet<string> Tags = new();

[DataField]
public TimeSpan Cooldown = TimeSpan.FromSeconds(3);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using Content.Shared.Inventory;
using Robust.Shared.Serialization;

namespace Content.Shared._Arcane.ErpPanel.Requirements;

[Serializable, NetSerializable]
public sealed partial class EmptyInventorySlotRequirement : ErpRequirement
{
[DataField(required: true)]
public string Slot = string.Empty;

public override bool IsAvailable(EntityUid uid, IEntityManager entityManager)
{
var inventory = entityManager.System<InventorySystem>();

if (!inventory.HasSlot(uid, Slot))
return false;

return !inventory.TryGetSlotEntity(uid, Slot, out _);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Tag;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;

namespace Content.Shared._Arcane.ErpPanel.Requirements;

[Serializable, NetSerializable]
public sealed partial class HeldItemRequirement : ErpRequirement
{
[DataField(required: true)]
public HashSet<ProtoId<TagPrototype>> Tags = new();

public override bool IsAvailable(EntityUid uid, IEntityManager entityManager)
{
var hands = entityManager.System<SharedHandsSystem>();
var tags = entityManager.System<TagSystem>();

foreach (var held in hands.EnumerateHeld(uid))
{
if (tags.HasAnyTag(held, Tags))
return true;
}

return false;
}
}
85 changes: 85 additions & 0 deletions Resources/Prototypes/_Arcane/Interactions/ERP/anus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
- быстро трахает $target в попу.
- нежно трахает анал $target.
icon: _Arcane/Interface/ErpPanel/cock_near_ass.png
tags:
- RequiresERP
targetRequirements:
- !type:EroticOrganRequirement
organ: anus
Expand All @@ -42,6 +44,8 @@
- аккуратно вводит язычок в анус $target.
- игриво водит язычком вокруг ануса $target.
icon: _Arcane/Interface/ErpPanel/anal_lick.png
tags:
- RequiresERP
targetRequirements:
- !type:EroticOrganRequirement
organ: anus
Expand All @@ -62,6 +66,8 @@
- трахает пальцами анус $target.
- двигает пальцами внутри ануса $target.
icon: _Arcane/Interface/ErpPanel/anal_fingering.png
tags:
- RequiresERP
targetRequirements:
- !type:EroticOrganRequirement
organ: anus
Expand All @@ -86,6 +92,8 @@
- страстно долбит анус $target хвостом.
- нежно трахает анус $target, используя свой хвостик.
icon: _Arcane/Interface/ErpPanel/butt_tail_fuck.png
tags:
- RequiresERP
targetRequirements:
- !type:EroticOrganRequirement
organ: anus
Expand All @@ -99,3 +107,80 @@
- Tajaran
- HumanoidXeno
- Rodentia

- type: panelInteraction
id: AnalLick2
category: Anus
name: Глубоко вылизать анус
userArouse: 5
targetArouse: 15
range: 1
sounds:
- /Audio/_Arcane/Interactions/champ_fingering.ogg
messages:
- глубоко проникает языком в анус $target.
- страстно вылизывает анус $target.
- жадно лижет анус $target.
- плотно прижимается языком к анусу $target, проникая глубже.
- ритмично ласкает анус $target языком.
icon: _Arcane/Interface/ErpPanel/anal_lick2.png
tags:
- RequiresERP
targetRequirements:
- !type:EroticOrganRequirement
organ: anus
requireVisible: true

- type: panelInteraction
id: AnalFingering2
category: Anus
name: Двумя пальцами в анус
userArouse: 5
targetArouse: 15
range: 1
sounds:
- /Audio/_Arcane/Interactions/champ_fingering.ogg
messages:
- вводит два пальца в анус $target.
- двигает двумя пальцами внутри ануса $target.
- глубоко проникает двумя пальцами в анус $target.
- ритмично трахает пальцами анус $target.
- медленно вводит и выводит два пальца из ануса $target.
icon: _Arcane/Interface/ErpPanel/anal_fingering2.png
tags:
- RequiresERP
targetRequirements:
- !type:EroticOrganRequirement
organ: anus
requireVisible: true

- type: panelInteraction
id: ToyButt
category: Anus
name: Использовать игрушку в попе
userArouse: 5
targetArouse: 15
range: 1
sounds:
- /Audio/_Arcane/Interactions/asscrap1.ogg
- /Audio/_Arcane/Interactions/asscrap2.ogg
- /Audio/_Arcane/Interactions/asscrap3.ogg
messages:
- вставляет игрушку в анус $target.
- двигает секс-игрушкой в анусе $target.
- ритмично использует игрушку в попе $target.
- аккуратно вводит игрушку в анус $target.
- медленно работает игрушкой в попке $target.
icon: _Arcane/Interface/ErpPanel/toy_butt.png
tags:
- RequiresERP
targetRequirements:
- !type:EroticOrganRequirement
organ: anus
requireVisible: true
userRequirements:
- !type:HeldItemRequirement
tags:
- SexToyAnal
- SexToyDildo
- SexToyVibrator
39 changes: 39 additions & 0 deletions Resources/Prototypes/_Arcane/Interactions/ERP/boobs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
- хлопает $target по сиськам.
- бьёт $target по груди.
icon: _Arcane/Interface/ErpPanel/boobs_slap.png
tags:
- RequiresERP
targetRequirements:
- !type:EroticOrganRequirement
organ: breasts
Expand All @@ -36,6 +38,8 @@
- проводит рукой по бюсту $target.
- игриво гладит грудь $target.
icon: _Arcane/Interface/ErpPanel/boobs_paw.png
tags:
- RequiresERP
targetRequirements:
- !type:EroticOrganRequirement
organ: breasts
Expand All @@ -61,6 +65,8 @@
- трётся пенисом о бюст $target.
- страстно трахает бюст $target!
icon: _Arcane/Interface/ErpPanel/boobs_fuck.png
tags:
- RequiresERP
targetRequirements:
- !type:EroticOrganRequirement
organ: breasts
Expand All @@ -86,6 +92,8 @@
- жмёт руками бюст $target.
- хватает $target за грудь!
icon: _Arcane/Interface/ErpPanel/boobs_squeeze.png
tags:
- RequiresERP
targetRequirements:
- !type:EroticOrganRequirement
organ: breasts
Expand Down Expand Up @@ -113,6 +121,8 @@
- нежно целует грудь $target.
- целует $target в грудь.
icon: _Arcane/Interface/ErpPanel/boobs_many_kisses.png
tags:
- RequiresERP
targetRequirements:
- !type:EroticOrganRequirement
organ: breasts
Expand All @@ -134,6 +144,8 @@
- обвивает грудь $target хвостом.
- гладит грудь $target хвостиком.
icon: _Arcane/Interface/ErpPanel/boobs_tail.png
tags:
- RequiresERP
targetRequirements:
- !type:EroticOrganRequirement
organ: breasts
Expand Down Expand Up @@ -164,6 +176,33 @@
- водит вокруг сосков $target.
- аккуратно сжимает и разжимает грудь $target.
icon: _Arcane/Interface/ErpPanel/boobs_massage.png
tags:
- RequiresERP
targetRequirements:
- !type:EroticOrganRequirement
organ: breasts
requireVisible: true

- type: panelInteraction
id: BoobsSuck
category: Boobs
name: Сосать сосок
userArouse: 5
targetArouse: 10
range: 1
sounds:
- /Audio/_Arcane/Interactions/oral1.ogg
- /Audio/_Arcane/Interactions/oral2.ogg
messages:
- захватывает губами сосок $target.
- нежно сосёт сосок $target.
- посасывает сосок $target.
- обхватывает губами сосок $target и тихо посасывает.
- медленно водит языком вокруг соска $target.
- ласкает сосок $target губами.
icon: _Arcane/Interface/ErpPanel/boobs_suck.png
tags:
- RequiresERP
targetRequirements:
- !type:EroticOrganRequirement
organ: breasts
Expand Down
Loading
Loading