fish-station/Content.Server/_Sunrise/Roles/RelativeJobsCountComponent.cs
ThereDrD cbf3dc07f3
Расширение функционала зависимости работок от работок (#2372)
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: pacable <igor.mamaev1@gmail.com>
2025-06-16 01:21:26 +03:00

99 lines
5.6 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Content.Shared.Roles;
using Robust.Shared.Prototypes;
namespace Content.Server._Sunrise.Roles;
/// <summary>
/// Компонент, вещающийся на станцию, чтобы увеличивать слоты на работы в зависимости различных условий.
/// Увеличение происходит как только игрок заходит за роль.
/// </summary>
[RegisterComponent]
public sealed partial class RelativeJobsCountComponent : Component
{
/// <summary>
/// Список параметров для ролей, которые будут увеличивать количество слотов одной роли за счет игроков на другой роли.
/// </summary>
[DataField]
public HashSet<JobRelativeCount> Jobs = [];
/// <summary>
/// Список параметров для ролей, которые будут увеличивать количество слотов одной роли за общего онлайна сервера.
/// </summary>
[DataField]
public HashSet<OnlineRelativeCount> Online = [];
/// <summary>
/// Словарь, хранящий максимальное количество слотов для каждой из работ.
/// Значения тут будут являться крайней точкой, которая ограничивает количество слотов.
/// Это существует, чтобы отдельно разные условия(от количества ролей и от онлайна) не создавали слишком много неконтроллируемых слотов.
/// Ключ -> работа, слоты которой будут ограничены.
/// Значение -> Количество максимальных слотов. Без учета того, что написано в перечислении ролей у карты. Поставьте -1 чтоб выключить ограничение сверху
/// </summary>
[DataField(required: true)]
public Dictionary<ProtoId<JobPrototype>, int> TotalMaxCount;
}
/// <summary>
/// Структура используемая как параметр настройки зависимости количества слотов определенной роли от количества игроков на других ролях.
/// </summary>
[DataDefinition]
public partial record struct JobRelativeCount : IRelativeCountSettings
{
/// <summary>
/// Работа, на которую будут выдаваться слоты.
/// </summary>
[DataField(required: true)] public ProtoId<JobPrototype> TargetJob { get; set; }
/// <summary>
/// Словарь с зависимостями.
/// Ключ - работа, игроки на которой будут выдавать доп слоты для TargetJob.
/// Значение - количество открываемых слотов за каждого игрока на переданной в ключе работе.
/// </summary>
[DataField(required: true)] public Dictionary<ProtoId<JobPrototype>, int> Dependency { get; set; }
/// <summary>
/// Максимум слотов, которые будут открыты для данной роли через количество других ролей.
/// </summary>
[DataField] public int MaxSlots { get; set; } = -1;
}
/// <summary>
/// Структура используемая как параметр настройки зависимости количества слотов определенной роли от общего онлайна на сервере.
/// </summary>
[DataDefinition]
public partial record struct OnlineRelativeCount : IRelativeCountSettings
{
/// <summary>
/// Работа, на которую будут выдаваться слоты.
/// </summary>
[DataField(required: true)] public ProtoId<JobPrototype> TargetJob { get; set; }
/// <summary>
/// Сколько игроков онлайна будут выдавать дополнительный слот?
/// Пример: 20 = каждые 20 игроков открывается новый слот.
/// </summary>
[DataField(required: true)] public float AnyTargetOnlineIncreaseSlot { get; set; }
/// <summary>
/// Максимум слотов, которые будут открыты для данной роли через количество онлайна.
/// </summary>
[DataField] public int MaxSlots { get; set; } = -1;
}
/// <summary>
/// Общий-интерфейс шаблон для построения зависимости количества слотов работы от чего-то.
/// Включает обязательные и общие для всех параметры, которые обязаны быть использованы.
/// </summary>
public interface IRelativeCountSettings
{
/// <summary>
/// Работа, на которую будут выдаваться слоты.
/// </summary>
public ProtoId<JobPrototype> TargetJob { get; set; }
/// <summary>
/// Максимум слотов, которые будут открыты для данной роли через данные настройки.
/// </summary>
/// TODO: Проверить, что это вообще работает, если отличается от максимального количества из компонента
public int MaxSlots { get; set; }
}