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