- fix: some message for interactions

This commit is contained in:
2024-02-27 18:22:15 +03:00
parent a31947423c
commit d5b3f707d1
18 changed files with 486 additions and 77 deletions

View File

@@ -7,15 +7,15 @@
<BoxContainer Orientation="Vertical" Margin="5 5 5 5"> <BoxContainer Orientation="Vertical" Margin="5 5 5 5">
<BoxContainer Orientation="Vertical" Margin="5 20 5 20" HorizontalAlignment="Stretch" HorizontalExpand="True"> <BoxContainer Orientation="Vertical" Margin="5 20 5 20" HorizontalAlignment="Stretch" HorizontalExpand="True">
<BoxContainer HorizontalAlignment="Center" HorizontalExpand="True"> <BoxContainer HorizontalAlignment="Center" HorizontalExpand="True">
<BoxContainer Orientation="Vertical" Margin="5 5 5 5"> <BoxContainer Margin="5 5 5 5">
<SpriteView Name="PerformerView" Margin="5 10 5 15" HorizontalAlignment="Center"/>
<RichTextLabel Name="PerformerDesc"/> <RichTextLabel Name="PerformerDesc"/>
<SpriteView Scale="2 2" Name="PerformerView" Margin="5 10 5 15" HorizontalAlignment="Center"/>
</BoxContainer> </BoxContainer>
<controls1:HighDivider Margin="5 5 5 5"/> <controls1:HighDivider Margin="5 5 5 5"/>
<BoxContainer Orientation="Vertical" Margin="5 5 5 5"> <BoxContainer Margin="5 5 5 5">
<SpriteView Name="TargetView" Margin="5 10 5 15" HorizontalAlignment="Center"/> <SpriteView Scale="2 2" Name="TargetView" Margin="5 10 5 15" HorizontalAlignment="Center"/>
<RichTextLabel Name="TargerDesc"/> <RichTextLabel Name="TargerDesc"/>
</BoxContainer> </BoxContainer>
</BoxContainer> </BoxContainer>
@@ -39,7 +39,7 @@
<CheckBox Margin="5 0 5 0" Name="DisCheckbox"/> <CheckBox Margin="5 0 5 0" Name="DisCheckbox"/>
<Label Margin="5 0 5 0" Text="{Loc 'interaction-hide-unvisible'}"/> <Label Margin="5 0 5 0" Text="{Loc 'interaction-hide-unvisible'}"/>
</BoxContainer> </BoxContainer>
<Button Margin="5 5 5 5" Text="Update"/> <Button Margin="5 5 5 5" Text="{Loc 'interaction-update'}" Name="UpdateButton"/>
<ScrollContainer HorizontalExpand="True" VerticalExpand="True"> <ScrollContainer HorizontalExpand="True" VerticalExpand="True">
<BoxContainer Orientation="Vertical" Margin="5 20 5 20" Name="Interactions"> <BoxContainer Orientation="Vertical" Margin="5 20 5 20" Name="Interactions">

View File

@@ -5,6 +5,7 @@ using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML; using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
namespace Content.Client._Amour.InteractionPanel.UI; namespace Content.Client._Amour.InteractionPanel.UI;
@@ -24,6 +25,7 @@ public sealed partial class InteractionPanelWindow : DefaultWindow
IoCManager.InjectDependencies(this); IoCManager.InjectDependencies(this);
DisCheckbox.OnPressed += _ => OnUpdateRequired?.Invoke(); DisCheckbox.OnPressed += _ => OnUpdateRequired?.Invoke();
UpdateButton.OnPressed += _ => OnUpdateRequired?.Invoke();
} }
public void AddButton(InteractionEntry entry) public void AddButton(InteractionEntry entry)
@@ -60,6 +62,31 @@ public sealed partial class InteractionPanelWindow : DefaultWindow
Groups.Add(prototype.ID,Interactions.ChildCount - 1); Groups.Add(prototype.ID,Interactions.ChildCount - 1);
} }
var messageUser = new FormattedMessage();
if (state.DescUser.Count == 0)
{
messageUser.AddMarkup($"- {Loc.GetString("interaction-empty")}\n");
}
foreach (var desc in state.DescUser)
{
messageUser.AddMarkup($"- {Loc.GetString(desc)}\n");
}
PerformerDesc.SetMessage(messageUser);
var messageTarget = new FormattedMessage();
if (state.DescTarget.Count == 0)
{
messageTarget.AddMarkup($"- {Loc.GetString("interaction-empty")}\n");
}
foreach (var desc in state.DescTarget)
{
messageTarget.AddMarkup($"- {Loc.GetString(desc)}\n");
}
TargerDesc.SetMessage(messageTarget);
TargetView.SetEntity(state.Target); TargetView.SetEntity(state.Target);
PerformerView.SetEntity(state.Performer); PerformerView.SetEntity(state.Performer);

View File

