diff --git a/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs b/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs index 282ee5b612a..673c82b20f6 100644 --- a/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs +++ b/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs @@ -4,38 +4,50 @@ public sealed partial class RampingStationEventSchedulerComponent : Component { /// - /// The maximum number by which the event rate will be multiplied when shift time reaches the end time. + /// Multiplies the End Time of the Ramping Event curve. Lower this number for shorter, hectic shifts, increase this number for longer shifts. /// [DataField] - public float ChaosModifier = 3f; + public float ShiftChaosModifier = 1f; /// - /// The minimum number by which the event rate will be multiplied when the shift has just begun. + /// The number by which all event delays will be multiplied. Unlike chaos, remains constant throughout the shift. /// [DataField] - public float StartingChaosRatio = 0.1f; + public float EventDelayModifier = 1f; + /// - /// The number by which all event delays will be multiplied. Unlike chaos, remains constant throughout the shift. + /// Shift Length(in Minutes) is directly reduced by this value. /// [DataField] - public float EventDelayModifier = 1f; + public float ShiftLengthOffset = 0f; + + /// + /// Minimum time between events is decreased by this value. + /// + [DataField] + public float MinimumEventTimeOffset = 0f; /// - /// The number by which average expected shift length is multiplied. Higher values lead to slower chaos growth. + /// Maximum time between events is decreased by this value. /// - public float ShiftLengthModifier = 1f; + + [DataField] + public float MaximumEventTimeOffset = 0f; + + [DataField] + public bool IgnoreMinimumTimes = false; // Everything below is overridden in the RampingStationEventSchedulerSystem based on CVars - [DataField("endTime"), ViewVariables(VVAccess.ReadWrite)] + [DataField] public float EndTime; - [DataField("maxChaos"), ViewVariables(VVAccess.ReadWrite)] + [DataField] public float MaxChaos; - [DataField("startingChaos"), ViewVariables(VVAccess.ReadWrite)] + [DataField] public float StartingChaos; - [DataField("timeUntilNextEvent"), ViewVariables(VVAccess.ReadWrite)] + [DataField] public float TimeUntilNextEvent; } diff --git a/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs b/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs index aa0c9b214b4..e24578fdac9 100644 --- a/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs +++ b/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs @@ -2,10 +2,10 @@ using Content.Server.GameTicking.Rules; using Content.Server.GameTicking.Rules.Components; using Content.Server.StationEvents.Components; -using Content.Server.StationEvents.Events; using Content.Shared.CCVar; using Robust.Shared.Configuration; using Robust.Shared.Random; +using Robust.Shared.Utility; namespace Content.Server.StationEvents; @@ -16,30 +16,35 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem + /// A logistic curve equation used to smooth out the transition between event times at shift start, vs. shift end. + /// Depending on the settings used, the end time might not necessarily be the point at which timers hit the floor. + /// It is after all, an asymptote. + /// + /// + /// + /// + /// + public float RampingEventTimeEquation(RampingStationEventSchedulerComponent component, float startTime, float endTimeOffset = 0) { - var roundTime = (float) _gameTicker.RoundDuration().TotalSeconds; - if (roundTime > component.EndTime) - return component.MaxChaos; - - return component.MaxChaos / component.EndTime * roundTime + component.StartingChaos; + var endTime = Math.Clamp(endTimeOffset, 0.1f, startTime - 1); + var shiftLength = Math.Max(1, _cfg.GetCVar(CCVars.EventsRampingAverageEndTime) - component.ShiftLengthOffset); + return 2 * endTime + / (1 + + MathF.Exp(_cfg.GetCVar(CCVars.EventsRampingAverageChaos) + * component.ShiftChaosModifier + / shiftLength + * endTime + * (float) _gameTicker.RoundDuration().TotalSeconds + / 60)) + + (startTime - endTime); } protected override void Started(EntityUid uid, RampingStationEventSchedulerComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) { base.Started(uid, component, gameRule, args); - var avgChaos = _cfg.GetCVar(CCVars.EventsRampingAverageChaos) * component.ChaosModifier; - var avgTime = _cfg.GetCVar(CCVars.EventsRampingAverageEndTime) * component.ShiftLengthModifier; - - // Worlds shittiest probability distribution - // Got a complaint? Send them to - component.MaxChaos = avgChaos * _random.NextFloat(0.75f, 1.25f); - // This is in minutes, so *60 for seconds (for the chaos calc) - component.EndTime = avgTime * _random.NextFloat(0.75f, 1.25f) * 60f; - component.StartingChaos = component.MaxChaos * component.StartingChaosRatio; - - PickNextEventTime(uid, component); + PickNextEventTime(component); } public override void Update(float frameTime) @@ -61,17 +66,31 @@ public override void Update(float frameTime) return; } - PickNextEventTime(uid, scheduler); + PickNextEventTime(scheduler); _event.RunRandomEvent(); } } - private void PickNextEventTime(EntityUid uid, RampingStationEventSchedulerComponent component) + private void PickNextEventTime(RampingStationEventSchedulerComponent component) { + // In case of server hosts being silly and setting maximum time to be lower than minimum time, sanity check the scheduler inputs and sort them by Min/Max + var minimumTime = MathF.Min(_cfg.GetCVar(CCVars.GameEventsRampingMinimumTime) + - _cfg.GetCVar(CCVars.GameEventsRampingMinimumTimeOffset) + - component.MinimumEventTimeOffset, _cfg.GetCVar(CCVars.GameEventsRampingMaximumTime) + - _cfg.GetCVar(CCVars.GameEventsRampingMaximumTimeOffset) + - component.MaximumEventTimeOffset); + + var maximumTime = MathF.Max(_cfg.GetCVar(CCVars.GameEventsRampingMinimumTime) + - _cfg.GetCVar(CCVars.GameEventsRampingMinimumTimeOffset) + - component.MinimumEventTimeOffset, _cfg.GetCVar(CCVars.GameEventsRampingMaximumTime) + - _cfg.GetCVar(CCVars.GameEventsRampingMaximumTimeOffset) + - component.MaximumEventTimeOffset); + + // Just in case someone messed up their math, set it to between 6 and 12 seconds. This absolutely isn't ideal component.TimeUntilNextEvent = _random.NextFloat( - _cfg.GetCVar(CCVars.GameEventsRampingMinimumTime), - _cfg.GetCVar(CCVars.GameEventsRampingMaximumTime)); + RampingEventTimeEquation(component, MathF.Max(0.1f, minimumTime)), + RampingEventTimeEquation(component, MathF.Max(0.2f, maximumTime))); - component.TimeUntilNextEvent *= component.EventDelayModifier / GetChaosModifier(uid, component); + component.TimeUntilNextEvent *= component.EventDelayModifier; } } diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index c10df9c4aff..5bd2a77b1f2 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -119,7 +119,7 @@ public static readonly CVarDef /// Max chaos chosen for a round will deviate from this /// public static readonly CVarDef - EventsRampingAverageChaos = CVarDef.Create("events.ramping_average_chaos", 6f, CVar.ARCHIVE | CVar.SERVERONLY); + EventsRampingAverageChaos = CVarDef.Create("events.ramping_average_chaos", 0.8f, CVar.ARCHIVE | CVar.SERVERONLY); /* * Game @@ -186,16 +186,29 @@ public static readonly CVarDef // 25 Minutes GameEventsBasicMaximumTime = CVarDef.Create("game.events_basic_maximum_time", 1500, CVar.SERVERONLY); /// - /// Minimum time between Ramping station events in seconds + /// Minimum time between Ramping station events in minutes /// - public static readonly CVarDef // 4 Minutes - GameEventsRampingMinimumTime = CVarDef.Create("game.events_ramping_minimum_time", 240, CVar.SERVERONLY); + public static readonly CVarDef // 8 Minutes + GameEventsRampingMinimumTime = CVarDef.Create("game.events_ramping_minimum_time", 8f, CVar.SERVERONLY); /// - /// Maximum time between Ramping station events in seconds + /// After the shift's desired "Endpoint" is reached, the minimum time between events is RampingMinimumTime - Offset. /// - public static readonly CVarDef // 12 Minutes - GameEventsRampingMaximumTime = CVarDef.Create("game.events_ramping_maximum_time", 720, CVar.SERVERONLY); + + public static readonly CVarDef + GameEventsRampingMinimumTimeOffset = CVarDef.Create("game.events_ramping_minimum_time_offset", 6f, CVar.SERVERONLY); + + /// + /// Maximum time between Ramping station events in minutes + /// + public static readonly CVarDef // 16 Minutes + GameEventsRampingMaximumTime = CVarDef.Create("game.events_ramping_maximum_time", 16f, CVar.SERVERONLY); + + /// + /// After the shift's desired "Endpoint" is reached, the maximum time between events is RampingMaximumTime - Offset. + /// + public static readonly CVarDef + GameEventsRampingMaximumTimeOffset = CVarDef.Create("game.events_ramping_maximum_time_offset", 10f, CVar.SERVERONLY); /// /// diff --git a/Content.Shared/Customization/Systems/CharacterRequirements.cs b/Content.Shared/Customization/Systems/CharacterRequirements.cs index 134dca8e487..4e862aa69e3 100644 --- a/Content.Shared/Customization/Systems/CharacterRequirements.cs +++ b/Content.Shared/Customization/Systems/CharacterRequirements.cs @@ -121,17 +121,20 @@ public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCha public sealed partial class CharacterSpeciesRequirement : CharacterRequirement { [DataField(required: true)] - public ProtoId Species; + public List> Species; public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, out FormattedMessage? reason) { + const string color = "green"; reason = FormattedMessage.FromMarkup(Loc.GetString("character-species-requirement", ("inverted", Inverted), - ("species", Loc.GetString($"species-name-{Species.ToString().ToLower()}")))); - return profile.Species == Species; + ("species", $"[color={color}]{string.Join($"[/color], [color={color}]", + Species.Select(s => Loc.GetString(prototypeManager.Index(s).Name)))}[/color]"))); + + return Species.Contains(profile.Species); } } @@ -150,8 +153,11 @@ public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCha IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, out FormattedMessage? reason) { - reason = FormattedMessage.FromMarkup(Loc.GetString("character-trait-requirement", ("inverted", Inverted), - ("traits", string.Join(", ", Traits.Select(t => Loc.GetString($"trait-name-{t}")))))); + const string color = "lightblue"; + reason = FormattedMessage.FromMarkup(Loc.GetString("character-trait-requirement", + ("inverted", Inverted), + ("traits", $"[color={color}]{string.Join($"[/color], [color={color}]", + Traits.Select(t => Loc.GetString($"trait-name-{t}")))}[/color]"))); return Traits.Any(t => profile.TraitPreferences.Contains(t.ToString())); } @@ -168,11 +174,15 @@ public sealed partial class CharacterLoadoutRequirement : CharacterRequirement public List> Loadouts; public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, - IConfigurationManager configManager, out FormattedMessage? reason) + Dictionary playTimes, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) { - reason = FormattedMessage.FromMarkup(Loc.GetString("character-loadout-requirement", ("inverted", Inverted), - ("loadouts", string.Join(", ", Loadouts.Select(l => Loc.GetString($"loadout-{l}")))))); + const string color = "lightblue"; + reason = FormattedMessage.FromMarkup(Loc.GetString("character-loadout-requirement", + ("inverted", Inverted), + ("loadouts", $"[color={color}]{string.Join($"[/color], [color={color}]", + Loadouts.Select(l => Loc.GetString($"loadout-name-{l}")))}[/color]"))); return Loadouts.Any(l => profile.LoadoutPreferences.Contains(l.ToString())); } @@ -468,63 +478,3 @@ public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCha } #endregion - -#region Prototype Groups - -/// -/// Requires the profile to not have any of the specified traits -/// -/// -/// Only works if you put this prototype in the denied prototypes' requirements too. -/// Can't be inverted, use -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class TraitGroupExclusionRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Prototypes; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - var invalid = profile.TraitPreferences.Any(t => Prototypes.Contains(t)); - - reason = FormattedMessage.FromMarkup(Loc.GetString("character-trait-group-exclusion-requirement", - ("traits", string.Join(", ", Prototypes.Select(t => Loc.GetString($"trait-name-{t}")))))); - - return Inverted ? invalid : !invalid; - } -} - -/// -/// Requires the profile to not have any of the specified loadouts -/// -/// -/// Only works if you put this prototype in the denied prototypes' requirements too. -/// Can't be inverted, use -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class LoadoutGroupExclusionRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Prototypes; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - var invalid = profile.LoadoutPreferences.Any(l => Prototypes.Contains(l)); - - reason = FormattedMessage.FromMarkup(Loc.GetString("character-loadout-group-exclusion-requirement", - ("loadouts", string.Join(", ", Prototypes.Select(l => Loc.GetString($"loadout-{l}")))))); - - return Inverted ? invalid : !invalid; - } -} - -#endregion diff --git a/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs b/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs index e93c933a6aa..f21971b5e68 100644 --- a/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs +++ b/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs @@ -34,7 +34,7 @@ public bool CheckRequirementsValid(IPrototype prototype, List 1. Clone this repository > 2. Run `git submodule update --init --recursive` in a terminal to download the engine -> 3. Run `Scripts/bat/buildAllDebug.sh` after making any changes to the source -> 4. Run `Scripts/bat/runQuickAll.sh` to launch the client and the server +> 3. Run `Scripts/sh/buildAllDebug.sh` after making any changes to the source +> 4. Run `Scripts/sh/runQuickAll.sh` to launch the client and the server > 5. Connect to localhost in the client and play ### MacOS diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2a5aa2753bc..fa12b491b85 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4652,3 +4652,9 @@ Entries: connection. Attached grids now permit sound to travel through. id: 6184 time: '2024-07-26T20:09:52.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: Long Survival has been added as a new Game mode. + id: 6185 + time: '2024-07-27T06:00:24.0000000+00:00' diff --git a/Resources/Locale/en-US/customization/character-requirements.ftl b/Resources/Locale/en-US/customization/character-requirements.ftl index efa1b7e7677..d0eeb8f9c85 100644 --- a/Resources/Locale/en-US/customization/character-requirements.ftl +++ b/Resources/Locale/en-US/customization/character-requirements.ftl @@ -5,19 +5,23 @@ character-age-requirement = You must {$inverted -> character-species-requirement = You must {$inverted -> [true] not be *[other] be -} a [color=green]{$species}[/color] +} a {$species} character-trait-requirement = You must {$inverted -> [true] not have *[other] have -} one of these traits: [color=lightblue]{$traits}[/color] +} one of these traits: {$traits} +character-loadout-requirement = You must {$inverted -> + [true] not have + *[other] have +} one of these loadouts: {$loadouts} character-backpack-type-requirement = You must {$inverted -> [true] not use *[other] use -} a [color=lightblue]{$type}[/color] as your bag +} a [color=brown]{$type}[/color] as your bag character-clothing-preference-requirement = You must {$inverted -> [true] not wear *[other] wear -} a [color=lightblue]{$type}[/color] +} a [color=white]{$type}[/color] character-job-requirement = You must {$inverted -> [true] not be @@ -34,6 +38,3 @@ character-timer-overall-insufficient = You require [color=yellow]{TOSTRING($time character-timer-overall-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes of playtime character-timer-role-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes with [color={$departmentColor}]{$job}[/color] character-timer-role-too-high = You require[color=yellow] {TOSTRING($time, "0")}[/color] fewer minutes with [color={$departmentColor}]{$job}[/color] - -character-trait-group-exclusion-requirement = You cannot have one of the following traits if you select this: {$traits} -character-loadout-group-exclusion-requirement = You cannot have one of the following loadouts if you select this: {$loadouts} diff --git a/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl b/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl index 0b8fa83ae8b..10e6a4a24f2 100644 --- a/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl +++ b/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl @@ -3,3 +3,6 @@ survival-description = No internal threats, but how long can the station survive hellshift-title = Hellshift hellshift-description = The station rolled a "one" in a luck check. Can the crew make it to the end? + +longsurvival-title = Long Survival +longsurvival-description = Survival, but two hours longer. Event growth is stretched over a vastly greater length of time. diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index da0eaf5e9e5..a071ae968e9 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -58,8 +58,8 @@ trait-description-NormalVisionHarpy = Your eyes have been modified by means of a trait-name-Southern = Southern Drawl trait-description-Southern = You have a different way of speakin'. -trait-name-NormalVisionVulpkanin = Trichromat Modification -trait-description-NormalVisionVulpkanin = Your eyes have been modified by means of advanced medicine to see in the standard colors of Red, Green, and Blue. +trait-name-NormalVision = Trichromat Modification +trait-description-NormalVision = Your eyes have been modified by means of advanced medicine to see in the standard colors of Red, Green, and Blue. trait-name-Thieving = Thieving trait-description-Thieving = diff --git a/Resources/Prototypes/DeltaV/Traits/altvision.yml b/Resources/Prototypes/DeltaV/Traits/altvision.yml index 1257c1eeb09..97742d98ce5 100644 --- a/Resources/Prototypes/DeltaV/Traits/altvision.yml +++ b/Resources/Prototypes/DeltaV/Traits/altvision.yml @@ -5,10 +5,9 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Vulpkanin - - !type:CharacterSpeciesRequirement - inverted: true - species: Harpy + species: + - Vulpkanin + - Harpy - !type:CharacterTraitRequirement inverted: true traits: @@ -23,10 +22,9 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Vulpkanin - - !type:CharacterSpeciesRequirement - inverted: true - species: Harpy + species: + - Vulpkanin + - Harpy - !type:CharacterTraitRequirement inverted: true traits: diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index 0af55a7f9d0..e046b871fa7 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -132,15 +132,21 @@ components: - type: RampingStationEventScheduler +- type: entity + id: LongSurvivalStationEventScheduler + parent: BaseGameRule + noSpawn: true + components: + - type: RampingStationEventScheduler + shiftLengthOffset: -120 + - type: entity id: HellshiftStationEventScheduler parent: BaseGameRule noSpawn: true components: - type: RampingStationEventScheduler - chaosModifier: 4 # By default, one event each 30-10 seconds after two hours. Changing CVars will cause this to deviate. - startingChaosRatio: 0.025 # Starts as slow as survival, but quickly ramps up - shiftLengthModifier: 2.5 + shiftChaosModifier: 4 #30 minute HELL SHIFT # variation passes - type: entity diff --git a/Resources/Prototypes/Loadouts/Jobs/engineering.yml b/Resources/Prototypes/Loadouts/Jobs/engineering.yml index d91814e34d1..06ce4cbf8c3 100644 --- a/Resources/Prototypes/Loadouts/Jobs/engineering.yml +++ b/Resources/Prototypes/Loadouts/Jobs/engineering.yml @@ -6,7 +6,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - StationEngineer @@ -54,7 +55,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - StationEngineer diff --git a/Resources/Prototypes/Loadouts/Jobs/medical.yml b/Resources/Prototypes/Loadouts/Jobs/medical.yml index e9e6aa04231..edf51747d00 100644 --- a/Resources/Prototypes/Loadouts/Jobs/medical.yml +++ b/Resources/Prototypes/Loadouts/Jobs/medical.yml @@ -49,7 +49,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - MedicalDoctor @@ -67,7 +68,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - MedicalDoctor @@ -85,7 +87,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - MedicalDoctor @@ -103,7 +106,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - MedicalDoctor @@ -121,7 +125,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - MedicalDoctor @@ -139,7 +144,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - MedicalDoctor @@ -157,7 +163,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - MedicalDoctor @@ -211,7 +218,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Paramedic @@ -262,7 +270,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - MedicalDoctor diff --git a/Resources/Prototypes/Loadouts/Jobs/science.yml b/Resources/Prototypes/Loadouts/Jobs/science.yml index c43c70f6c2e..ad93e92557b 100644 --- a/Resources/Prototypes/Loadouts/Jobs/science.yml +++ b/Resources/Prototypes/Loadouts/Jobs/science.yml @@ -21,7 +21,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Scientist @@ -130,7 +131,7 @@ items: - ClothingEyesEyepatchHudDiag -## Robes +# Robes - type: loadout id: LoadoutOuterRobeTechPriest category: Outer diff --git a/Resources/Prototypes/Loadouts/Jobs/security.yml b/Resources/Prototypes/Loadouts/Jobs/security.yml index 29e1850db51..2809c9c1ae5 100644 --- a/Resources/Prototypes/Loadouts/Jobs/security.yml +++ b/Resources/Prototypes/Loadouts/Jobs/security.yml @@ -1,4 +1,4 @@ -## Uniforms +# Uniforms - type: loadout id: LoadoutSecurityUniformJumpsuitBlue category: Jobs @@ -7,7 +7,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - SecurityOfficer @@ -24,7 +25,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - SecurityOfficer @@ -93,7 +95,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - SecurityOfficer @@ -120,7 +123,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Warden @@ -135,7 +139,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Warden @@ -198,7 +203,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Detective @@ -216,7 +222,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Detective @@ -225,7 +232,7 @@ - HeadOfSecurity items: - ClothingUniformJumpsuitSecSummer -## Mask +# Mask - type: loadout id: LoadoutSecurityMaskGasSwat category: Jobs @@ -239,7 +246,7 @@ items: - ClothingMaskGasSwat -## Shoes +# Shoes - type: loadout id: LoadoutSecurityShoesJackboots category: Jobs @@ -247,7 +254,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Detective @@ -258,7 +266,7 @@ items: - ClothingShoesBootsJack -## Eyes +# Eyes - type: loadout id: LoadoutSecurityEyesHudSecurity category: Jobs @@ -307,7 +315,7 @@ items: - ClothingEyesPrescriptionHudSecurity -## Head +# Head - type: loadout id: LoadoutSecurityHeadHatBeret category: Jobs @@ -337,7 +345,7 @@ items: - ClothingHeadHelmetInsulated -## Belt +# Belt - type: loadout id: LoadoutSecurityBeltWebbing category: Jobs @@ -354,22 +362,24 @@ items: - ClothingBeltSecurityWebbingFilled -## Species -#- type: loadout ##Uncomment this and reassess points when we can make it replace the secoff duty pistol -# id: LoadoutSecurityEquipmentTruncheon -# category: Jobs -# cost: 8 ## TODO: Make this replace the secoff handgun, and thus also make it cheaper -# requirements: -# - !type:CharacterJobRequirement -# jobs: -# - SecurityOfficer -# - Warden -# - HeadOfSecurity -# - Brigmedic -# - !type:CharacterPlaytimeRequirement -# tracker: JobSecurityOfficer -# min: 36000 # 10 hours -# - !type:CharacterSpeciesRequirement -# species: Oni -# items: -# - Truncheon +# TODO: Make this replace the secoff handgun and make it cheaper +# # Species +# - type: loadout +# id: LoadoutSecurityEquipmentTruncheon +# category: Jobs +# cost: 8 +# requirements: +# - !type:CharacterJobRequirement +# jobs: +# - SecurityOfficer +# - Warden +# - HeadOfSecurity +# - Brigmedic +# - !type:CharacterPlaytimeRequirement +# tracker: JobSecurityOfficer +# min: 36000 # 10 hours +# - !type:CharacterSpeciesRequirement +# species: +# - Oni +# items: +# - Truncheon diff --git a/Resources/Prototypes/Loadouts/Jobs/service.yml b/Resources/Prototypes/Loadouts/Jobs/service.yml index 507b75412e3..becb2cb3758 100644 --- a/Resources/Prototypes/Loadouts/Jobs/service.yml +++ b/Resources/Prototypes/Loadouts/Jobs/service.yml @@ -1,4 +1,4 @@ -## Clown +# Clown - type: loadout id: LoadoutServiceClownOutfitJester category: Jobs @@ -27,7 +27,7 @@ - ClothingHeadHatJesterAlt - ClothingShoesJester -## Bartender +# Bartender - type: loadout id: LoadoutServiceBartenderUniformPurple category: Jobs @@ -40,7 +40,7 @@ items: - ClothingUniformJumpsuitBartenderPurple -## Botanist +# Botanist - type: loadout id: LoadoutServiceBartenderBunnyEars category: Jobs @@ -77,7 +77,7 @@ items: - ClothingUniformOveralls -## Lawyer +# Lawyer - type: loadout id: LoadoutServiceLawyerUniformBlueSuit category: Jobs @@ -86,7 +86,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Lawyer @@ -113,7 +114,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Lawyer @@ -140,7 +142,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Lawyer @@ -167,7 +170,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Lawyer @@ -198,7 +202,7 @@ items: - ClothingUniformJumpsuitJournalist -## Reporter +# Reporter - type: loadout id: LoadoutServiceReporterUniformDetectivesuit category: Jobs @@ -207,7 +211,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Reporter @@ -226,7 +231,7 @@ items: - ClothingUniformJumpskirtDetective -## Musician +# Musician - type: loadout id: LoadoutItemSynthesizerInstrument category: Jobs diff --git a/Resources/Prototypes/Loadouts/head.yml b/Resources/Prototypes/Loadouts/head.yml index c5adb9e73e3..dedd5d6ed8d 100644 --- a/Resources/Prototypes/Loadouts/head.yml +++ b/Resources/Prototypes/Loadouts/head.yml @@ -1,4 +1,4 @@ -## Hats +# Hats - type: loadout id: LoadoutHeadBeaverHat category: Head @@ -126,7 +126,8 @@ exclusive: true items: - ClothingHeadHatHairflower -## Color Hats + +# Color Hats - type: loadout id: LoadoutHeadHatBluesoft category: Head @@ -255,7 +256,7 @@ items: - ClothingHeadHatYellowsoftFlipped -## Headbands +# Headbands - type: loadout id: LoadoutHeadBandBlack category: Head diff --git a/Resources/Prototypes/Loadouts/items.yml b/Resources/Prototypes/Loadouts/items.yml index 072061d2e28..35dcbf7b9ed 100644 --- a/Resources/Prototypes/Loadouts/items.yml +++ b/Resources/Prototypes/Loadouts/items.yml @@ -69,7 +69,7 @@ items: - Matchbox -## Instruments +# Instruments - type: loadout id: LoadoutItemMicrophoneInstrument category: Items diff --git a/Resources/Prototypes/Loadouts/outerClothing.yml b/Resources/Prototypes/Loadouts/outerClothing.yml index a5932214ce9..c52f35b0f5d 100644 --- a/Resources/Prototypes/Loadouts/outerClothing.yml +++ b/Resources/Prototypes/Loadouts/outerClothing.yml @@ -54,7 +54,7 @@ items: - ClothingOuterVestValet -## Letterman Jackets +# Letterman Jackets - type: loadout id: LoadoutOuterCoatLettermanBlue category: Outer @@ -69,7 +69,7 @@ items: - ClothingOuterCoatLettermanRed -## MNK +# MNK - type: loadout id: LoadoutOuterCoatMNKWhiteHoodie category: Outer @@ -91,7 +91,7 @@ items: - ClothingOuterCoatMNKBlackJacket -## Contractor Jackets +# Contractor Jackets - type: loadout id: LoadoutOuterCorporateJacket category: Outer diff --git a/Resources/Prototypes/Loadouts/shoes.yml b/Resources/Prototypes/Loadouts/shoes.yml index 0f493cc5431..bdea2b57ad1 100644 --- a/Resources/Prototypes/Loadouts/shoes.yml +++ b/Resources/Prototypes/Loadouts/shoes.yml @@ -7,7 +7,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesColorBlack @@ -19,7 +20,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesColorBlue @@ -31,7 +33,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesColorBrown @@ -43,7 +46,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesColorGreen @@ -55,7 +59,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesColorOrange @@ -67,7 +72,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesColorPurple @@ -79,7 +85,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesColorRed @@ -91,7 +98,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesColorWhite @@ -103,7 +111,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesColorYellow @@ -115,11 +124,12 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesGeta -## Boots +# Boots - type: loadout id: LoadoutShoesBootsWork category: Shoes @@ -128,7 +138,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesBootsWork @@ -140,7 +151,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesBootsLaceup @@ -152,7 +164,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesBootsWinter @@ -164,7 +177,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesBootsCowboyBrown @@ -176,7 +190,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesBootsCowboyBlack @@ -188,7 +203,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesBootsCowboyWhite @@ -200,7 +216,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesBootsCowboyFancy @@ -215,7 +232,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Clown @@ -228,7 +246,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesLeather @@ -240,6 +259,7 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy items: - ClothingShoesMiscWhite diff --git a/Resources/Prototypes/Loadouts/species.yml b/Resources/Prototypes/Loadouts/species.yml index 1d2fb58dc0a..8c7bd228589 100644 --- a/Resources/Prototypes/Loadouts/species.yml +++ b/Resources/Prototypes/Loadouts/species.yml @@ -4,9 +4,9 @@ cost: 0 requirements: - !type:CharacterSpeciesRequirement - species: SlimePerson - - !type:CharacterSpeciesRequirement - species: Vox + species: + - SlimePerson + - Vox items: - EmergencyNitrogenTankFilled @@ -16,9 +16,9 @@ cost: 1 requirements: - !type:CharacterSpeciesRequirement - species: SlimePerson - - !type:CharacterSpeciesRequirement - species: Vox + species: + - SlimePerson + - Vox items: - ExtendedEmergencyNitrogenTankFilled @@ -28,8 +28,8 @@ cost: 3 requirements: - !type:CharacterSpeciesRequirement - species: SlimePerson - - !type:CharacterSpeciesRequirement - species: Vox + species: + - SlimePerson + - Vox items: - DoubleEmergencyNitrogenTankFilled diff --git a/Resources/Prototypes/Loadouts/uniform.yml b/Resources/Prototypes/Loadouts/uniform.yml index c6838b97d33..eb46acc2f60 100644 --- a/Resources/Prototypes/Loadouts/uniform.yml +++ b/Resources/Prototypes/Loadouts/uniform.yml @@ -6,7 +6,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -25,7 +26,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -52,7 +54,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -79,7 +82,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -106,7 +110,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -133,7 +138,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -160,7 +166,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -187,7 +194,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -214,7 +222,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -241,7 +250,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -268,7 +278,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -295,7 +306,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -322,7 +334,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -349,7 +362,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -376,7 +390,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -403,7 +418,8 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Harpy + species: + - Harpy - !type:CharacterJobRequirement jobs: - Passenger @@ -420,7 +436,7 @@ jobs: - Passenger -## Kendo +# Kendo - type: loadout id: LoadoutUniformKendoHakama category: Uniform @@ -437,7 +453,7 @@ items: - ClothingUniformMartialGi -## Kimono +# Kimono - type: loadout id: LoadoutClothingKimonoBlue category: Uniform @@ -478,7 +494,7 @@ items: - ClothingKimonoGreen -## Gakuran +# Gakuran - type: loadout id: LoadoutUniformSchoolGakuranBlack category: Uniform @@ -487,7 +503,7 @@ items: - ClothingUniformSchoolGakuranBlack -## MNK Uniforms +# MNK Uniforms - type: loadout id: LoadoutClothingMNKOfficeSkirt category: Uniform diff --git a/Resources/Prototypes/Traits/inconveniences.yml b/Resources/Prototypes/Traits/inconveniences.yml index 8988475fd35..2dcc30cd97c 100644 --- a/Resources/Prototypes/Traits/inconveniences.yml +++ b/Resources/Prototypes/Traits/inconveniences.yml @@ -36,8 +36,10 @@ category: Mental points: 1 requirements: - - !type:TraitGroupExclusionRequirement - prototypes: [ Foreigner ] + - !type:CharacterTraitRequirement + inverted: true + traits: + - Foreigner components: - type: ForeignerTrait cantUnderstand: false # Allows to understand @@ -48,8 +50,10 @@ category: Mental points: 2 requirements: # TODO: Add a requirement to know at least 1 non-gc language - - !type:TraitGroupExclusionRequirement - prototypes: [ ForeignerLight ] + - !type:CharacterTraitRequirement + inverted: true + traits: + - ForeignerLight components: - type: ForeignerTrait baseTranslator: TranslatorForeigner diff --git a/Resources/Prototypes/Traits/neutral.yml b/Resources/Prototypes/Traits/neutral.yml index 648e6f79e48..28f6adc170a 100644 --- a/Resources/Prototypes/Traits/neutral.yml +++ b/Resources/Prototypes/Traits/neutral.yml @@ -29,21 +29,13 @@ - type: SouthernAccent - type: trait - id: NormalVisionHarpy + id: NormalVision category: Visual points: -1 requirements: - !type:CharacterSpeciesRequirement - species: Harpy - components: - - type: NormalVision - -- type: trait - id: NormalVisionVulpkanin - category: Visual - points: -1 - requirements: - - !type:CharacterSpeciesRequirement - species: Vulpkanin + species: + - Harpy + - Vulpkanin components: - type: NormalVision diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 988307f58e4..2cfbd244e7e 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -15,7 +15,7 @@ components: - type: LightweightDrunk boozeStrengthMultiplier: 0.5 - + - type: trait id: Thieving category: Physical @@ -29,4 +29,5 @@ requirements: - !type:CharacterSpeciesRequirement inverted: true - species: Felinid + species: + - Felinid diff --git a/Resources/Prototypes/game_presets.yml b/Resources/Prototypes/game_presets.yml index 7d7169bf10a..7e83f224433 100644 --- a/Resources/Prototypes/game_presets.yml +++ b/Resources/Prototypes/game_presets.yml @@ -20,6 +20,17 @@ - HellshiftStationEventScheduler - BasicRoundstartVariation +- type: gamePreset + id: SurvivalLonger + alias: + - longsurvival + showInVote: true + name: longsurvival-title + description: longsurvival-description + rules: + - LongSurvivalStationEventScheduler + - BasicRoundstartVariation + - type: gamePreset id: AllAtOnce name: all-at-once-title