Skip to content

Commit

Permalink
[Feature] Половые запреты ♀️ ♂️ (#985)
Browse files Browse the repository at this point in the history
## Описание PR
В этом пулл реквесте добавлена новая фича для проверки пола персонажа в
зависимости от требований к роли. С помощью нового класса
`SexRequirement` можно устанавливать ограничения на пол персонажа,
необходимый для выполнения роли. Это улучшает гибкость настройки ролей и
позволяет контролировать, какие персонажи могут претендовать на
определённые должности, исходя из их пола.

## Почему / Баланс
Добавление этой функциональности расширяет возможности настройки ролей,
что может быть полезно в определённых ситуациях, например, для создания
уникальных или специфичных для пола ролей.

**Ссылка на публикацию в Discord:**  
-
[Заказы-разработка](https://discord.com/channels/901772674865455115/1328884854313586739)

## Техническая информация
Добавлен класс `SexRequirement`, который является наследником
`JobRequirement`. Этот класс позволяет задать список допустимых полов
персонажа, и при попытке выбора роли будет проверяться, соответствует ли
пол персонажа требованиям.
Код проверяет поле `Sex` персонажа и, в зависимости от настроек, либо
разрешает, либо запрещает выбор роли.

**Пример конфига в прототипе**  
```yml
    - !type:SexRequirement
      allowedSex:
      - Male
      - Unsexed
      - Female
```

## Медиа
1. Пример вайтлиста для женских персонажей:

![image](https://github.com/user-attachments/assets/78af61e1-8dba-4842-bdd1-8a249ffad4d8)

2. Пример вайтлиста для мужских и бесполых персонажей:

![image](https://github.com/user-attachments/assets/937a7439-6228-4ebf-b7db-f85d63b4ec6f)

## Требования
- [x] Я прочитал(а) и следую [Руководство по созданию пулл
реквестов](https://docs.spacestation14.com/en/general-development/codebase-info/pull-request-guidelines.html).
Я понимаю, что в противном случае мой ПР может быть закрыт по усмотрению
мейнтейнера.
- [x] Я добавил скриншоты/видео к этому пулл реквесту, демонстрирующие
его изменения в игре, **или** этот пулл реквест не требует демонстрации
в игре

## Критические изменения
Не предполагается критических изменений, так как добавлен новый
функционал без вмешательства в существующие классы или систему.

**Чейнджлог:**  
:cl: Шрёдька
- add: Добавлена система ограничения по полу персонажа для ролей.
  • Loading branch information
Schrodinger71 authored Jan 15, 2025
1 parent 46fc54b commit ccd83e9
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 0 deletions.
61 changes: 61 additions & 0 deletions Content.Shared/ADT/Roles/JobRequirement/SexRequirement.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
using System.Diagnostics.CodeAnalysis;
using System.Text;
using Content.Shared.Preferences;
using JetBrains.Annotations;
using Robust.Shared.Utility;
using Content.Shared.Humanoid;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;

namespace Content.Shared.Roles
{
/// <summary>
/// Requires the character to be of a specified sex.
/// </summary>
[UsedImplicitly]
[Serializable, NetSerializable]
public sealed partial class SexRequirement : JobRequirement
{
[DataField(required: true)]
public HashSet<Sex> AllowedSex = new();

/// <summary>
/// Проверка, соответствует ли персонаж требуемому полу
/// </summary>
/// <param name="entManager">Менеджер сущностей</param>
/// <param name="protoManager">Менеджер прототипов</param>
/// <param name="profile">Профиль персонажа</param>
/// <param name="playTimes">Время игры</param>
/// <param name="reason">Причина отказа, если не прошел проверку</param>
/// <returns>Возвращает true, если проверка пройдена, иначе false</returns>
public override bool Check(IEntityManager entManager,
IPrototypeManager protoManager,
HumanoidCharacterProfile? profile,
IReadOnlyDictionary<string, TimeSpan> playTimes,
[NotNullWhen(false)] out FormattedMessage? reason)
{
reason = new FormattedMessage();

if (profile is null)
return true;

var sb = new StringBuilder();
sb.Append("[color=yellow]"); // Красим в жёлтый

// Преобразование коллекции AllowedSex в строку для отображения
sb.Append(string.Join(", ", AllowedSex));

sb.Append("[/color]");

if (!Inverted)
{
reason = FormattedMessage.FromMarkupPermissive($"{Loc.GetString("role-timer-whitelisted-sex")}\n{sb}");

if (!AllowedSex.Contains(profile.Sex))
return false;
}

return true;
}
}
}
1 change: 1 addition & 0 deletions Resources/Locale/ru-RU/ADT/Job/role-requirements.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
role-timer-whitelisted-sex = Ваш персонаж должен иметь следующий пол для этой роли:

0 comments on commit ccd83e9

Please sign in to comment.