@@ -1,12 +1,23 @@
using Content.Shared._Amour.Hole; using Content.Server.Body.Systems;
using Content.Server.Chat.Systems;
using Content.Server.HealthExaminable;
using Content.Server.Mind;
using Content.Shared._Amour.Hole;
using Content.Shared.Damage;
using Content.Shared.Item;
using Robust.Server.Containers; using Robust.Server.Containers;
using Robust.Shared.Containers; using Robust.Shared.Containers;
using Robust.Shared.Prototypes;
namespace Content.Server._Amour.Hole; namespace Content.Server._Amour.Hole;
public sealed partial class HoleSystem public sealed partial class HoleSystem
{ {
[Dependency] private readonly ContainerSystem _container = default!; [Dependency] private readonly ContainerSystem _container = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!;
[Dependency] private readonly ChatSystem _chatSystem = default!;
[Dependency] private readonly BodySystem _bodySystem = default!;
private void InitializeInventory() private void InitializeInventory()
{ {
@@ -17,4 +28,37 @@ public sealed partial class HoleSystem
{ {
component.Slot = _container.EnsureContainer<ContainerSlot>(uid,HoleInventoryComponent.SlotName); component.Slot = _container.EnsureContainer<ContainerSlot>(uid,HoleInventoryComponent.SlotName);
} }
public void PutItem(Entity<ItemComponent?> item, Entity<HoleInventoryComponent?> entity)
{
if(!Resolve(entity,ref entity.Comp) || !Resolve(item,ref item.Comp))
return;
if(!_prototypeManager.TryIndex(item.Comp.Size, out var itemSizePrototype)
|| !_prototypeManager.TryIndex(entity.Comp.Size, out var holeSize)
|| !_prototypeManager.TryIndex(entity.Comp.MaxSize, out var maxHoleSize))
return;
if (itemSizePrototype.Weight >= maxHoleSize.Weight)
{
_bloodstreamSystem.TryModifyBleedAmount(entity, (itemSizePrototype.Weight - maxHoleSize.Weight)*8);
_chatSystem.TrySendInGameICMessage(item.Owner," с грохотом падает на пол", InGameICChatType.Emote, ChatTransmitRange.HideChat);
//_bodySystem.GibBody(entity);
return;
}
if (itemSizePrototype.Weight >= holeSize.Weight)
{
_bloodstreamSystem.TryModifyBleedAmount(entity, (itemSizePrototype.Weight - holeSize.Weight)*4);
}
_container.Insert(item.Owner, entity.Comp.Slot);
}
public List<EntityUid> TakeItem(Entity<HoleInventoryComponent?> entity)
{
if(!Resolve(entity,ref entity.Comp))
return new List<EntityUid>();
return _container.EmptyContainer(entity.Comp.Slot);
}
} }

View File

@@ -3,8 +3,10 @@ using Content.Server.EUI;
using Content.Server.Interaction; using Content.Server.Interaction;
using Content.Shared._Amour.Arousal; using Content.Shared._Amour.Arousal;
using Content.Shared._Amour.InteractionPanel; using Content.Shared._Amour.InteractionPanel;
using Content.Shared._Amour.InteractionPanel.Checks;
using Content.Shared.Eui; using Content.Shared.Eui;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Reflection;
namespace Content.Server._Amour.InteractionPanel; namespace Content.Server._Amour.InteractionPanel;
@@ -12,14 +14,38 @@ public sealed class InteractionPanelEui : BaseEui
{ {
[Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IReflectionManager _reflectionManager = default!;
private readonly InteractionPanelSystem _interactionPanelSystem;
public readonly Entity<InteractionPanelComponent> User; public readonly Entity<InteractionPanelComponent> User;
public readonly Entity<InteractionPanelComponent> Target; public readonly Entity<InteractionPanelComponent> Target;
public readonly List<IInteractionCheck> UserInfo = new()
{
new UserHasBreast(),
new UserHasButt(),
new UserHasPenis(),
new UserHasTesticles(),
new UserHasVagina(),
new IsUserCrawl()
};
public readonly List<IInteractionCheck> TargetInfo = new()
{
new HasSmallDistance(),
new TargetHasBreast(),
new TargetHasButt(),
new TargetHasPenis(),
new TargetHasTesticles(),
new TargetHasVagina(),
new IsTargetCrawl()
};
public InteractionPanelEui(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target) public InteractionPanelEui(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target)
{ {
IoCManager.InjectDependencies(this); IoCManager.InjectDependencies(this);
_interactionPanelSystem = _entityManager.System<InteractionPanelSystem>();
User = user; User = user;
Target = target; Target = target;
} }
@@ -42,13 +68,32 @@ public sealed class InteractionPanelEui : BaseEui
if(!_prototypeManager.TryIndex(protoId,out var prototype)) if(!_prototypeManager.TryIndex(protoId,out var prototype))
continue; continue;
var isAvailable = prototype.Checks.All(check => check.IsAvailable(User, Target, _entityManager)); var isAvailable = _interactionPanelSystem.Check(User, Target, prototype, out _);
availableActions.Add(new InteractionEntry(protoId,isAvailable)); availableActions.Add(new InteractionEntry(protoId,isAvailable));
} }
var descUser = new HashSet<string>();
foreach (var check in UserInfo)
{
if (TryCheck(check, out var desc))
descUser.Add(desc);
}
return new InteractionState(_entityManager.GetNetEntity(User), _entityManager.GetNetEntity(Target),availableActions,arousal); var descTarget = new HashSet<string>();
foreach (var check in TargetInfo)
{
if (TryCheck(check, out var desc))
descTarget.Add(desc);
}
return new InteractionState(_entityManager.GetNetEntity(User), _entityManager.GetNetEntity(Target),availableActions,arousal, descUser, descTarget);
}
private bool TryCheck(IInteractionCheck check, out string output)
{
output = $"interaction-success-{check.GetType().Name.ToLower()}";
return check.IsAvailable(User, Target, _entityManager);
} }
public override void HandleMessage(EuiMessageBase msg) public override void HandleMessage(EuiMessageBase msg)

View File

@@ -1,4 +1,5 @@
using System.Linq; using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Server.Access.Systems; using Content.Server.Access.Systems;
using Content.Server.Chat.Managers; using Content.Server.Chat.Managers;
using Content.Server.Chat.Systems; using Content.Server.Chat.Systems;
@@ -6,13 +7,18 @@ using Content.Server.DoAfter;
using Content.Server.EUI; using Content.Server.EUI;
using Content.Shared._Amour.Hole; using Content.Shared._Amour.Hole;
using Content.Shared._Amour.InteractionPanel; using Content.Shared._Amour.InteractionPanel;
using Content.Shared._Amour.InteractionPanel.Checks;
using Content.Shared._White.GhostRecruitment;
using Content.Shared.ActionBlocker;
using Content.Shared.Carrying; using Content.Shared.Carrying;
using Content.Shared.Chat; using Content.Shared.Chat;
using Content.Shared.DoAfter; using Content.Shared.DoAfter;
using Content.Shared.Emoting; using Content.Shared.Emoting;
using Content.Shared.Fluids; using Content.Shared.Fluids;
using Content.Shared.Humanoid; using Content.Shared.Humanoid;
using Content.Shared.Interaction.Events;
using Content.Shared.Mind; using Content.Shared.Mind;
using Content.Shared.Movement.Events;
using Content.Shared.Random.Helpers; using Content.Shared.Random.Helpers;
using Content.Shared.Verbs; using Content.Shared.Verbs;
using Robust.Server.Audio; using Robust.Server.Audio;
@@ -37,12 +43,23 @@ public sealed class InteractionPanelSystem : EntitySystem
[Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly IRobustRandom _robustRandom = default!;
[Dependency] private readonly IChatManager _chatManager = default!; [Dependency] private readonly IChatManager _chatManager = default!;
[Dependency] private readonly DoAfterSystem _doAfterSystem = default!; [Dependency] private readonly DoAfterSystem _doAfterSystem = default!;
[Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!;
public override void Initialize() public override void Initialize()
{ {
SubscribeLocalEvent<InteractionPanelComponent,GetVerbsEvent<Verb>>(OnVerb); SubscribeLocalEvent<InteractionPanelComponent,GetVerbsEvent<Verb>>(OnVerb);
SubscribeLocalEvent<InteractionPanelComponent,ComponentInit>(OnInit); SubscribeLocalEvent<InteractionPanelComponent,ComponentInit>(OnInit);
SubscribeLocalEvent<InteractionPanelComponent,PanelDoAfterEvent>(OnPanel); SubscribeLocalEvent<InteractionPanelComponent,PanelDoAfterEvent>(OnPanel);
SubscribeLocalEvent<InteractionPanelComponent,ChangeDirectionAttemptEvent>(OnCancelable);
SubscribeLocalEvent<InteractionPanelComponent,UpdateCanMoveEvent>(OnCancelable);
}
private void OnCancelable(EntityUid uid, InteractionPanelComponent component, CancellableEntityEventArgs args)
{
if (component.IsActive || component.IsBlocked)
{
args.Cancel();
}
} }
private void OnPanel(EntityUid uid, InteractionPanelComponent component, PanelDoAfterEvent args) private void OnPanel(EntityUid uid, InteractionPanelComponent component, PanelDoAfterEvent args)
@@ -71,7 +88,7 @@ public sealed class InteractionPanelSystem : EntitySystem
{ {
args.Verbs.Add(new Verb() args.Verbs.Add(new Verb()
{ {
Text = "Open funny panel", Text = Loc.GetString("interaction-open"),
Act = () => OpenPanel(args.User,args.User,uid) Act = () => OpenPanel(args.User,args.User,uid)
}); });
} }
@@ -102,9 +119,9 @@ public sealed class InteractionPanelSystem : EntitySystem
|| !_prototypeManager.TryIndex(protoId, out var prototype)) || !_prototypeManager.TryIndex(protoId, out var prototype))
return; return;
foreach (var check in prototype.Checks.Where(check => !check.IsAvailable(user!, target!, EntityManager))) if(!Check(user!,target!,prototype, out var check))
{ {
if(!_playerManager.TryGetSessionByEntity(user,out var session)) if(_playerManager.TryGetSessionByEntity(user,out var session) || session is null)
return; return;
var message = ParseMessage(target, $"interaction-fail-{check.GetType().Name.ToLower()}"); var message = ParseMessage(target, $"interaction-fail-{check.GetType().Name.ToLower()}");
@@ -145,20 +162,18 @@ public sealed class InteractionPanelSystem : EntitySystem
private void Interact(Entity<InteractionPanelComponent> user, private void Interact(Entity<InteractionPanelComponent> user,
Entity<InteractionPanelComponent> target, InteractionPrototype prototype, bool hasChecked = true) Entity<InteractionPanelComponent> target, InteractionPrototype prototype, bool hasChecked = true)
{ {
if (!hasChecked) if(!hasChecked && !Check(user,target,prototype, out var check))
{ {
foreach (var check in prototype.Checks.Where(check => !check.IsAvailable(user!, target!, EntityManager))) if(_playerManager.TryGetSessionByEntity(user,out var session) || session is null)
{
if(!_playerManager.TryGetSessionByEntity(user,out var session))
return;
var message = ParseMessage(target, $"interaction-fail-{check.GetType().Name.ToLower()}");
_chatManager.ChatMessageToOne(ChatChannel.Emotes,message,message,EntityUid.Invalid,false,session.Channel);
return; return;
}
var message = ParseMessage(target, $"interaction-fail-{check.GetType().Name.ToLower()}");
_chatManager.ChatMessageToOne(ChatChannel.Emotes,message,message,EntityUid.Invalid,false,session.Channel);
return;
} }
user.Comp.Timeout = _gameTiming.CurTime + prototype.Timeout;
user.Comp.Timeout = _gameTiming.CurTime + prototype.Timeout + prototype.EndTime;
user.Comp.EndTime = _gameTiming.CurTime + prototype.EndTime; user.Comp.EndTime = _gameTiming.CurTime + prototype.EndTime;
user.Comp.IsActive = true; user.Comp.IsActive = true;
user.Comp.CurrentAction = prototype.ID; user.Comp.CurrentAction = prototype.ID;
@@ -180,6 +195,9 @@ public sealed class InteractionPanelSystem : EntitySystem
action.Run(user!,target!,EntityManager); action.Run(user!,target!,EntityManager);
} }
_actionBlockerSystem.UpdateCanMove(user);
_actionBlockerSystem.UpdateCanMove(target);
RaiseLocalEvent(user,new InteractionBeginningEvent(prototype.ID,user,target)); RaiseLocalEvent(user,new InteractionBeginningEvent(prototype.ID,user,target));
} }
@@ -205,6 +223,19 @@ public sealed class InteractionPanelSystem : EntitySystem
("target", GetName(target)), ("gender", GetGender(target))); ("target", GetName(target)), ("gender", GetGender(target)));
} }
public bool Check(Entity<InteractionPanelComponent> user,
Entity<InteractionPanelComponent> target, InteractionPrototype prototype,[NotNullWhen(false)] out IInteractionCheck? check)
{
check = null;
foreach (var checkout in prototype.Checks.Where(check => !check.IsAvailable(user!, target!, EntityManager)))
{
check = checkout;
return false;
}
return true;
}
public override void Update(float frameTime) public override void Update(float frameTime)
{ {
base.Update(frameTime); base.Update(frameTime);
@@ -221,6 +252,7 @@ public sealed class InteractionPanelSystem : EntitySystem
} }
var user = new Entity<InteractionPanelComponent>(uid, component); var user = new Entity<InteractionPanelComponent>(uid, component);
var target = component.CurrentPartner.Value;
if (_prototypeManager.TryIndex(component.CurrentAction, out var prototype)) if (_prototypeManager.TryIndex(component.CurrentAction, out var prototype))
{ {
@@ -242,11 +274,14 @@ public sealed class InteractionPanelSystem : EntitySystem
} }
} }
component.IsActive = false; component.IsActive = false;
_actionBlockerSystem.UpdateCanMove(user);
_actionBlockerSystem.UpdateCanMove(target);
RaiseLocalEvent(uid, new InteractionEndingEvent(component.CurrentAction, RaiseLocalEvent(uid, new InteractionEndingEvent(component.CurrentAction,
user, user,
component.CurrentPartner.Value)); target));
} }
} }
} }

