diff --git a/Content.Server/ADT/Addiction/AddictionSystem.cs b/Content.Server/ADT/Addiction/AddictionSystem.cs new file mode 100644 index 00000000000..661c4932cfe --- /dev/null +++ b/Content.Server/ADT/Addiction/AddictionSystem.cs @@ -0,0 +1,52 @@ +using Content.Shared.ADT.Addiction.AddictedComponent; +using Content.Server.ADT.Addiction.EntityEffects; +using Content.Shared.Popups; +using Robust.Shared.Random; +using Robust.Shared.Timing; +namespace Content.Server.ADT.Addiction; + +public sealed partial class AddictionSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + + public override void Update(float frameTime) + { + base.Update(frameTime); + TimeSpan fT = TimeSpan.FromSeconds(frameTime); + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp)) + { + UpdateCurrentAddictedTime(comp, fT); + UpdateTypeAddiction(comp); + UpdateAddicted(comp, uid); + } + } + public void UpdateCurrentAddictedTime(AddictedComponent comp, TimeSpan frameTime) + { + if (comp.CurrentAddictedTime >= TimeSpan.Zero + frameTime) + comp.CurrentAddictedTime -= frameTime; + else + comp.CurrentAddictedTime = TimeSpan.Zero; + if (comp.RemaningTime >= TimeSpan.Zero + frameTime) + comp.RemaningTime -= frameTime; + else + comp.RemaningTime = TimeSpan.Zero; + } + public void UpdateTypeAddiction(AddictedComponent comp) + { + if (comp.TypeAddiction > 0 && comp.Addicted && comp.RemaningTime <= TimeSpan.Zero) + { + comp.RemaningTime = comp.ChangeAddictionTypeTime; + comp.TypeAddiction -= 1; + } + } + public void UpdateAddicted(AddictedComponent comp, EntityUid uid) + { + if (comp.CurrentAddictedTime >= comp.RequiredTime) + { + comp.Addicted = true; + _popup.PopupEntity("У вас сформировывается зависимость", uid, uid); + } + } +} diff --git a/Content.Server/ADT/Addiction/EntityEffects.cs b/Content.Server/ADT/Addiction/EntityEffects.cs new file mode 100644 index 00000000000..7061a5cc656 --- /dev/null +++ b/Content.Server/ADT/Addiction/EntityEffects.cs @@ -0,0 +1,37 @@ +using Content.Shared.ADT.Addiction.AddictedComponent; +using Content.Shared.EntityEffects; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; + +namespace Content.Server.ADT.Addiction.EntityEffects; +public sealed partial class AddictionEffect : EntityEffect +{ + [DataField(required: true)] + public float TimeCoefficient = new(); // Коэфицент домножающий на себя время воздействие этого регаента на организм + [DataField(required: true)] + public float QuantityCoefficient = new(); // Коэфицент домножающий на себя количество усвоенного реагента организмом + [DataField] public TimeSpan DelayTime = TimeSpan.FromSeconds(30); // Время между получением реагента + + + protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) + { + return Loc.GetString("reagent-effect-addiction", ("chance", Probability)); + } + + public override void Effect(EntityEffectBaseArgs ev) + { + if (ev is not EntityEffectReagentArgs args) + return; + if (ev.EntityManager.TryGetComponent(ev.TargetEntity, out var comp)) // Получили компонент того, на кого действует эффект. + { + if (comp.LastEffect + DelayTime >= IoCManager.Resolve().CurTime) + comp.CurrentAddictedTime += (IoCManager.Resolve().CurTime - comp.LastEffect) * 2; + else + comp.CurrentAddictedTime += TimeSpan.FromSeconds(1) * TimeCoefficient * 2; + comp.RemaningTime = comp.ChangeAddictionTypeTime; + if (comp.TypeAddiction < 4) + comp.TypeAddiction += 1; + comp.LastEffect = IoCManager.Resolve().CurTime; + } + } +} diff --git a/Content.Shared/ADT/Addiction/AddictedComponent.cs b/Content.Shared/ADT/Addiction/AddictedComponent.cs new file mode 100644 index 00000000000..152b4f4aa78 --- /dev/null +++ b/Content.Shared/ADT/Addiction/AddictedComponent.cs @@ -0,0 +1,38 @@ +namespace Content.Shared.ADT.Addiction.AddictedComponent; + +/// +/// Компонент для базовых представителей рас. +/// Используется такие переменные для указания: RequiredTime, ChangeAddictionTypeTime. +/// +[RegisterComponent] +public sealed partial class AddictedComponent : Component +{ + /// + /// Время проведенное за употреблением - время, когда не употреблял. + /// + [DataField] public TimeSpan CurrentAddictedTime = TimeSpan.Zero; + /// + /// Время проведенное за употреблением - время, когда не употреблял. + /// + [DataField(required: true)] public TimeSpan ChangeAddictionTypeTime; + /// + /// Время оставшиеся до того, как сменится тип зависимости. + /// + [DataField] public TimeSpan RemaningTime; + /// + /// Время необходимое, чтобы стать зависимым. + /// + [DataField(required: true)] public TimeSpan RequiredTime; + /// + /// Собсна тип зависимости. 0 - легкая, без побочек, 1 - с небольшими побочками и т п, до 4 + /// + [DataField] public int TypeAddiction = 4; + /// + /// собсна сообщает нам имеет ли зависимость пациент + /// + [DataField] public bool Addicted = false; + /// + /// Собсна время, которое сообщает нам, время последнего воздействия эффекта на челика + /// + [DataField] public TimeSpan LastEffect = TimeSpan.Zero; +} diff --git a/Resources/Locale/ru-RU/ADT/reagents/addiction.ftl b/Resources/Locale/ru-RU/ADT/reagents/addiction.ftl new file mode 100644 index 00000000000..992f20407d9 --- /dev/null +++ b/Resources/Locale/ru-RU/ADT/reagents/addiction.ftl @@ -0,0 +1,6 @@ +addiction-message-1 = Вы чувсвуете привязанность к этому. +addiction-message-2 = Вы чувсвуете себя более спокойно. +addiction-message-3 = Вы чувсвуете себя более расслабленным. +addiction-message-4 = Вы привыкаете к этому. +addiction-message-5 = Вы чувсвуете себя удовлетворенно. +addiction-message-6 = У вас сформировывается зависимость к этому. diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index 4d6bc17b26c..8089b074f66 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -34,6 +34,9 @@ understands: - GalacticCommon - SolCommon + - type: Addicted + changeAddictionTypeTime: 50 + requiredTime: 50 - type: entity parent: BaseSpeciesDummy @@ -46,4 +49,4 @@ sizeMaps: 32: sprite: Mobs/Species/Human/displacement.rsi - state: jumpsuit-female \ No newline at end of file + state: jumpsuit-female diff --git a/Resources/Prototypes/Reagents/narcotics.yml b/Resources/Prototypes/Reagents/narcotics.yml index 8e73eb13955..43b8c251f6d 100644 --- a/Resources/Prototypes/Reagents/narcotics.yml +++ b/Resources/Prototypes/Reagents/narcotics.yml @@ -216,6 +216,23 @@ plantMetabolism: - !type:PlantAdjustHealth amount: -5 +#ADT start + metabolisms: + Narcotic: + effects: + - !type:PopupMessage + type: Local + messages: + - addiction-message-1 + - addiction-message-2 + - addiction-message-3 + - addiction-message-4 + - addiction-message-5 + - addiction-message-6 + - !type:AddictionEffect + timeCoefficient: 1 + quantityCoefficient: 2 +#ADT end # TODO: Replace these nonstandardized effects with generic brain damage - type: reagent