From eff8ec4e6474526a014bf3ca7cb3810bce85b36b Mon Sep 17 00:00:00 2001 From: SkaldetSkaeg Date: Tue, 14 Jan 2025 11:58:03 +0700 Subject: [PATCH] Cult_hotfix_4 (#2476) --- .../Bed/Cryostorage/CryostorageSystem.cs | 5 + .../Bed/Cryostorage/BeingCryoDeletedEvent.cs | 7 + .../SS220/CultYogg/Cultists/CultYoggSystem.cs | 2 +- .../CultYogg/MiGo/MiGoReplacementSystem.cs | 120 ------------------ .../SacraficialReplacementEvent.cs | 4 +- .../SacraficialReplacementSystem.cs | 46 ++++--- .../Rules/Components/CultYoggRuleComponent.cs | 2 - .../GameTicking/Rules/CultYoggRuleSystem.cs | 36 ++---- .../Systems/CultYoggSummonConditionSystem.cs | 13 +- .../SS220/Telepathy/TelepathySystem.cs | 8 +- .../Corruption/CultYoggCorruptedPrototype.cs | 6 + .../SharedCultYoggCorruptedSystem.cs | 11 +- .../CultYogg/Cultists/SharedCultYoggSystem.cs | 6 +- .../CultYoggSacrificialComponent.cs | 17 +++ .../CultYoggSacrificialMindComponent.cs | 15 --- .../ru-RU/ss220/cultYogg/cult_yogg_popups.ftl | 1 + .../cult_yogg_replacement_announces.ftl | 12 +- .../Entities/Objects/CultYogg/corruption.yml | 1 + .../Entities/Objects/CultYogg/cultstages.yml | 60 ++++++++- .../CultYogg/cultstages.rsi/antenna_moth.png | Bin 0 -> 522 bytes .../CultYogg/cultstages.rsi/back_arachnid.png | Bin 0 -> 1517 bytes .../CultYogg/cultstages.rsi/back_human.png | Bin 0 -> 1758 bytes .../Objects/CultYogg/cultstages.rsi/meta.json | 34 ++++- .../Objects/CultYogg/cultstages.rsi/moth.png | Bin 1441 -> 0 bytes .../cultstages.rsi/shrooms_arachnid.png | Bin 0 -> 772 bytes .../CultYogg/cultstages.rsi/shrooms_diona.png | Bin 0 -> 2147 bytes .../CultYogg/cultstages.rsi/shrooms_human.png | Bin 0 -> 764 bytes .../CultYogg/cultstages.rsi/shrooms_moth.png | Bin 0 -> 541 bytes .../CultYogg/cultstages.rsi/shrooms_vox.png | Bin 0 -> 1688 bytes .../CultYogg/cultstages.rsi/wings_moth.png | Bin 0 -> 2376 bytes 30 files changed, 202 insertions(+), 204 deletions(-) create mode 100644 Content.Server/SS220/Bed/Cryostorage/BeingCryoDeletedEvent.cs delete mode 100644 Content.Server/SS220/CultYogg/MiGo/MiGoReplacementSystem.cs delete mode 100644 Content.Shared/SS220/CultYogg/Sacraficials/CultYoggSacrificialMindComponent.cs create mode 100644 Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/antenna_moth.png create mode 100644 Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/back_arachnid.png create mode 100644 Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/back_human.png delete mode 100644 Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/moth.png create mode 100644 Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/shrooms_arachnid.png create mode 100644 Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/shrooms_diona.png create mode 100644 Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/shrooms_human.png create mode 100644 Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/shrooms_moth.png create mode 100644 Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/shrooms_vox.png create mode 100644 Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/wings_moth.png diff --git a/Content.Server/Bed/Cryostorage/CryostorageSystem.cs b/Content.Server/Bed/Cryostorage/CryostorageSystem.cs index 646f4694ffa54d..2edc4541f8f34d 100644 --- a/Content.Server/Bed/Cryostorage/CryostorageSystem.cs +++ b/Content.Server/Bed/Cryostorage/CryostorageSystem.cs @@ -31,6 +31,7 @@ using Robust.Shared.Utility; using Content.Shared.Roles; // SS220 Cryostorage ghost role fix using Robust.Shared.Prototypes; // SS220 Cryostorage ghost role fix +using Content.Server.SS220.Bed.Cryostorage; //SS220 Cult_hotfix_4 namespace Content.Server.Bed.Cryostorage; @@ -222,6 +223,10 @@ public void HandleEnterCryostorage(Entity ent, Ne } comp.AllowReEnteringBody = false; + //SS220 start Cult_hotfix_4 + var ev = new BeingCryoDeletedEvent(); + RaiseLocalEvent(ent, ref ev); + //SS220 end Cult_hotfix_4 _transform.SetParent(ent, PausedMap.Value); cryostorageComponent.StoredPlayers.Add(ent); Dirty(ent, comp); diff --git a/Content.Server/SS220/Bed/Cryostorage/BeingCryoDeletedEvent.cs b/Content.Server/SS220/Bed/Cryostorage/BeingCryoDeletedEvent.cs new file mode 100644 index 00000000000000..37dbd11ecc0464 --- /dev/null +++ b/Content.Server/SS220/Bed/Cryostorage/BeingCryoDeletedEvent.cs @@ -0,0 +1,7 @@ +namespace Content.Server.SS220.Bed.Cryostorage; + +/// +/// Raised before body will deleted by a cryostorages +/// +[ByRefEvent] +public readonly record struct BeingCryoDeletedEvent(); diff --git a/Content.Server/SS220/CultYogg/Cultists/CultYoggSystem.cs b/Content.Server/SS220/CultYogg/Cultists/CultYoggSystem.cs index 45051197938627..571da95579f0e7 100644 --- a/Content.Server/SS220/CultYogg/Cultists/CultYoggSystem.cs +++ b/Content.Server/SS220/CultYogg/Cultists/CultYoggSystem.cs @@ -104,7 +104,7 @@ private void UpdateStage(Entity entity, ref ChangeCultYoggSta if (_prototype.HasIndex(newMarkingId)) { - if (huAp.MarkingSet.Markings.TryGetValue(MarkingCategories.Tail, out var value)) + if (huAp.MarkingSet.Markings.TryGetValue(MarkingCategories.Special, out var value)) { entity.Comp.PreviousTail = value.FirstOrDefault(); value.Clear(); diff --git a/Content.Server/SS220/CultYogg/MiGo/MiGoReplacementSystem.cs b/Content.Server/SS220/CultYogg/MiGo/MiGoReplacementSystem.cs deleted file mode 100644 index 5ea55844a4c4ff..00000000000000 --- a/Content.Server/SS220/CultYogg/MiGo/MiGoReplacementSystem.cs +++ /dev/null @@ -1,120 +0,0 @@ -// © SS220, An EULA/CLA with a hosting restriction, full text: https://raw.githubusercontent.com/SerbiaStrong-220/space-station-14/master/CLA.txt -using Content.Shared.Mind; -using Content.Shared.Mind.Components; -using Content.Shared.Mobs; -using Content.Shared.Mobs.Systems; -using Content.Shared.SS220.CultYogg.MiGo; -using Content.Server.SS220.GameTicking.Rules; -using Robust.Shared.Player; -using Robust.Shared.Timing; - -namespace Content.Server.SS220.CultYogg.MiGo; - -public sealed partial class MiGoReplacementSystem : SharedMiGoSystem -{ - [Dependency] private readonly MobStateSystem _mobState = default!; - [Dependency] private readonly SharedMindSystem _mind = default!; - [Dependency] private readonly IGameTiming _timing = default!; - - public override void Initialize() //ToDo check for stupidity - { - SubscribeLocalEvent(OnMobState); - SubscribeLocalEvent(OnPlayerAttached); - SubscribeLocalEvent(OnPlayerDetached); - } - private void OnPlayerAttached(Entity ent, ref PlayerAttachedEvent args) - { - CheckTimerConditions(ent, ent.Comp); - } - private void OnPlayerDetached(Entity ent, ref PlayerDetachedEvent args) - { - CheckTimerConditions(ent, ent.Comp); - } - - /// - /// On death removes active comps and gives genetic damage to prevent cloning, reduce this to allow cloning. - /// - private void OnMobState(Entity ent, ref MobStateChangedEvent args) - { - CheckTimerConditions(ent, ent.Comp); - } - - public override void Update(float frameTime) - { - base.Update(frameTime); - - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var migoComp)) - { - //if timer is on then count it - if (!migoComp.ShouldBeCounted) - continue; - - if (migoComp.ReplacementEventTime == null) - continue; - - if (_timing.CurTime < migoComp.ReplacementEventTime) - continue; - - var meta = MetaData(uid); - - var ev = new CultYoggAnouncementEvent(uid, Loc.GetString("cult-yogg-migo-can-replace", ("name", meta.EntityName))); - RaiseLocalEvent(uid, ref ev, true); - migoComp.ShouldBeCounted = false; - } - } - - //Timer tweaking - private void StartTimer(MiGoComponent comp) - { - if (comp.ReplacementEventTime != null) - return; - - comp.ReplacementEventTime = _timing.CurTime + comp.BeforeReplacementCooldown; - comp.ShouldBeCounted = true; - } - - //Delete replacement marker from a MiGo - private void RemoveReplacement(EntityUid uid, MiGoComponent сomp) - { - сomp.ReplacementEventTime = null; - - var meta = MetaData(uid); - - var ev = new CultYoggAnouncementEvent(uid, Loc.GetString("cult-yogg-migo-cancel-replace", ("name", meta.EntityName))); - RaiseLocalEvent(uid, ref ev, true); - } - - private void CheckTimerConditions(EntityUid uid, MiGoComponent comp) - { - if (_mobState.IsDead(uid)) //if you are dead = timer - { - StartTimer(comp); - return; - } - /* - if (!TryComp(uid, out var mindComp) || mindComp == null) - return; - - if (mindComp.Mind == null) // if you ghosted = timer - { - StartTimer(comp); - return; - } - */ - - if (!_mind.TryGetMind(uid, out var mind, out var userMidComp) || (userMidComp == null)) - { - StartTimer(comp); - return; - } - - if (userMidComp.Session == null) // if you left = timer - { - StartTimer(comp); - return; - } - - RemoveReplacement(uid, comp); - } -} diff --git a/Content.Server/SS220/CultYogg/Sacraficials/SacraficialReplacementEvent.cs b/Content.Server/SS220/CultYogg/Sacraficials/SacraficialReplacementEvent.cs index 3cb0b1576a96a5..069dd1b4442c14 100644 --- a/Content.Server/SS220/CultYogg/Sacraficials/SacraficialReplacementEvent.cs +++ b/Content.Server/SS220/CultYogg/Sacraficials/SacraficialReplacementEvent.cs @@ -7,11 +7,9 @@ namespace Content.Server.SS220.CultYogg.Sacraficials; public sealed class SacraficialReplacementEvent : EntityEventArgs { public readonly EntityUid Entity; - public readonly NetUserId Player; - public SacraficialReplacementEvent(EntityUid entity, NetUserId player) + public SacraficialReplacementEvent(EntityUid entity) { Entity = entity; - Player = player; } } diff --git a/Content.Server/SS220/CultYogg/Sacraficials/SacraficialReplacementSystem.cs b/Content.Server/SS220/CultYogg/Sacraficials/SacraficialReplacementSystem.cs index ccb967302187b3..0b5935e2f434da 100644 --- a/Content.Server/SS220/CultYogg/Sacraficials/SacraficialReplacementSystem.cs +++ b/Content.Server/SS220/CultYogg/Sacraficials/SacraficialReplacementSystem.cs @@ -6,6 +6,7 @@ using Robust.Shared.Network; using Robust.Shared.Player; using Robust.Shared.Timing; +using Content.Server.SS220.Bed.Cryostorage; namespace Content.Server.SS220.CultYogg.Sacraficials; @@ -13,9 +14,10 @@ public sealed partial class SacraficialReplacementSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; + //dictionary of sacraficials uids and time when they left body by gibbing/ghosting/leaving anything - private Dictionary<(EntityUid, NetUserId), TimeSpan> _replaceSacrSchedule = new(); - private Dictionary<(EntityUid, NetUserId), TimeSpan> _announceSchedule = new(); + private Dictionary _replaceSacrSchedule = []; + private Dictionary _announceSchedule = []; //Count down the moment when sacraficial will be raplaced private TimeSpan _beforeReplacementCooldown = TimeSpan.FromSeconds(900); @@ -31,6 +33,7 @@ public override void Initialize() SubscribeLocalEvent(OnRemove); SubscribeLocalEvent(OnPlayerAttached); SubscribeLocalEvent(OnPlayerDetached); + SubscribeLocalEvent(OnCryoDeleted); } private void OnInit(Entity ent, ref ComponentInit args) { @@ -40,6 +43,9 @@ private void OnInit(Entity ent, ref ComponentInit { RaiseLocalEvent(uid, ref ev); } + + var ev2 = new CultYoggAnouncementEvent(ent, Loc.GetString("cult-yogg-sacraficial-was-picked", ("name", MetaData(ent).EntityName))); + RaiseLocalEvent(ent, ref ev, true); } private void OnRemove(Entity ent, ref ComponentRemove args) { @@ -52,19 +58,28 @@ private void OnRemove(Entity ent, ref ComponentRem } private void OnPlayerAttached(Entity ent, ref PlayerAttachedEvent args) { - _replaceSacrSchedule.Remove((ent, args.Player.UserId)); - _announceSchedule.Remove((ent, args.Player.UserId)); + _replaceSacrSchedule.Remove(ent); - var meta = MetaData(ent); + if(_announceSchedule.ContainsKey(ent))//if the announcement was not sent + { + _announceSchedule.Remove(ent); + return; + } - var ev = new CultYoggAnouncementEvent(ent, Loc.GetString("cult-yogg-sacraficial-cant-be-replaced", ("name", meta.EntityName))); + var ev = new CultYoggAnouncementEvent(ent, Loc.GetString("cult-yogg-sacraficial-cant-be-replaced", ("name", MetaData(ent).EntityName))); RaiseLocalEvent(ent, ref ev, true); } private void OnPlayerDetached(Entity ent, ref PlayerDetachedEvent args) { - _replaceSacrSchedule.Add((ent, args.Player.UserId), _timing.CurTime); - _announceSchedule.Add((ent, args.Player.UserId), _timing.CurTime); + _replaceSacrSchedule.Add(ent, _timing.CurTime + ent.Comp.ReplacementCooldown); + _announceSchedule.Add(ent, _timing.CurTime + ent.Comp.AnnounceReplacementCooldown); + } + + private void OnCryoDeleted(Entity ent, ref BeingCryoDeletedEvent args) + { + var ev = new SacraficialReplacementEvent(ent); + RaiseLocalEvent(ent, ref ev, true); } private void ReplacamantStatusAnnounce(EntityUid uid) @@ -72,9 +87,8 @@ private void ReplacamantStatusAnnounce(EntityUid uid) if (!TryComp(uid, out var comp)) return; - var meta = MetaData(uid); - - var ev = new CultYoggAnouncementEvent(uid, Loc.GetString("cult-yogg-sacraficial-may-be-replaced", ("name", meta.EntityName))); + var time = (comp.ReplacementCooldown.TotalSeconds - comp.AnnounceReplacementCooldown.TotalSeconds).ToString(); + var ev = new CultYoggAnouncementEvent(uid, Loc.GetString("cult-yogg-sacraficial-will-be-replaced", ("name", MetaData(uid).EntityName), ("time", time))); RaiseLocalEvent(uid, ref ev, true); } @@ -83,21 +97,21 @@ public override void Update(float frameTime) base.Update(frameTime); foreach (var pair in _replaceSacrSchedule) { - if (_timing.CurTime < pair.Value + _beforeReplacementCooldown) + if (_timing.CurTime < pair.Value) continue; - var ev = new SacraficialReplacementEvent(pair.Key.Item1, pair.Key.Item2); - RaiseLocalEvent(pair.Key.Item1, ref ev, true); + var ev = new SacraficialReplacementEvent(pair.Key); + RaiseLocalEvent(pair.Key, ref ev, true); _replaceSacrSchedule.Remove(pair.Key); } foreach (var pair in _announceSchedule)//it is stupid, but idk how to make it 1 time event without second System :( { - if (_timing.CurTime < pair.Value + _announceReplacementCooldown) + if (_timing.CurTime < pair.Value) continue; - ReplacamantStatusAnnounce(pair.Key.Item1); + ReplacamantStatusAnnounce(pair.Key); _announceSchedule.Remove(pair.Key); } diff --git a/Content.Server/SS220/GameTicking/Rules/Components/CultYoggRuleComponent.cs b/Content.Server/SS220/GameTicking/Rules/Components/CultYoggRuleComponent.cs index f5747b00b50b90..7860abcc239956 100644 --- a/Content.Server/SS220/GameTicking/Rules/Components/CultYoggRuleComponent.cs +++ b/Content.Server/SS220/GameTicking/Rules/Components/CultYoggRuleComponent.cs @@ -41,8 +41,6 @@ public sealed partial class CultYoggRuleComponent : Component /// /// Storage for a sacraficials /// - public readonly List SacraficialsList = []; - public readonly int[] TierOfSacraficials = [1, 2, 3];//trying to save tier in target, so they might be replaced with the same lvl target /// diff --git a/Content.Server/SS220/GameTicking/Rules/CultYoggRuleSystem.cs b/Content.Server/SS220/GameTicking/Rules/CultYoggRuleSystem.cs index 2d2975af411b2b..986ba4cb9b237d 100644 --- a/Content.Server/SS220/GameTicking/Rules/CultYoggRuleSystem.cs +++ b/Content.Server/SS220/GameTicking/Rules/CultYoggRuleSystem.cs @@ -193,9 +193,6 @@ private void SetSacraficials(CultYoggRuleComponent component) if (!_job.MindTryGetJob(mind, out var prototype)) continue; - if (HasComp(mind))//shouldn't be already a target - continue; - if (_sacraficialTiers[tier].Contains(prototype.ID)) allSuitable.Add(mind); } @@ -223,17 +220,11 @@ private void SetSacraficeTarget(CultYoggRuleComponent component, EntityUid? uid, if (mind.Session.AttachedEntity is null) return; - var meta = MetaData(uid.Value); - //_adminLogger.Add(LogType.EventRan, LogImpact.High, $"CultYogg person {meta.EntityName} where picked for a tier: {tier}"); - EnsureComp(uid.Value); //ToDo figure out do i need this? - var sacrComp = EnsureComp(mind.Session.AttachedEntity.Value); sacrComp.Tier = tier; - - component.SacraficialsList.Add(uid.Value); } private List GetAliveNoneCultHumans()//maybe add here sacraficials and cultists filter @@ -252,6 +243,9 @@ private List GetAliveNoneCultHumans()//maybe add here sacraficials an if (HasComp(uid)) continue; + if (HasComp(uid)) + continue; + // the player has to be alive if (_mobState.IsAlive(uid, mobState)) allHumans.Add(mc.Mind.Value); @@ -299,19 +293,8 @@ private void SacraficialReplacement(ref SacraficialReplacementEvent args) RemComp(args.Entity); - if (!_mind.TryGetMind(args.Player, out var mindUid, out var mind)) - return; - - if (mindUid == null) - return; - - var meta = MetaData(args.Entity); - var ev = new CultYoggAnouncementEvent(args.Entity, Loc.GetString("cult-yogg-migo-can-replace", ("name", meta.EntityName))); + var ev = new CultYoggAnouncementEvent(args.Entity, Loc.GetString("cult-yogg-sacraficial-was-replaced", ("name", MetaData(args.Entity).EntityName))); RaiseLocalEvent(args.Entity, ref ev, true); - - cultRuleComp.SacraficialsList.Remove(mindUid.Value); - - RemComp(mindUid.Value); } private void SetNewSacraficial(CultYoggRuleComponent comp, int tier) { @@ -442,15 +425,14 @@ public void DeMakeCultist(EntityUid uid, CultYoggRuleComponent component) private void SendCultAnounce(ref CultYoggAnouncementEvent args) { //ToDo refactor without spam - /* - GetCultGameRule(out var comp); - if (comp == null) + var ruleComp = GetCultGameRule(); + + if (ruleComp == null) return; - var ev = new TelepathyAnnouncementSendEvent(args.Message, comp.TelepathyChannel); - RaiseLocalEvent(ref ev); - */ + var ev = new TelepathyAnnouncementSendEvent(args.Message, ruleComp.TelepathyChannel); + RaiseLocalEvent(args.Entity, ev, true); } #endregion diff --git a/Content.Server/SS220/Objectives/Systems/CultYoggSummonConditionSystem.cs b/Content.Server/SS220/Objectives/Systems/CultYoggSummonConditionSystem.cs index ee77864cb3fcc0..d6bf76316d4e0b 100644 --- a/Content.Server/SS220/Objectives/Systems/CultYoggSummonConditionSystem.cs +++ b/Content.Server/SS220/Objectives/Systems/CultYoggSummonConditionSystem.cs @@ -19,6 +19,7 @@ public sealed class CultYoggSummonConditionSystem : EntitySystem [Dependency] private readonly CultYoggRuleSystem _cultRule = default!; [Dependency] private readonly MetaDataSystem _metaData = default!; [Dependency] private readonly SharedJobSystem _job = default!; + [Dependency] private readonly SharedMindSystem _minds = default!; public override void Initialize() { @@ -74,18 +75,20 @@ private void SacraficialsUpdate(Entity ent) var title = new StringBuilder(); title.AppendLine(Loc.GetString("objective-cult-yogg-sacrafice-start")); - var query = EntityQueryEnumerator(); + var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var _)) { var targetName = "Unknown"; - if (TryComp(uid, out var mind) && mind.CharacterName != null) + var jobTitle = "Unknown"; + if (_minds.TryGetMind(uid, out var mindId, out var mind) && mind.CharacterName != null) { targetName = mind.CharacterName; - } - var jobName = _job.MindTryGetJobName(uid); + if (_job.MindTryGetJobName(mindId, out var jobName)) + jobTitle = jobName; + } - title.AppendLine(Loc.GetString("objective-condition-cult-yogg-sacrafice-person", ("targetName", targetName), ("job", jobName))); + title.AppendLine(Loc.GetString("objective-condition-cult-yogg-sacrafice-person", ("targetName", targetName), ("job", jobTitle))); } _metaData.SetEntityName(ent, title.ToString()); diff --git a/Content.Server/SS220/Telepathy/TelepathySystem.cs b/Content.Server/SS220/Telepathy/TelepathySystem.cs index 7c29a49978a50a..8d03334d562428 100644 --- a/Content.Server/SS220/Telepathy/TelepathySystem.cs +++ b/Content.Server/SS220/Telepathy/TelepathySystem.cs @@ -32,7 +32,7 @@ public override void Initialize() SubscribeLocalEvent(OnRoundStart); SubscribeLocalEvent(OnTelepathySend); - SubscribeLocalEvent(OnTelepathyAnnouncementSend); + SubscribeLocalEvent(OnTelepathyAnnouncementSend); } private void OnRoundStart(RoundStartedEvent args) @@ -43,7 +43,7 @@ private void OnRoundStart(RoundStartedEvent args) } } - private void OnTelepathyAnnouncementSend(Entity ent, ref TelepathyAnnouncementSendEvent args) + private void OnTelepathyAnnouncementSend(TelepathyAnnouncementSendEvent args) { SendMessageToEveryoneWithRightChannel(args.TelepathyChannel, args.Message, null); } @@ -151,7 +151,9 @@ private string GetWrappedTelepathyMessage(string messageString, EntityUid? sende { return Loc.GetString( "chat-manager-send-telepathy-announce", - ("announce", FormattedMessage.EscapeText(messageString)) + ("announce", FormattedMessage.EscapeText(messageString)), + ("channel", $"\\[{Loc.GetString(telepathyChannelParameters.Name)}\\]"), + ("color", telepathyChannelParameters.Color) ); } diff --git a/Content.Shared/SS220/CultYogg/Corruption/CultYoggCorruptedPrototype.cs b/Content.Shared/SS220/CultYogg/Corruption/CultYoggCorruptedPrototype.cs index 04c00858676d5c..44626052f7765d 100644 --- a/Content.Shared/SS220/CultYogg/Corruption/CultYoggCorruptedPrototype.cs +++ b/Content.Shared/SS220/CultYogg/Corruption/CultYoggCorruptedPrototype.cs @@ -43,6 +43,12 @@ public sealed partial class CultYoggCorruptedPrototype : IPrototype [DataField("emptyStorage", required: false)] public bool EmptyStorage { get; private set; } + /// + /// At what stage is this corruption result available + /// + [DataField("avaliableOnStage", required: false)] + public int AvaliableOnStage = 0; + } [DataDefinition] diff --git a/Content.Shared/SS220/CultYogg/Corruption/SharedCultYoggCorruptedSystem.cs b/Content.Shared/SS220/CultYogg/Corruption/SharedCultYoggCorruptedSystem.cs index 78ded45a18c31e..692aa1e894bcf0 100644 --- a/Content.Shared/SS220/CultYogg/Corruption/SharedCultYoggCorruptedSystem.cs +++ b/Content.Shared/SS220/CultYogg/Corruption/SharedCultYoggCorruptedSystem.cs @@ -14,6 +14,8 @@ using Robust.Shared.Random; using Robust.Shared.Serialization; using System.Diagnostics.CodeAnalysis; +using Robust.Shared.GameObjects; +using Content.Shared.Popups; namespace Content.Shared.SS220.CultYogg.Corruption; @@ -33,6 +35,7 @@ public sealed class SharedCultYoggCorruptedSystem : EntitySystem [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedSoftDeleteSystem _softDeleteSystem = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; private readonly TimeSpan _corruptionDuration = TimeSpan.FromSeconds(1.8); private readonly Dictionary, CultYoggCorruptedPrototype> _recipesBySourcePrototypeId = []; @@ -138,10 +141,16 @@ public bool IsCorrupted(EntityUid entity) /// Flag indicating that the target entity is in hand /// Optional callback to fire when finished /// if corruption process has been started, otherwise - public bool TryCorruptContinuously(EntityUid user, EntityUid entity, bool isInHand, Action? callback = null) + public bool TryCorruptContinuously(EntityUid user, CultYoggComponent comp, EntityUid entity, bool isInHand, Action? callback = null) { if (!TryGetCorruptionRecipe(entity, out var recipe)) { + _popup.PopupClient(Loc.GetString("cult-yogg-corrupt-no-proto"), entity, user); + return false; + } + if (comp.CurrentStage < recipe.AvaliableOnStage) + { + _popup.PopupClient(Loc.GetString("cult-yogg-corrupt-too-low-tier"), entity, user); return false; } var e = new CultYoggCorruptDoAfterEvent(recipe, isInHand, callback); diff --git a/Content.Shared/SS220/CultYogg/Cultists/SharedCultYoggSystem.cs b/Content.Shared/SS220/CultYogg/Cultists/SharedCultYoggSystem.cs index 2f3ebbf1fdbd71..97b706f429730b 100644 --- a/Content.Shared/SS220/CultYogg/Cultists/SharedCultYoggSystem.cs +++ b/Content.Shared/SS220/CultYogg/Cultists/SharedCultYoggSystem.cs @@ -89,9 +89,8 @@ private void CorruptItemAction(Entity uid, ref CultYoggCorrup return; } - if (!_cultYoggCorruptedSystem.TryCorruptContinuously(uid, args.Target, false)) + if (!_cultYoggCorruptedSystem.TryCorruptContinuously(uid, uid.Comp, args.Target, false)) { - _popup.PopupClient(Loc.GetString("cult-yogg-corrupt-no-proto"), args.Target, uid); return; } args.Handled = true; @@ -120,9 +119,8 @@ private void CorruptItemInHandAction(Entity uid, ref CultYogg return; } - if (!_cultYoggCorruptedSystem.TryCorruptContinuously(uid, handItem.Value, true)) + if (!_cultYoggCorruptedSystem.TryCorruptContinuously(uid, uid.Comp, handItem.Value, true)) { - _popup.PopupClient(Loc.GetString("cult-yogg-corrupt-no-proto"), handItem.Value, uid); return; } args.Handled = true; diff --git a/Content.Shared/SS220/CultYogg/Sacraficials/CultYoggSacrificialComponent.cs b/Content.Shared/SS220/CultYogg/Sacraficials/CultYoggSacrificialComponent.cs index 7c668fe7218269..defd53f59ea257 100644 --- a/Content.Shared/SS220/CultYogg/Sacraficials/CultYoggSacrificialComponent.cs +++ b/Content.Shared/SS220/CultYogg/Sacraficials/CultYoggSacrificialComponent.cs @@ -21,6 +21,23 @@ public sealed partial class CultYoggSacrificialComponent : Component [DataField] public ProtoId StatusIcon { get; set; } = "CultYoggSacraficialTargetIcon"; + /// + /// Tier number required for replacement if it needed + /// + [DataField] public int Tier = 0;//initilize as max possible tier + + /// + /// Time required for announcement + /// + [DataField] + public TimeSpan AnnounceReplacementCooldown = TimeSpan.FromSeconds(60); + /// + /// Time required for replacement + /// + [DataField] + public TimeSpan ReplacementCooldown = TimeSpan.FromSeconds(300); + + public bool WasSacraficed = false; } diff --git a/Content.Shared/SS220/CultYogg/Sacraficials/CultYoggSacrificialMindComponent.cs b/Content.Shared/SS220/CultYogg/Sacraficials/CultYoggSacrificialMindComponent.cs deleted file mode 100644 index 18988d6ae61a61..00000000000000 --- a/Content.Shared/SS220/CultYogg/Sacraficials/CultYoggSacrificialMindComponent.cs +++ /dev/null @@ -1,15 +0,0 @@ -// © SS220, An EULA/CLA with a hosting restriction, full text: https://raw.githubusercontent.com/SerbiaStrong-220/space-station-14/master/CLA.txt - -using Content.Shared.StatusIcon; -using Robust.Shared.GameStates; -using Robust.Shared.Prototypes; - -namespace Content.Shared.SS220.CultYogg.Sacraficials; - -/// -/// Used to markup cult's sacrificials minds -/// -[RegisterComponent, NetworkedComponent] -public sealed partial class CultYoggSacrificialMindComponent : Component -{ -} diff --git a/Resources/Locale/ru-RU/ss220/cultYogg/cult_yogg_popups.ftl b/Resources/Locale/ru-RU/ss220/cultYogg/cult_yogg_popups.ftl index 7c59c9d2743c1d..cadcd4fc4c8794 100644 --- a/Resources/Locale/ru-RU/ss220/cultYogg/cult_yogg_popups.ftl +++ b/Resources/Locale/ru-RU/ss220/cultYogg/cult_yogg_popups.ftl @@ -1,5 +1,6 @@ cult-yogg-corrupt-no-proto = Предмет не имеет истинной формы cult-yogg-corrupt-already-corrupted = Предмет уже обрел истинную форму +cult-yogg-corrupt-too-low-tier = Искажения будет доступно при большем числе принесенных жертв cult-yogg-no-mind = Оболочка не имеет разума cult-yogg-enslave-verb = [italic]Поработить[/italic] diff --git a/Resources/Locale/ru-RU/ss220/cultYogg/cult_yogg_replacement_announces.ftl b/Resources/Locale/ru-RU/ss220/cultYogg/cult_yogg_replacement_announces.ftl index 8760b5467c99de..2c9b8a6f983be2 100644 --- a/Resources/Locale/ru-RU/ss220/cultYogg/cult_yogg_replacement_announces.ftl +++ b/Resources/Locale/ru-RU/ss220/cultYogg/cult_yogg_replacement_announces.ftl @@ -1,5 +1,7 @@ -cult-yogg-migo-can-replace = Ми-Го {$name}" утерян, верните его или замените -cult-yogg-migo-cancel-replace = Ми-Го "{$name}" вернулся к служению -cult-yogg-sacraficial-replaced = Жертва "{$name}" была заменена -cult-yogg-sacraficial-may-be-replaced = Жертва "{$name}" потеряла душу, в скором времени она будет заменена -cult-yogg-sacraficial-cant-be-replaced = Жертва "{$name}" смогла вернуться к сознанию, и снова подходит как жертва +cult-yogg-migo-can-replace = Ми-Го {$name} утерян, верните его или замените +cult-yogg-migo-cancel-replace = Ми-Го {$name} вернулся к служению +cult-yogg-sacraficial-replaced = Жертва {$name} была заменена +cult-yogg-sacraficial-will-be-replaced = Жертва {$name} потеряла душу, через {$time} секунд она будет заменена +cult-yogg-sacraficial-cant-be-replaced = Жертва {$name} смогла вернуться к сознанию, и снова подходит как жертва +cult-yogg-sacraficial-was-replaced = Жертва {$name} больше не доступна для жертвоприношения и была заменена +cult-yogg-sacraficial-was-picked = Жертвой был выбран {$name} diff --git a/Resources/Prototypes/SS220/Entities/Objects/CultYogg/corruption.yml b/Resources/Prototypes/SS220/Entities/Objects/CultYogg/corruption.yml index 99e2b4acc573a7..ef11a5a673f7e4 100644 --- a/Resources/Prototypes/SS220/Entities/Objects/CultYogg/corruption.yml +++ b/Resources/Prototypes/SS220/Entities/Objects/CultYogg/corruption.yml @@ -271,6 +271,7 @@ parentPrototypeId: ClothingOuterHardsuitBase result: ClothingOuterHardsuitCultYogg corruptionReverseEffect: ExorcismUncorruptEffect + avaliableOnStage: 2 # Hardsuit end # Backpack beginning diff --git a/Resources/Prototypes/SS220/Entities/Objects/CultYogg/cultstages.yml b/Resources/Prototypes/SS220/Entities/Objects/CultYogg/cultstages.yml index 6e307d6b94e1e2..54629cb0403911 100644 --- a/Resources/Prototypes/SS220/Entities/Objects/CultYogg/cultstages.yml +++ b/Resources/Prototypes/SS220/Entities/Objects/CultYogg/cultstages.yml @@ -16,4 +16,62 @@ hidden: true sprites: - sprite: SS220/Objects/CultYogg/cultstages.rsi - state: moth + state: antenna_moth + - sprite: SS220/Objects/CultYogg/cultstages.rsi + state: wings_moth + - sprite: SS220/Objects/CultYogg/cultstages.rsi + state: shrooms_moth + +- type: marking + id: CultStage-Arachnid + bodyPart: Special + markingCategory: Special + sprites: + - sprite: SS220/Objects/CultYogg/cultstages.rsi + state: back_arachnid + - sprite: SS220/Objects/CultYogg/cultstages.rsi + state: shrooms_arachnid + +- type: marking + id: CultStage-Human + bodyPart: Special + markingCategory: Special + sprites: + - sprite: SS220/Objects/CultYogg/cultstages.rsi + state: back_human + - sprite: SS220/Objects/CultYogg/cultstages.rsi + state: shrooms_human + +- type: marking + id: CultStage-Diona + bodyPart: Special + markingCategory: Special + sprites: + - sprite: SS220/Objects/CultYogg/cultstages.rsi + state: shrooms_diona + +- type: marking + id: CultStage-Vox + bodyPart: Special + markingCategory: Special + sprites: + - sprite: SS220/Objects/CultYogg/cultstages.rsi + state: shrooms_vox + +- type: marking + id: CultStage-SlimePerson + bodyPart: Special + markingCategory: Special + sprites: + - sprite: SS220/Objects/CultYogg/cultstages.rsi + state: shrooms_diona + +- type: marking + id: CultStage-Reptilian + bodyPart: Special + markingCategory: Special + sprites: + - sprite: SS220/Objects/CultYogg/cultstages.rsi + state: back_human + - sprite: SS220/Objects/CultYogg/cultstages.rsi + state: shrooms_human diff --git a/Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/antenna_moth.png b/Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/antenna_moth.png new file mode 100644 index 0000000000000000000000000000000000000000..26d54567cfa2b816d85f4a56f9f2c35c6e75d62e GIT binary patch literal 522 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 AY5)KL literal 0 HcmV?d00001 diff --git a/Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/meta.json b/Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/meta.json index a38e9ee08b6e6d..bda023b8cbd670 100644 --- a/Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/meta.json +++ b/Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/meta.json @@ -12,7 +12,39 @@ "directions": 4 }, { - "name": "moth", + "name": "antenna_moth", + "directions": 4 + }, + { + "name": "wings_moth", + "directions": 4 + }, + { + "name": "shrooms_moth", + "directions": 4 + }, + { + "name": "back_arachnid", + "directions": 4 + }, + { + "name": "shrooms_arachnid", + "directions": 4 + }, + { + "name": "back_human", + "directions": 4 + }, + { + "name": "shrooms_human", + "directions": 4 + }, + { + "name": "shrooms_diona", + "directions": 4 + }, + { + "name": "shrooms_vox", "directions": 4 } ] diff --git a/Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/moth.png b/Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/moth.png deleted file mode 100644 index 2c76ed90b699e7143f1122123a678f937845cc44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1441 zcma)+do&XY9LGn)>}V(q$?K9Vk8m+IjA#_Q2zkuww33p?^&EK&wJVP$vFVIL2q9y+ z<EbI7Dg%lnqD(v=qNPe~{xA@YxELiR%hwqB5S--m^u77Mz`Q<4 zHI=?FaNs@UonVo`rT;*v#YKoxg@PCg;i6Q+V?zDVVADv$TY+D+%mVtUN=SBg=*>em zw6@lsxJ0fBT%A!#n%vv!XQJ-(tTrVubBW}|AtcW}?k@KNS0xeTkkR`&cW;;sd2zUM z%E#MZxd=ujW4&f-AelXHqDkM0Oi3$wk6LW8LBdx3y>Ra6T;THWMve!_F~4SJu8=Nd z=^`K%E(w?9`)4<-%22;nsepjYVziADll~k<_O6Is|)CZ(uHGAuQS&vSsUVdcP3#%AqWoyAsX{DJ$60 z0n-?S_43|>;bCX_*|&P;J)w&))fuC3lG0{X;wstqikMLFNC1nAr!lHc;2UiP4U*lR z98O3Sm<4Bn@ysP)_gCcRJkIL-$GWPtlnjfo?}D8^&u3@8F>v}Kcb^otFwyLH?cBeH z;Q}Xl{C2)cmIkrWeBJgKIyFLesUui0s^9lwO*O?@(<){o^GAFBbRu(p-89uTjRVWM zGs|;}@-QV(gQ)l=x26Lcj-rMNh+*gze<*!Jo9rhv3kpr94o=aZ2+-Q|(R%rQ(ovF0srrNn}9J(qY z-rh&f;oti6rj2>(MOhXoE(NW z3d=D)Ajm|12~=?Xp069kMOY_q{RSp}xaMrbp96=-c1ji7wXEf!nQ~v8PASE?J_#j! zOF+2YhZ59Fq5I=imx@nIGxDSXEzFRCZeWG8TU@?wvDs47%@eBe!^BydmbRyjj9C(F z)H1M+*XrGa+SdG~C?A~?Ydi*3pc?5c;$!O{SJKyTy22Lh3;KH>!D`hYRH!!RqjLN? z576 rc=x1|xQsyz1s(|&a^2J6hLaNjcGN*f`FSH(@_xd>4r5zq6Oj539!R&I diff --git a/Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/shrooms_arachnid.png b/Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/shrooms_arachnid.png new file mode 100644 index 0000000000000000000000000000000000000000..78d908b530e6924d1d15e45c04a6984652ba55d3 GIT binary patch literal 772 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 az$><8@%KryrZ)hiox#)9&t;ucLK6TVxZjij literal 0 HcmV?d00001 diff --git a/Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/shrooms_vox.png b/Resources/Textures/SS220/Objects/CultYogg/cultstages.rsi/shrooms_vox.png new file mode 100644 index 0000000000000000000000000000000000000000..e2ce0fac6e09d48b2a34c112630d9701c1530f75 GIT binary patch literal 1688 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 uDWz^jtL?95K6H}26?(N~wmi^89{3l>0`j=Vicb