View File

@@ -1,9 +1,12 @@
using System.Numerics; using System.Numerics;
using Content.Server._Amour.Animation; using Content.Server._Amour.Animation;
using Content.Server._Amour.Crawl; using Content.Server._Amour.Crawl;
using Content.Server._Amour.Hole;
using Content.Server.Hands.Systems;
using Content.Server.Pulling; using Content.Server.Pulling;
using Content.Shared._Amour.Animation; using Content.Shared._Amour.Animation;
using Content.Shared._Amour.InteractionPanel; using Content.Shared._Amour.InteractionPanel;
using Content.Shared.Hands.Components;
using Robust.Shared.Animations; using Robust.Shared.Animations;
namespace Content.Server._Amour.InteractionPanel; namespace Content.Server._Amour.InteractionPanel;
@@ -13,6 +16,9 @@ public sealed class Interactions : EntitySystem
[Dependency] private readonly CrawlSystem _crawlSystem = default!; [Dependency] private readonly CrawlSystem _crawlSystem = default!;
[Dependency] private readonly SharebleAnimationSystem _animationSystem = default!; [Dependency] private readonly SharebleAnimationSystem _animationSystem = default!;
[Dependency] private readonly PullingSystem _pullingSystem = default!; [Dependency] private readonly PullingSystem _pullingSystem = default!;
[Dependency] private readonly HoleSystem _holeSystem = default!;
[Dependency] private readonly HandsSystem _handsSystem = default!;
public override void Initialize() public override void Initialize()
{ {
SubscribeLocalEvent<InteractionPanelComponent,InteractionBeginningEvent>(OnBegin); SubscribeLocalEvent<InteractionPanelComponent,InteractionBeginningEvent>(OnBegin);
@@ -43,6 +49,41 @@ public sealed class Interactions : EntitySystem
case "CrawlTarget" : case "CrawlTarget" :
_crawlSystem.EnableCrawl(args.Target); _crawlSystem.EnableCrawl(args.Target);
break; break;
case "ItemOnButt":
PutHole(uid,"Anus");
break;
case "ItemOnVagina":
PutHole(uid,"Vagina");
break;
case "ItemFromButt":
TakeHole(uid,"Anus");
break;
case "ItemFromVagina":
TakeHole(uid,"Vagina");
break;
}
}
private void PutHole(EntityUid uid,string holeType)
{
if (!TryComp<HandsComponent>(uid, out var handsComponent)
|| handsComponent.ActiveHand?.HeldEntity is null
|| !_holeSystem.TryFind(uid,holeType,out var hole))
return;
var ent = handsComponent.ActiveHand.HeldEntity.Value;
_holeSystem.PutItem(ent,hole.Owner);
}
private void TakeHole(EntityUid uid,string holeType)
{
if (!_holeSystem.TryFind(uid,holeType,out var hole))
return;
foreach (var entity in _holeSystem.TakeItem(hole.Owner))
{
_handsSystem.TryPickup(uid, entity);
} }
} }
} }

