diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs index 3e9a7ce1c696..f27344ce599d 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs @@ -39,7 +39,7 @@ public sealed partial class AdminVerbSystem //SS200 CultYogg start [ValidatePrototypeId] - private const string DefaultCultYoggRule = "CultYoggRule"; + private const string DefaultCultYoggRule = "CultYoggRuleMidPop"; //SS220 CultYogg end // All antag verbs have names so invokeverb works. diff --git a/Content.Server/GameTicking/Rules/SecretRuleSystem.cs b/Content.Server/GameTicking/Rules/SecretRuleSystem.cs index f52c7b1f7c4e..dbda1f2a051d 100644 --- a/Content.Server/GameTicking/Rules/SecretRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/SecretRuleSystem.cs @@ -79,6 +79,27 @@ private bool TryPickPreset(ProtoId weights, [NotNullWhe var options = _prototypeManager.Index(weights).Weights.ShallowClone(); var players = GameTicker.ReadyPlayerCount(); + // SS220 Cult Yogg begin + var optionsToRemove = new HashSet(); + foreach ((var presetId, _) in options) + { + if (_prototypeManager.TryIndex(presetId, out var presetToCheck) + && players >= (presetToCheck.MinPlayers ?? 0) + && players <= (presetToCheck.MaxPlayers ?? int.MaxValue)) + { + // Passed + continue; + } + + // Will be removed + optionsToRemove.Add(presetId); + } + foreach (var presetId in optionsToRemove) + { + options.Remove(presetId); + } + // SS220 Cult Yogg end + GamePresetPrototype? selectedPreset = null; var sum = options.Values.Sum(); while (options.Count > 0) diff --git a/Content.Server/SS220/CultYogg/Altar/CultYoggAltarSystem.cs b/Content.Server/SS220/CultYogg/Altar/CultYoggAltarSystem.cs index bf6fbf3343a9..2d0b92518a9e 100644 --- a/Content.Server/SS220/CultYogg/Altar/CultYoggAltarSystem.cs +++ b/Content.Server/SS220/CultYogg/Altar/CultYoggAltarSystem.cs @@ -39,23 +39,11 @@ private void OnDoAfter(Entity ent, ref MiGoSacrificeDoAf RemComp(ent); RemComp(ent); - int stage = 0; - var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out _, out var cultRule)) { var ev = new CultYoggSacrificedTargetEvent(ent); RaiseLocalEvent(uid, ref ev, true); - - stage = cultRule.AmountOfSacrifices; - } - - //sending all cultists updating stage event - var queryCultists = EntityQueryEnumerator(); //ToDo ask if this code is ok - while (queryCultists.MoveNext(out var uid, out _)) - { - var ev = new ChangeCultYoggStageEvent(stage); - RaiseLocalEvent(uid, ref ev, true); } //send cooldown to a MiGo sacrifice action diff --git a/Content.Server/SS220/CultYogg/Cultists/CultYoggSystem.cs b/Content.Server/SS220/CultYogg/Cultists/CultYoggSystem.cs index 571da95579f0..795b923628f5 100644 --- a/Content.Server/SS220/CultYogg/Cultists/CultYoggSystem.cs +++ b/Content.Server/SS220/CultYogg/Cultists/CultYoggSystem.cs @@ -73,13 +73,13 @@ private void UpdateStage(Entity entity, ref ChangeCultYoggSta switch (args.Stage) { - case 0: + case CultYoggStage.Initial: return; - case 1: + case CultYoggStage.Reveal: entity.Comp.PreviousEyeColor = new Color(huAp.EyeColor.R, huAp.EyeColor.G, huAp.EyeColor.B, huAp.EyeColor.A); huAp.EyeColor = Color.Green; break; - case 2: + case CultYoggStage.Alarm: if (_prototype.HasIndex(CultDefaultMarking)) { if (!huAp.MarkingSet.Markings.ContainsKey(MarkingCategories.Special)) @@ -117,7 +117,7 @@ private void UpdateStage(Entity entity, ref ChangeCultYoggSta //Log.Error($"{newMarkingId} marking doesn't exist"); } break; - case 3: + case CultYoggStage.God: if (!TryComp(entity, out var mobstate)) return; diff --git a/Content.Server/SS220/GameTicking/Rules/Components/CultYoggRuleComponent.cs b/Content.Server/SS220/GameTicking/Rules/Components/CultYoggRuleComponent.cs index 7860abcc2399..5b3d88aabc87 100644 --- a/Content.Server/SS220/GameTicking/Rules/Components/CultYoggRuleComponent.cs +++ b/Content.Server/SS220/GameTicking/Rules/Components/CultYoggRuleComponent.cs @@ -1,6 +1,9 @@ // © 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.FixedPoint; using Content.Shared.NPC.Prototypes; +using Content.Shared.SS220.CultYogg.Altar; +using Content.Shared.SS220.CultYogg.Cultists; using Robust.Shared.Audio; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; @@ -11,17 +14,11 @@ namespace Content.Server.SS220.GameTicking.Rules.Components; [RegisterComponent, Access(typeof(CultYoggRuleSystem))] public sealed partial class CultYoggRuleComponent : Component { - /// - /// General requirements - /// [DataField] - public int AmountOfSacrificesToGodSummon = 3; - - [DataField] - public int AmountOfSacrificesToWarningAnouncement = 2; + public int ReqAmountOfMiGo = 3; [DataField] - public int ReqAmountOfMiGo = 3; + public Dictionary Stages { get; private set; } = new(); /// /// General requirements @@ -33,6 +30,14 @@ public sealed partial class CultYoggRuleComponent : Component public bool SacraficialsWerePicked = false;//buffer to prevent multiple generations + /// + /// Where previous sacrificial were performed + /// + public Entity? LastSacrificialAltar = null; + + public int InitialCrewCount; + public int TotalCultistsConverted; + /// /// Storages for an endgame screen title /// @@ -90,6 +95,11 @@ public enum SelectionState /// public SelectionState SelectionStatus = SelectionState.WaitingForSpawn; + /// + /// Current cult gameplay stage + /// + public CultYoggStage Stage = CultYoggStage.Initial; + /// /// When should cultists be selected and the announcement made /// @@ -102,3 +112,19 @@ public enum SelectionState [DataField] public SoundSpecifier GreetSoundNotification = new SoundPathSpecifier("/Audio/SS220/Ambience/Antag/cult_yogg_start.ogg"); } + +[DataDefinition] +public sealed partial class CultYoggStageDefinition +{ + /// + /// Amount of sacrifices that will progress cult to this stage. + /// + [DataField] + public int? SacrificesRequired; + /// + /// Fraction of total crew converted to cultists that will progress cult to this stage. + /// + [DataField] + public FixedPoint2? CultistsFractionRequired; +} + diff --git a/Content.Server/SS220/GameTicking/Rules/CultYoggRuleSystem.cs b/Content.Server/SS220/GameTicking/Rules/CultYoggRuleSystem.cs index 986ba4cb9b23..b2dbda9041f3 100644 --- a/Content.Server/SS220/GameTicking/Rules/CultYoggRuleSystem.cs +++ b/Content.Server/SS220/GameTicking/Rules/CultYoggRuleSystem.cs @@ -43,6 +43,10 @@ using Content.Server.EUI; using Robust.Server.Player; using Content.Server.SS220.CultYogg.DeCultReminder; +using System.Diagnostics.CodeAnalysis; +using Content.Shared.SS220.CultYogg.Altar; +using Content.Server.Station.Components; +using Content.Server.Chat.Managers; namespace Content.Server.SS220.GameTicking.Rules; @@ -58,6 +62,7 @@ public sealed class CultYoggRuleSystem : GameRuleSystem [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly StationSystem _station = default!; [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly IChatManager _chatManager = default!; [Dependency] private readonly RoundEndSystem _roundEnd = default!; [Dependency] private readonly SharedRoleSystem _role = default!; [Dependency] private readonly NavMapSystem _navMap = default!; @@ -86,6 +91,11 @@ public override void Initialize() } #region Sacreficials picking + protected override void Added(EntityUid uid, CultYoggRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args) + { + component.InitialCrewCount = GameTicker.ReadyPlayerCount(); + } + /// /// Used to generate sacraficials at the start of the gamerule /// @@ -256,24 +266,17 @@ private List GetAliveNoneCultHumans()//maybe add here sacraficials an #endregion #region Sacraficials Events - private void OnTargetSacrificed(Entity entity, ref CultYoggSacrificedTargetEvent args) + private void OnTargetSacrificed(Entity rule, ref CultYoggSacrificedTargetEvent args) { - var (_, comp) = entity; - var (altar, altarComp) = args.Altar; - comp.AmountOfSacrifices++; + rule.Comp.LastSacrificialAltar = args.Altar; + rule.Comp.AmountOfSacrifices++; - if (comp.AmountOfSacrifices == comp.AmountOfSacrificesToWarningAnouncement) + while (TryGetNextStage(rule, out var nextStage, out var nextStageDefinition) + && nextStageDefinition.SacrificesRequired is { } sacrificesRequired + && sacrificesRequired <= rule.Comp.AmountOfSacrifices) { - foreach (var station in _station.GetStations()) - { - _chat.DispatchStationAnnouncement(station, Loc.GetString("cult-yogg-cultists-warning"), playSound: false, colorOverride: Color.Red); - _audio.PlayGlobal("/Audio/Misc/notice1.ogg", Filter.Broadcast(), true); - _alertLevel.SetLevel(station, "gamma", true, true, true); - } + ProgressToStage(rule, nextStage); } - - if (comp.AmountOfSacrifices == comp.AmountOfSacrificesToGodSummon) - SummonGod(entity, Transform(altar).Coordinates); } private void SacraficialReplacement(ref SacraficialReplacementEvent args) @@ -317,12 +320,10 @@ private void MiGoEnslave(ref CultYoggEnslavedEvent args) if (args.Target == null) return; - var cultRuleComp = GetCultGameRule(); - - if (cultRuleComp == null) + if (!TryGetCultGameRule(out var rule)) return; - MakeCultist(args.Target.Value, cultRuleComp, false); + MakeCultist(args.Target.Value, rule, false); } #endregion @@ -332,40 +333,51 @@ private void AfterEntitySelected(Entity ent, ref AfterAnt MakeCultist(args.EntityUid, ent); } - public void MakeCultist(EntityUid uid, CultYoggRuleComponent comp, bool initial = true) + public void MakeCultist(EntityUid uid, Entity rule, bool initial = true) { //Grab the mind if it wasnt provided if (!_mind.TryGetMind(uid, out var mindId, out var mindComp)) return; - _antag.SendBriefing(uid, Loc.GetString("cult-yogg-role-greeting"), null, comp.GreetSoundNotification); + _antag.SendBriefing(uid, Loc.GetString("cult-yogg-role-greeting"), null, rule.Comp.GreetSoundNotification); if (initial) - comp.InitialCultistMinds.Add(mindId); + rule.Comp.InitialCultistMinds.Add(mindId); // Change the faction - _npcFaction.RemoveFaction(uid, comp.NanoTrasenFaction, false); - _npcFaction.AddFaction(uid, comp.CultYoggFaction); + _npcFaction.RemoveFaction(uid, rule.Comp.NanoTrasenFaction, false); + _npcFaction.AddFaction(uid, rule.Comp.CultYoggFaction); EnsureComp(uid); //update stage cause it might be midstage - var ev = new ChangeCultYoggStageEvent(comp.AmountOfSacrifices); + var ev = new ChangeCultYoggStageEvent(rule.Comp.Stage); RaiseLocalEvent(uid, ref ev); //Add telepathy var telepathy = EnsureComp(uid); telepathy.CanSend = true;//we are allowing it cause testing - telepathy.TelepathyChannelPrototype = comp.TelepathyChannel; + telepathy.TelepathyChannelPrototype = rule.Comp.TelepathyChannel; EnsureComp(uid);//icons of cultists and sacraficials EnsureComp(uid);//they are practically mushrooms - foreach (var obj in comp.ListofObjectives) + foreach (var obj in rule.Comp.ListofObjectives) { - _role.MindAddRole(mindId, comp.MindCultYoggAntagId, mindComp, true); + _role.MindAddRole(mindId, rule.Comp.MindCultYoggAntagId, mindComp, true); var objective = _mind.TryAddObjective(mindId, mindComp, obj); } + + rule.Comp.TotalCultistsConverted++; + + var amountOfCultists = rule.Comp.TotalCultistsConverted; + var totalCrew = rule.Comp.InitialCrewCount; + while (TryGetNextStage(rule, out var nextStage, out var nextStageDefinition) + && nextStageDefinition.CultistsFractionRequired is { } cultistsFractionRequired + && cultistsFractionRequired * totalCrew <= amountOfCultists) + { + ProgressToStage(rule, nextStage); + } } #endregion @@ -456,6 +468,42 @@ private void SummonGod(Entity entity, EntityCoordinates c comp.Summoned = true;//Win EndText } + + private EntityCoordinates FindGodSummonCoordinates(Entity rule) + { + if (rule.Comp.LastSacrificialAltar is { } lastAltar + && Exists(lastAltar)) + { + return Transform(lastAltar).Coordinates; + } + + var queryAltar = EntityQueryEnumerator(); + while (queryAltar.MoveNext(out var uid, out _)) + { + return Transform(uid).Coordinates; + } + + var queryMiGo = EntityQueryEnumerator(); + while (queryMiGo.MoveNext(out var uid, out _)) + { + return Transform(uid).Coordinates; + } + + var queryCultists = EntityQueryEnumerator(); + while (queryCultists.MoveNext(out var uid, out _)) + { + return Transform(uid).Coordinates; + } + + foreach (var station in _station.GetStations()) + { + if (_station.GetLargestGrid(Comp(station)) is { } grid) + return Transform(grid).Coordinates; + } + + // At this point we are probably on the empty map so I don't know what to do. + return EntityCoordinates.Invalid; + } #endregion #region EndText @@ -521,17 +569,77 @@ private float GetCultistsFraction() } #endregion + #region Stages + private bool TryGetNextStage(Entity rule, + out CultYoggStage nextStage, [NotNullWhen(true)] out CultYoggStageDefinition? stageDefinition) + { + stageDefinition = null; + + nextStage = rule.Comp.Stage + 1; + if (!rule.Comp.Stages.TryGetValue(nextStage, out stageDefinition)) + return false; + + return true; + } + + private void ProgressToStage(Entity rule, CultYoggStage stage) + { + // Only forward + if (stage <= rule.Comp.Stage) + return; + + rule.Comp.Stage = stage; + + _chatManager.SendAdminAlert(Loc.GetString("cult-yogg-stage-admin-alert", ("stage", stage))); + + DoStageEffects(rule, stage); + + var changeStageEvent = new ChangeCultYoggStageEvent(stage); + RaiseLocalEvent(ref changeStageEvent); + var queryCultists = EntityQueryEnumerator(); + while (queryCultists.MoveNext(out var uid, out _)) + { + RaiseLocalEvent(uid, ref changeStageEvent); + } + } + + private void DoStageEffects(Entity rule, CultYoggStage stage) + { + if (stage is CultYoggStage.Alarm) + { + foreach (var station in _station.GetStations()) + { + _chat.DispatchStationAnnouncement(station, Loc.GetString("cult-yogg-cultists-warning"), playSound: false, colorOverride: Color.Red); + _audio.PlayGlobal("/Audio/Misc/notice1.ogg", Filter.Broadcast(), true); + _alertLevel.SetLevel(station, "gamma", true, true, true); + } + } + else if (stage is CultYoggStage.God) + { + SummonGod(rule, FindGodSummonCoordinates(rule)); + } + } + #endregion + public CultYoggRuleComponent? GetCultGameRule() { - CultYoggRuleComponent? comp = null; + if (TryGetCultGameRule(out var rule)) + return rule.Comp; + return null; + } + + public bool TryGetCultGameRule(out Entity rule) + { + rule = default; var query = QueryAllRules(); - while (query.MoveNext(out _, out var cultComp, out _)) + while (query.MoveNext(out var uid, out var cultComp, out _)) { - comp = cultComp; + rule = (uid, cultComp); + return true; } - return comp; + return false; } } diff --git a/Content.Server/SS220/Objectives/Systems/CultYoggSummonConditionSystem.cs b/Content.Server/SS220/Objectives/Systems/CultYoggSummonConditionSystem.cs index d6bf76316d4e..bb611bfbc229 100644 --- a/Content.Server/SS220/Objectives/Systems/CultYoggSummonConditionSystem.cs +++ b/Content.Server/SS220/Objectives/Systems/CultYoggSummonConditionSystem.cs @@ -68,8 +68,16 @@ private void TaskNumberUpdate(Entity ent) if (ruleComp is null) return; - ent.Comp.reqSacrAmount = ruleComp.AmountOfSacrificesToGodSummon; + var sacrificesRequired = 0; + foreach ((_, var stageDefinition) in ruleComp.Stages) + { + if (stageDefinition.SacrificesRequired is { } stageSacrifices) + sacrificesRequired = stageSacrifices; + } + + ent.Comp.reqSacrAmount = sacrificesRequired; } + private void SacraficialsUpdate(Entity ent) { var title = new StringBuilder(); diff --git a/Content.Shared/SS220/CultYogg/Corruption/CultYoggCorruptedPrototype.cs b/Content.Shared/SS220/CultYogg/Corruption/CultYoggCorruptedPrototype.cs index 44626052f776..411eb11ab4ce 100644 --- a/Content.Shared/SS220/CultYogg/Corruption/CultYoggCorruptedPrototype.cs +++ b/Content.Shared/SS220/CultYogg/Corruption/CultYoggCorruptedPrototype.cs @@ -1,4 +1,5 @@ // © 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.SS220.CultYogg.Cultists; using Content.Shared.Stacks; using Content.Shared.Tag; using Robust.Shared.Prototypes; @@ -47,7 +48,7 @@ public sealed partial class CultYoggCorruptedPrototype : IPrototype /// At what stage is this corruption result available /// [DataField("avaliableOnStage", required: false)] - public int AvaliableOnStage = 0; + public CultYoggStage AvaliableOnStage = CultYoggStage.Initial; } diff --git a/Content.Shared/SS220/CultYogg/Cultists/CultYoggComponent.cs b/Content.Shared/SS220/CultYogg/Cultists/CultYoggComponent.cs index 319301e6900d..835e37245321 100644 --- a/Content.Shared/SS220/CultYogg/Cultists/CultYoggComponent.cs +++ b/Content.Shared/SS220/CultYogg/Cultists/CultYoggComponent.cs @@ -10,6 +10,9 @@ namespace Content.Shared.SS220.CultYogg.Cultists; +/// +/// Component of the Cult Yogg cultist. +/// [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] [Access(typeof(SharedCultYoggSystem), Friend = AccessPermissions.ReadWriteExecute, Other = AccessPermissions.Read)] public sealed partial class CultYoggComponent : Component @@ -95,7 +98,7 @@ public sealed partial class CultYoggComponent : Component [ViewVariables(VVAccess.ReadWrite)] [DataField, AutoNetworkedField] - public int CurrentStage = 0; + public CultYoggStage CurrentStage = CultYoggStage.Initial; #endregion /// diff --git a/Content.Shared/SS220/CultYogg/Cultists/CultYoggEvents.cs b/Content.Shared/SS220/CultYogg/Cultists/CultYoggEvents.cs index db654b9d7bdb..3c39770837ec 100644 --- a/Content.Shared/SS220/CultYogg/Cultists/CultYoggEvents.cs +++ b/Content.Shared/SS220/CultYogg/Cultists/CultYoggEvents.cs @@ -9,8 +9,9 @@ namespace Content.Shared.SS220.CultYogg.Cultists; [ByRefEvent, Serializable] public sealed class ChangeCultYoggStageEvent : EntityEventArgs { - public int Stage; - public ChangeCultYoggStageEvent(int stage) + public CultYoggStage Stage; + + public ChangeCultYoggStageEvent(CultYoggStage stage) { Stage = stage; } diff --git a/Content.Shared/SS220/CultYogg/Cultists/CultYoggStage.cs b/Content.Shared/SS220/CultYogg/Cultists/CultYoggStage.cs new file mode 100644 index 000000000000..150424e91f87 --- /dev/null +++ b/Content.Shared/SS220/CultYogg/Cultists/CultYoggStage.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.SS220.CultYogg.Cultists; + +// Please keep this sequential (0, 1, 2, etc) because +1 is used to determine next stage. +[Serializable, NetSerializable] +public enum CultYoggStage +{ + Initial, + Reveal, + Alarm, + God, +} diff --git a/Content.Shared/SS220/CultYogg/Cultists/SharedCultYoggSystem.cs b/Content.Shared/SS220/CultYogg/Cultists/SharedCultYoggSystem.cs index 97b706f42973..34169de24c5a 100644 --- a/Content.Shared/SS220/CultYogg/Cultists/SharedCultYoggSystem.cs +++ b/Content.Shared/SS220/CultYogg/Cultists/SharedCultYoggSystem.cs @@ -50,7 +50,7 @@ protected virtual void OnCompInit(Entity uid, ref ComponentSt #region Stage private void OnExamined(EntityUid uid, CultYoggComponent component, ExaminedEvent args) { - if (component.CurrentStage == 0) + if (component.CurrentStage < CultYoggStage.Reveal) return; if (TryComp(uid, out var item) diff --git a/Resources/Locale/ru-RU/ss220/administration/cult_yogg.ftl b/Resources/Locale/ru-RU/ss220/administration/cult_yogg.ftl index 9b37a3aeb515..1521351ddf4e 100644 --- a/Resources/Locale/ru-RU/ss220/administration/cult_yogg.ftl +++ b/Resources/Locale/ru-RU/ss220/administration/cult_yogg.ftl @@ -1 +1,2 @@ admin-verb-make-cult-yogg = Сделать цель культистом. +cult-yogg-stage-admin-alert = Культ перешёл к стадии '{ $stage }'. diff --git a/Resources/Prototypes/SS220/GameRules/roundstart.yml b/Resources/Prototypes/SS220/GameRules/roundstart.yml index 9c8642018c6f..e8c4494321ab 100644 --- a/Resources/Prototypes/SS220/GameRules/roundstart.yml +++ b/Resources/Prototypes/SS220/GameRules/roundstart.yml @@ -1,11 +1,11 @@ # © SS220, An EULA/CLA with a hosting restriction, full text: https://raw.githubusercontent.com/SerbiaStrong-220/space-station-14/master/CLA.txt - type: entity - id: CultYoggRule + id: BaseCultYoggRule parent: BaseGameRule + abstract: true components: - type: GameRule - minPlayers: 40 delay: min: 300 max: 600 @@ -26,6 +26,42 @@ objectives: - CultYoggSacraficeObjective +- type: entity + id: CultYoggRuleMidPop + parent: BaseCultYoggRule + components: + - type: GameRule + minPlayers: 40 # WARNING: this should be always synced with other cult game rules and presets! + - type: CultYoggRule + stages: + Initial: {} + Reveal: + sacrificesRequired: 1 + cultistsFractionRequired: 0.2 + Alarm: + sacrificesRequired: 2 + cultistsFractionRequired: 0.3 + God: + sacrificesRequired: 3 + +- type: entity + id: CultYoggRuleHighPop + parent: BaseCultYoggRule + components: + - type: GameRule + minPlayers: 60 # WARNING: this should be always synced with other cult game rules and presets! + - type: CultYoggRule + stages: + Initial: {} + Reveal: + sacrificesRequired: 1 + cultistsFractionRequired: 0.1 + Alarm: + sacrificesRequired: 2 + cultistsFractionRequired: 0.2 + God: + sacrificesRequired: 3 + - type: entity parent: BaseGameRule id: FractWar diff --git a/Resources/Prototypes/SS220/game_presets.yml b/Resources/Prototypes/SS220/game_presets.yml index 36305d64f1f4..ca2ef1ace236 100644 --- a/Resources/Prototypes/SS220/game_presets.yml +++ b/Resources/Prototypes/SS220/game_presets.yml @@ -11,16 +11,31 @@ - DarkReaperSpawnMajor - BasicStationEventScheduler +# 40-59 players Cult Yogg - type: gamePreset - id: CultYoggPreset + id: CultYoggPresetMidPop alias: - - cultyogg + - cultyoggmidpop name: roles-antag-cult-yogg-name description: roles-antag-cult-yogg-objective showInVote: false - minPlayers: 40 + minPlayers: 40 # WARNING: this should be always synced with other cult game rules and presets! + maxPlayers: 59 # WARNING: this should be always synced with other cult game rules and presets! rules: - - CultYoggRule + - CultYoggRuleMidPop + - NoNewCrewAntagsStationEventScheduler + +# 60+ players Cult Yogg +- type: gamePreset + id: CultYoggPresetHighPop + alias: + - cultyogghighpop + name: roles-antag-cult-yogg-name + description: roles-antag-cult-yogg-objective + showInVote: false + minPlayers: 60 # WARNING: this should be always synced with other cult game rules and presets! + rules: + - CultYoggRuleHighPop - NoNewCrewAntagsStationEventScheduler # event schedulers diff --git a/Resources/Prototypes/secret_weights.yml b/Resources/Prototypes/secret_weights.yml index b513f51ff5c7..67a205eb0ac0 100644 --- a/Resources/Prototypes/secret_weights.yml +++ b/Resources/Prototypes/secret_weights.yml @@ -4,7 +4,11 @@ # SS220 Secret Valid Weights bgn Nukeops: 0.12 Traitor: 0.6 - CultYoggPreset: 0.3 + + # At the moment game will add to pool single cult preset (because of min/max players count), so other cult preset(s) will be ignored completely. + CultYoggPresetMidPop: 0.3 + CultYoggPresetHighPop: 0.3 + # Zombie: 0.18 Extended: 0.04 Survival: 0.1