View File

@@ -14,7 +14,7 @@ public sealed class ArousalSystem : EntitySystem
private void OnComponentInit(EntityUid uid, ArousalComponent component, ComponentInit args) private void OnComponentInit(EntityUid uid, ArousalComponent component, ComponentInit args)
{ {
UpdateAlarm(new Entity<ArousalComponent?>(uid,component)); //UpdateAlarm(new Entity<ArousalComponent?>(uid,component));
} }
private void UpdateAlarm(Entity<ArousalComponent?> entity) private void UpdateAlarm(Entity<ArousalComponent?> entity)

View File

@@ -0,0 +1,27 @@
using Content.Shared.Hands.Components;
namespace Content.Shared._Amour.InteractionPanel.Checks;
public sealed class HasItemInUserHand : IInteractionCheck
{
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
{
return entityManager.TryGetComponent<HandsComponent>(user, out var handsComponent) && handsComponent.ActiveHand?.HeldEntity is not null;
}
}
public sealed class UserHasHand : IInteractionCheck
{
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
{
return entityManager.HasComponent<HandsComponent>(user);
}
}
public sealed class TargetHasHand : IInteractionCheck
{
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
{
return entityManager.HasComponent<HandsComponent>(target);
}
}

View File

@@ -6,7 +6,7 @@ public sealed class UserHasButt : IInteractionCheck
{ {
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager) public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
{ {
return entityManager.System<SharedHoleSystem>().TryFind(user.Owner, "Anus", out _); return entityManager.System<SharedHoleSystem>().HasAccessTo(user.Owner, "Anus");
} }
} }
@@ -14,7 +14,7 @@ public sealed class TargetHasButt : IInteractionCheck
{ {
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager) public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
{ {
return entityManager.System<SharedHoleSystem>().TryFind(target.Owner, "Anus", out _); return entityManager.System<SharedHoleSystem>().HasAccessTo(target.Owner, "Anus");
} }
} }
@@ -22,7 +22,7 @@ public sealed class UserHasPenis : IInteractionCheck
{ {
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager) public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
{ {
return entityManager.System<SharedHoleSystem>().TryFind(user.Owner, "Dick", out _); return entityManager.System<SharedHoleSystem>().HasAccessTo(user.Owner, "Dick");
} }
} }
@@ -30,7 +30,7 @@ public sealed class TargetHasPenis : IInteractionCheck
{ {
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager) public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
{ {
return entityManager.System<SharedHoleSystem>().TryFind(target.Owner, "Dick", out _); return entityManager.System<SharedHoleSystem>().HasAccessTo(target.Owner, "Dick");
} }
} }
@@ -38,7 +38,7 @@ public sealed class UserHasVagina : IInteractionCheck
{ {
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager) public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
{ {
return entityManager.System<SharedHoleSystem>().TryFind(user.Owner, "Vagina", out _); return entityManager.System<SharedHoleSystem>().HasAccessTo(user.Owner, "Vagina");
} }
} }
@@ -46,7 +46,7 @@ public sealed class TargetHasVagina : IInteractionCheck
{ {
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager) public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
{ {
return entityManager.System<SharedHoleSystem>().TryFind(target.Owner, "Vagina", out _); return entityManager.System<SharedHoleSystem>().HasAccessTo(target.Owner, "Vagina");
} }
} }
@@ -54,7 +54,7 @@ public sealed class UserHasTesticles : IInteractionCheck
{ {
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager) public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
{ {
return entityManager.System<SharedHoleSystem>().TryFind(user.Owner, "Testicles", out _); return entityManager.System<SharedHoleSystem>().HasAccessTo(user.Owner, "Testicles");
} }
} }
@@ -62,7 +62,7 @@ public sealed class TargetHasTesticles : IInteractionCheck
{ {
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager) public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
{ {
return entityManager.System<SharedHoleSystem>().TryFind(target.Owner, "Testicles", out _); return entityManager.System<SharedHoleSystem>().HasAccessTo(target.Owner, "Testicles");
} }
} }
@@ -70,7 +70,7 @@ public sealed class UserHasBreast : IInteractionCheck
{ {
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager) public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
{ {
return entityManager.System<SharedHoleSystem>().TryFind(user.Owner, "Breast", out _); return entityManager.System<SharedHoleSystem>().HasAccessTo(user.Owner, "Breast");
} }
} }
@@ -78,6 +78,6 @@ public sealed class TargetHasBreast : IInteractionCheck
{ {
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager) public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
{ {
return entityManager.System<SharedHoleSystem>().TryFind(target.Owner, "Breast", out _); return entityManager.System<SharedHoleSystem>().HasAccessTo(target.Owner, "Breast");
} }
} }

View File

@@ -26,14 +26,20 @@ public sealed class InteractionState: EuiStateBase
public NetEntity Performer { get; } public NetEntity Performer { get; }
public NetEntity Target { get; } public NetEntity Target { get; }
public HashSet<InteractionEntry> AvailableInteractions; public HashSet<InteractionEntry> AvailableInteractions;
public HashSet<string> DescUser;
public HashSet<string> DescTarget;
public byte? Arousal; public byte? Arousal;
public InteractionState(NetEntity performer, NetEntity target, HashSet<InteractionEntry> availableInteractions, byte? arousal) public InteractionState(NetEntity performer, NetEntity target, HashSet<InteractionEntry> availableInteractions, byte? arousal, HashSet<string> descUser, HashSet<string> descTarget)
{ {
Performer = performer; Performer = performer;
Target = target; Target = target;
AvailableInteractions = availableInteractions; AvailableInteractions = availableInteractions;
Arousal = arousal; Arousal = arousal;
DescUser = descUser;
DescTarget = descTarget;
} }
} }

View File

@@ -0,0 +1,2 @@
alerts-arousal-name = Прикольное
alerts-arousal-desc = Показывает ваш уровень возбуждения. В разработке.

View File

@@ -0,0 +1,16 @@
interaction-fail-userhasbutt = Но у меня нет попы!
interaction-fail-targethasbutt = Но у того нет попы!
interaction-fail-userhaspenis = Но у меня нет члена!
interaction-fail-targethaspenis = Но у того нет члена!
interaction-fail-userhasvagina = Но у меня нет вагины!
interaction-fail-targethasvagina = Но у неё нет вагины!
interaction-fail-userhastesticles = Но у меня нет яиц!
interaction-fail-targethastesticles = Но у него нет яиц!
interaction-fail-userhasbreast = Но у меня нет груди!
interaction-fail-targethasbreast = Но у неё нет груди!
interaction-fail-hassmalldistance = До цели так далеко...
interaction-fail-interactself = Я могу сделать это лишь с собой!
interaction-fail-cantinteractself = Я не могу сделать это с собой!
interaction-fail-isusercrawl = Но я не лежу!
interaction-fail-istargetcrawl = Но цель не лежит!

View File

@@ -4,7 +4,8 @@ interaction-name-dickinbutt = выебать в очко
interaction-name-dickinvagina = выебать в вагину interaction-name-dickinvagina = выебать в вагину
interaction-name-itemonbutt = засунуть вещь в очко interaction-name-itemonbutt = засунуть вещь в очко
interaction-name-itemonvagina = засунуть вещь в вагину interaction-name-itemonvagina = засунуть вещь в вагину
interaction-name-itemonpenis = засунуть вещь в член interaction-name-itemfrombutt = засунуть руку в очко
interaction-name-itemfromvagina = засунуть руку в вагину
interaction-name-lickdick = отлизать мужсокй половой орган interaction-name-lickdick = отлизать мужсокй половой орган
interaction-name-lickvagina = отлизать вагину interaction-name-lickvagina = отлизать вагину
interaction-name-lickface = отлизать лицо interaction-name-lickface = отлизать лицо
@@ -17,12 +18,92 @@ interaction-name-combbutt = погладить по попе
interaction-name-pulltarget = держать за ручку interaction-name-pulltarget = держать за ручку
interaction-name-sitwithbutt = насадить на своё очко хуй interaction-name-sitwithbutt = насадить на своё очко хуй
interaction-name-sitwithvagina = насадить на свою вагину хуй interaction-name-sitwithvagina = насадить на свою вагину хуй
interaction-name-drochdick = подрочить хуй
interaction-butt-slap1 = шлёпает попку { $target } interaction-butt-slap1 = шлёпает попку { $target }
interaction-butt-slap2 = со всей силы бьёт по жопе { $target } interaction-butt-slap2 = со всей силы бьёт по жопе { $target }
interaction-butt-slap3 = шлёпает попку { $target } interaction-butt-slap3 = примерясь, звонко шлёпает { $target } по попке
interaction-crawl-before1 = пытается толкнуть { $target }
interaction-crawl1 = с грохотом роняет { $target }
interaction-crawl2 = заставляет упасть { $target }
interaction-crawl3 = толкает { $target } на пол
interaction-butt-fuck1 = схватив за бёдра, нежно просовывает член прямо в булки { $target }
interaction-butt-fuck2 = войдя в дырочку своим половым органом, начинает проникать всё глубже в { $target }
interaction-butt-fuck3 = просунув в колечко свой орган, с пристрастием входит в анал { $target }
interaction-vagina-fuck1 = вставляет свой возбуждённый член в киску и с силой совершает толчки бёдрами в сторону { $target }
interaction-vagina-fuck2 = вводит стоячий орган прямо в вагину, начиная входить всё глубже в { $target }
interaction-vagina-fuck3 = войдя в киску своим горячим членом, занялся актом совокупления с { $target }
interaction-butt-put-before1 = суёт между булок { $target } нечто
interaction-butt-put1 = засунул вещь между булок { $target }
interaction-butt-put2 = засунул вещь между булок { $target }
interaction-butt-put3 = засунул вещь между булок { $target }
interaction-vagina-put-before1 = суёт в киску { $target } нечто смешное
interaction-vagina-put1 = успешно засунул в киску { $target } вещь
interaction-vagina-put2 = успешно засунул в киску { $target } вещь
interaction-vagina-put3 = успешно засунул в киску { $target } вещь
interaction-butt-take-before1 = суёт между булок { $target } свою руку
interaction-butt-take1 = иследовал булки { $target } своими руками
interaction-butt-take2 = иследовал булки { $target } своими руками
interaction-butt-take3 = иследовал булки { $target } своими руками
interaction-vagina-take-before1 = суёт в киску { $target } свою руку
interaction-vagina-take1 = успешно исследовал киску { $target } своими ручками
interaction-vagina-take2 = успешно исследовал киску { $target } своими ручками
interaction-vagina-take3 = успешно исследовал киску { $target } своими ручками
interaction-sit-butt1 = присаживается дырочкой прямиком на член { $target }
interaction-sit-butt2 = осторожно садится на половой орган { $target }
interaction-sit-butt3 = вставляет в свой анал член и присаживается на { $target }
interaction-sit-vagina1 = медленно садится своей киской прямо на член { $target }
interaction-sit-vagina2 = вставляя в себя член, аккуратно опускается вагиной на орган { $target }
interaction-sit-vagina3 = постепенно опустившись вниз, присаживается своей киской на член { $target }
interaction-dick-lick1 = вобрав в свой ротик член, начинает посасывать орган { $target }
interaction-dick-lick2 = приблизившись к половому органу своим ртом, просовывает тот внутрь себя и начинает массировать язычком член { $target }
interaction-dick-lick3 = ласково облизав своим язычком член, начинает отсасывать у { $target }
interaction-vagina-lick1 = начинает оживлённо полизывать сладкую киску язычком у { $target }
interaction-vagina-lick2 = вылизывая вагину языком, слегка слюнявит { $target }
interaction-vagina-lick3 = осторожно проникает своим язычишком прямо в киску { $target }
interaction-face-lick1 = высунув горячий язычок, полизывает личико { $target }
interaction-face-lick2 = быстрым движением языка ласково лижет лицо { $target }
interaction-face-lick3 = проводит язычком по личику, оставляя след из слюнок на { $target }
interaction-droch-dick1 = прильнув ручкой к половому органу, начинает ласкать член { $target }
interaction-droch-dick2 = опустив ручку к члену, мастурбирует орган { $target }
interaction-droch-dick3 = удерживая член, ласкает половой орган { $target }
interaction-mouth-kiss1 = приблизившись устами к губкам, страстно целует { $target }
interaction-mouth-kiss2 = не теряя ни минуты, начинает жаркий поцелуй с { $target }
interaction-mouth-kiss3 = тут же начинает упиваться сладостным поцелуем с { $target }
interaction-neck-kiss1 = приблизился губами к шейке и оставил след от поцелуя с { $target }
interaction-neck-kiss2 = жарко поцеловав устами шею, оставляет заметный след на { $target }
interaction-neck-kiss3 = с любовью расцеловывает шейку { $target }
interaction-face-kiss1 = оставляет лёгкий поцелуйчик на щеке { $target }
interaction-face-kiss2 = чмокает в щёчку { $target }
interaction-face-kiss3 = легонько целует в щёку { $target }
interaction-head-comb1 = опустив руку на голову, поглаживает { $target }
interaction-head-comb2 = ласково и с любовью гладит { $target }
interaction-head-comb3 = выражает свою любовь, поглаживая по макушке { $target }
interaction-ears-comb1 = убрав руку за ушко, почёсывает { $target }
interaction-ears-comb2 = с лаской чешет за ушком { $target }
interaction-ears-comb3 = заботливо почёсывает ушко { $target }
interaction-butt-comb1 = спустившись к булочкам, поглаживает { $target }
interaction-butt-comb2 = мнёт и полаживает ягодицы { $target }
interaction-butt-comb3 = проводя ладошкой по упругой попке, гладит { $target }
interaction-pull1 = робко схватил за ручки { $target }
interaction-pull2 = подхватывает { $target } за руки
interaction-pull3 = подхватывает { $target } за руки

View File

@@ -0,0 +1,16 @@
interaction-success-userhasbreast = У меня есть грудь
interaction-success-userhasbutt = У меня есть попа
interaction-success-userhaspenis = У меня есть член
interaction-success-userhastesticles = У меня есть яйца
interaction-success-userhasvagina = У меня есть вагина
interaction-success-isusercrawl = Я лежу!
interaction-success-hassmalldistance = ..Довольно близко
interaction-success-targethasbreast = ..Имеет грудь
interaction-success-targethasbutt = ..Имеет попу
interaction-success-targethaspenis = ..Имеет член
interaction-success-targethastesticles = ..Имеет яйца
interaction-success-targethasvagina = ..Имеет вагину
interaction-success-istargetcrawl = ..Лежит
interaction-empty = ..Пусто

View File

@@ -1,2 +1,4 @@
interaction-panel-title = Панель взаимодействий interaction-panel-title = Панель взаимодействий
interaction-hide-unvisible = Спрятать недоступные действия interaction-hide-unvisible = Спрятать недоступные действия
interaction-update = Обновить список
interaction-open = Открыть панель взаимодействий

View File

@@ -50,6 +50,7 @@
- interaction-butt-fuck2 - interaction-butt-fuck2
- interaction-butt-fuck3 - interaction-butt-fuck3
group: Danger group: Danger
endTime: 6
- type: interaction - type: interaction
id: DickInVagina id: DickInVagina
@@ -60,17 +61,28 @@
- !type:TargetHasVagina - !type:TargetHasVagina
beginningSound: beginningSound:
path: /Audio/Effects/Emotes/clap1.ogg path: /Audio/Effects/Emotes/clap1.ogg
beginningActions:
- !type:RequireAnimation
k0: 0
k1: 0.1
k3: 0.25
repeat: 12
beginningMessages: beginningMessages:
- interaction-butt-fuck1 - interaction-vagina-fuck1
- interaction-butt-fuck2 - interaction-vagina-fuck2
- interaction-butt-fuck3 - interaction-vagina-fuck3
group: Danger group: Danger
endTime: 6
- type: interaction - type: interaction
id: ItemOnButt id: ItemOnButt
checks: checks:
- !type:HasSmallDistance - !type:HasSmallDistance
- !type:TargetHasButt - !type:TargetHasButt
- !type:HasItemInUserHand
beginningTimeout: 10
preBeginMessages:
- interaction-butt-put-before1
beginningMessages: beginningMessages:
- interaction-butt-put1 - interaction-butt-put1
- interaction-butt-put2 - interaction-butt-put2
@@ -82,6 +94,10 @@
checks: checks:
- !type:HasSmallDistance - !type:HasSmallDistance
- !type:TargetHasVagina - !type:TargetHasVagina
- !type:HasItemInUserHand
beginningTimeout: 10
preBeginMessages:
- interaction-vagina-put-before1
beginningMessages: beginningMessages:
- interaction-vagina-put1 - interaction-vagina-put1
- interaction-vagina-put2 - interaction-vagina-put2
@@ -90,15 +106,35 @@
- type: interaction - type: interaction
id: ItemOnPenis id: ItemFromButt
checks: checks:
- !type:HasSmallDistance - !type:HasSmallDistance
- !type:TargetHasPenis - !type:TargetHasButt
- !type:UserHasHand
beginningTimeout: 10
preBeginMessages:
- interaction-butt-take-before1
beginningMessages: beginningMessages:
- interaction-penis-put1 - interaction-butt-take1
- interaction-penis-put2 - interaction-butt-take2
- interaction-penis-put3 - interaction-butt-take3
group: Extreme group: Danger
- type: interaction
id: ItemFromVagina
checks:
- !type:HasSmallDistance
- !type:TargetHasVagina
- !type:UserHasHand
beginningTimeout: 10
preBeginMessages:
- interaction-vagina-take-before1
beginningMessages:
- interaction-vagina-take1
- interaction-vagina-take2
- interaction-vagina-take3
group: Danger
- type: interaction - type: interaction
@@ -106,6 +142,7 @@
checks: checks:
- !type:HasSmallDistance - !type:HasSmallDistance
- !type:TargetHasPenis - !type:TargetHasPenis
- !type:CantInteractSelf
#- !type:UserHasButt #- !type:UserHasButt
- !type:IsTargetCrawl - !type:IsTargetCrawl
beginningSound: beginningSound:
@@ -117,6 +154,7 @@
- interaction-sit-butt2 - interaction-sit-butt2
- interaction-sit-butt3 - interaction-sit-butt3
group: Danger group: Danger
endTime: 6
- type: interaction - type: interaction
@@ -124,6 +162,7 @@
checks: checks:
- !type:HasSmallDistance - !type:HasSmallDistance
- !type:TargetHasPenis - !type:TargetHasPenis
- !type:CantInteractSelf
- !type:UserHasVagina - !type:UserHasVagina
- !type:IsTargetCrawl - !type:IsTargetCrawl
beginningSound: beginningSound:
@@ -135,11 +174,13 @@
- interaction-sit-vagina2 - interaction-sit-vagina2
- interaction-sit-vagina3 - interaction-sit-vagina3
group: Danger group: Danger
endTime: 6
- type: interaction - type: interaction
id: LickDick id: LickDick
checks: checks:
- !type:HasSmallDistance - !type:HasSmallDistance
- !type:CantInteractSelf
- !type:TargetHasPenis - !type:TargetHasPenis
beginningSound: beginningSound:
path: /Audio/White/Felinid/lick.ogg path: /Audio/White/Felinid/lick.ogg
@@ -150,14 +191,18 @@
- interaction-dick-lick2 - interaction-dick-lick2
- interaction-dick-lick3 - interaction-dick-lick3
group: Danger group: Danger
endTime: 6
- type: interaction - type: interaction
id: LickVagina id: LickVagina
checks: checks:
- !type:HasSmallDistance - !type:HasSmallDistance
- !type:CantInteractSelf
- !type:TargetHasVagina - !type:TargetHasVagina
beginningSound: beginningSound:
path: /Audio/White/Felinid/lick.ogg path: /Audio/White/Felinid/lick.ogg
beginningActions:
- !type:RequireHorizontalAnimation
beginningAction: beginningAction:
- !type:RequireHorizontalAnimation - !type:RequireHorizontalAnimation
beginningMessages: beginningMessages:
@@ -165,6 +210,7 @@
- interaction-vagina-lick2 - interaction-vagina-lick2
- interaction-vagina-lick3 - interaction-vagina-lick3
group: Danger group: Danger
endTime: 6
- type: interaction - type: interaction
id: LickFace id: LickFace
@@ -181,7 +227,25 @@
- interaction-face-lick1 - interaction-face-lick1
- interaction-face-lick2 - interaction-face-lick2
- interaction-face-lick3 - interaction-face-lick3
group: Moderate
- type: interaction
id: DrochDick
checks:
- !type:HasSmallDistance
- !type:TargetHasPenis
beginningSound:
path: /Audio/Effects/Emotes/clap1.ogg
beginningActions:
- !type:RequireAnimation
k0: 0
k1: 0.1
k2: 3.4
k3: 0.25
beginningMessages:
- interaction-droch-dick1
group: Danger group: Danger
endTime: 6
- type: interaction - type: interaction
id: KissMouth id: KissMouth
@@ -282,6 +346,7 @@
- type: interaction - type: interaction
id: CombButt id: CombButt
checks: checks:
- !type:CantInteractSelf
- !type:HasSmallDistance - !type:HasSmallDistance
beginningSound: beginningSound:
path: /Audio/White/Interactions/ches.ogg path: /Audio/White/Interactions/ches.ogg

View File

@@ -7,7 +7,6 @@
- DickInVagina - DickInVagina
- ItemOnButt - ItemOnButt
- ItemOnVagina - ItemOnVagina
- ItemOnPenis
- LickVagina - LickVagina
- LickDick - LickDick
- LickFace - LickFace
@@ -21,3 +20,6 @@
- CrawlTarget - CrawlTarget
- SitWithButt - SitWithButt
- SitWithVagina - SitWithVagina
- DrochDick
- ItemFromButt
- ItemFromVagina

View File

@@ -1,7 +1,7 @@
- type: genitalsGroup - type: genitalsGroup
id: Penis id: Penis
prototypes: prototypes:
- PenisAmputated0 #- PenisAmputated0
- PenisBarbknot1 - PenisBarbknot1
- PenisBarbknot2 - PenisBarbknot2
- PenisBarbknot3 - PenisBarbknot3
@@ -39,12 +39,12 @@
- PenisTentacle2 - PenisTentacle2
- PenisTentacle3 - PenisTentacle3
- PenisTentacle4 - PenisTentacle4
- PenisThick1 #- PenisThick1
- PenisThick2 #- PenisThick2
- PenisThick3 #- PenisThick3
- PenisThick4 #- PenisThick4
- PenisThick5 #- PenisThick5
- VaginaCloaca1 #- VaginaCloaca1
- VaginaDentata1 - VaginaDentata1
- VaginaFurred1 - VaginaFurred1
- VaginaGaping1 - VaginaGaping1
@@ -72,16 +72,16 @@
- BreastsPairD - BreastsPairD
- BreastsPairE - BreastsPairE
- BreastsPairF - BreastsPairF
- BreastsPairGiga #- BreastsPairGiga
- BreastsPairG - BreastsPairG
- BreastsPairHuge #- BreastsPairHuge
- BreastsPairH - BreastsPairH
- BreastsPairImpossible #- BreastsPairImpossible
- BreastsPairI - BreastsPairI
- BreastsPairJ - BreastsPairJ
- BreastsPairK - BreastsPairK
- BreastsPairL - BreastsPairL
- BreastsPairMassive #- BreastsPairMassive
- BreastsPairM - BreastsPairM
- BreastsPairN - BreastsPairN
- BreastsPairO - BreastsPairO
@@ -91,16 +91,16 @@
- BreastsQuadD - BreastsQuadD
- BreastsQuadE - BreastsQuadE
- BreastsQuadF - BreastsQuadF
- BreastsQuadGiga #- BreastsQuadGiga
- BreastsQuadG - BreastsQuadG
- BreastsQuadHuge #- BreastsQuadHuge
- BreastsQuadH - BreastsQuadH
- BreastsQuadImpossible #- BreastsQuadImpossible
- BreastsQuadI - BreastsQuadI
- BreastsQuadJ - BreastsQuadJ
- BreastsQuadK - BreastsQuadK
- BreastsQuadL - BreastsQuadL
- BreastsQuadMassive #- BreastsQuadMassive
- BreastsQuadM - BreastsQuadM
- BreastsQuadN - BreastsQuadN
- BreastsQuadO - BreastsQuadO
@@ -110,16 +110,16 @@
- BreastsSextupleD - BreastsSextupleD
- BreastsSextupleE - BreastsSextupleE
- BreastsSextupleF - BreastsSextupleF
- BreastsSextupleGiga #- BreastsSextupleGiga
- BreastsSextupleG - BreastsSextupleG
- BreastsSextupleHuge #- BreastsSextupleHuge
- BreastsSextupleH - BreastsSextupleH
- BreastsSextupleImpossible #- BreastsSextupleImpossible
- BreastsSextupleI - BreastsSextupleI
- BreastsSextupleJ - BreastsSextupleJ
- BreastsSextupleK - BreastsSextupleK
- BreastsSextupleL - BreastsSextupleL
- BreastsSextupleMassive #- BreastsSextupleMassive
- BreastsSextupleM - BreastsSextupleM
- BreastsSextupleN - BreastsSextupleN
- BreastsSextupleO - BreastsSextupleO
@@ -131,9 +131,9 @@
- TesticlesSheath2 - TesticlesSheath2
- TesticlesSheath3 - TesticlesSheath3
- TesticlesSheath4 - TesticlesSheath4
- TesticlesSheath5 #- TesticlesSheath5
- TesticlesSingle1 #- TesticlesSingle1
- TesticlesSingle2 #- TesticlesSingle2
- TesticlesSingle3 #- TesticlesSingle3
- TesticlesSingle4 #- TesticlesSingle4
- TesticlesSingle5 #- TesticlesSingle5