diff --git a/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs b/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs
index 53bc8b62a43..282ee5b612a 100644
--- a/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs
+++ b/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs
@@ -3,6 +3,30 @@
[RegisterComponent, Access(typeof(RampingStationEventSchedulerSystem))]
public sealed partial class RampingStationEventSchedulerComponent : Component
{
+ ///
+ /// The maximum number by which the event rate will be multiplied when shift time reaches the end time.
+ ///
+ [DataField]
+ public float ChaosModifier = 3f;
+
+ ///
+ /// The minimum number by which the event rate will be multiplied when the shift has just begun.
+ ///
+ [DataField]
+ public float StartingChaosRatio = 0.1f;
+
+ ///
+ /// The number by which all event delays will be multiplied. Unlike chaos, remains constant throughout the shift.
+ ///
+ [DataField]
+ public float EventDelayModifier = 1f;
+
+ ///
+ /// The number by which average expected shift length is multiplied. Higher values lead to slower chaos growth.
+ ///
+ public float ShiftLengthModifier = 1f;
+
+ // Everything below is overridden in the RampingStationEventSchedulerSystem based on CVars
[DataField("endTime"), ViewVariables(VVAccess.ReadWrite)]
public float EndTime;
diff --git a/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs b/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs
index 53a98e8b762..aa0c9b214b4 100644
--- a/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs
+++ b/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs
@@ -29,15 +29,15 @@ protected override void Started(EntityUid uid, RampingStationEventSchedulerCompo
{
base.Started(uid, component, gameRule, args);
- var avgChaos = _cfg.GetCVar(CCVars.EventsRampingAverageChaos);
- var avgTime = _cfg.GetCVar(CCVars.EventsRampingAverageEndTime);
+ 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 = _random.NextFloat(avgChaos - avgChaos / 4, avgChaos + avgChaos / 4);
+ component.MaxChaos = avgChaos * _random.NextFloat(0.75f, 1.25f);
// This is in minutes, so *60 for seconds (for the chaos calc)
- component.EndTime = _random.NextFloat(avgTime - avgTime / 4, avgTime + avgTime / 4) * 60f;
- component.StartingChaos = component.MaxChaos / 10;
+ component.EndTime = avgTime * _random.NextFloat(0.75f, 1.25f) * 60f;
+ component.StartingChaos = component.MaxChaos * component.StartingChaosRatio;
PickNextEventTime(uid, component);
}
@@ -68,9 +68,10 @@ public override void Update(float frameTime)
private void PickNextEventTime(EntityUid uid, RampingStationEventSchedulerComponent component)
{
- var mod = GetChaosModifier(uid, component);
+ component.TimeUntilNextEvent = _random.NextFloat(
+ _cfg.GetCVar(CCVars.GameEventsRampingMinimumTime),
+ _cfg.GetCVar(CCVars.GameEventsRampingMaximumTime));
- component.TimeUntilNextEvent = _random.NextFloat(_cfg.GetCVar(CCVars.GameEventsRampingMinimumTime) / mod,
- _cfg.GetCVar(CCVars.GameEventsRampingMaximumTime)) / mod;
+ component.TimeUntilNextEvent *= component.EventDelayModifier / GetChaosModifier(uid, component);
}
}
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 67e7f21a140..5feb6d638db 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -4393,3 +4393,21 @@ Entries:
Intercom, FireAlarm and Substation)
id: 6150
time: '2024-07-09T19:37:03.0000000+00:00'
+- author: CodedCrow
+ changes:
+ - type: Add
+ message: Plushie
+ id: 6151
+ time: '2024-07-11T17:23:58.0000000+00:00'
+- author: osjarw
+ changes:
+ - type: Add
+ message: Wallmount substation electronics can now be created at an autolathe.
+ id: 6152
+ time: '2024-07-11T17:24:30.0000000+00:00'
+- author: Mnemotechnician
+ changes:
+ - type: Tweak
+ message: 'Players can now vote on two more gamemodes: Traitors and Hellshift.'
+ id: 6153
+ time: '2024-07-11T17:26:41.0000000+00:00'
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 231733eabfb..0b8fa83ae8b 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
@@ -1,2 +1,5 @@
survival-title = Survival
survival-description = No internal threats, but how long can the station survive increasingly chaotic and frequent events?
+
+hellshift-title = Hellshift
+hellshift-description = The station rolled a "one" in a luck check. Can the crew make it to the end?
diff --git a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml
index cc5e3b1d174..26d0f47315f 100644
--- a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml
+++ b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml
@@ -30,6 +30,7 @@
amount: 2
- id: PlushieArachind
- id: PlushiePenguin
+ - id: PlushieArachne
- type: entity
id: CrateFunLizardPlushieBulk
diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml
index eba1e300edf..d12b85cde41 100644
--- a/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml
+++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml
@@ -36,6 +36,7 @@
- PlushieMoth
- PlushieMothRandom # Nyanotrasen Random Moth Plushies
- PlushieArachind
+ - PlushieArachne
chance: 0.5
offset: 0.2
diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml
index 901b52b21b1..9ced5539417 100644
--- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml
+++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml
@@ -750,6 +750,34 @@
sound:
path: /Audio/Voice/Human/malescream_5.ogg
+- type: entity
+ parent: BasePlushie
+ id: PlushieArachne
+ name: Arachne plushie
+ description: A plushie of an Arachne, a half human, half spider creature. Why does it look familiar?
+ components:
+ - type: Sprite
+ state: plushie_arachne
+ - type: EmitSoundOnUse
+ sound:
+ path: /Audio/Voice/Human/womanlaugh.ogg
+ - type: EmitSoundOnLand
+ sound:
+ path: /Audio/Voice/Human/female_sigh.ogg
+ - type: EmitSoundOnActivate
+ sound:
+ path: /Audio/Voice/Human/womanlaugh.ogg
+ - type: Food
+ requiresSpecialDigestion: true
+ useSound:
+ path: /Audio/Voice/Human/femalescream_4.ogg
+ - type: MeleeWeapon
+ soundHit:
+ path: /Audio/Voice/Human/femalescream_2.ogg
+ - type: EmitSoundOnTrigger
+ sound:
+ path: /Audio/Voice/Human/femalescream_5.ogg
+
- type: entity
parent: BasePlushie
id: PlushieMoth
diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
index 2a10abf3b34..1ff5a7dbb62 100644
--- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
+++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml
@@ -157,6 +157,7 @@
- APCElectronics
- SMESMachineCircuitboard
- SubstationMachineCircuitboard
+ - WallmountSubstationElectronics
- CellRechargerCircuitboard
- BorgChargerCircuitboard
- WeaponCapacitorRechargerCircuitboard
diff --git a/Resources/Prototypes/Entities/Structures/Power/substation.yml b/Resources/Prototypes/Entities/Structures/Power/substation.yml
index 94de12be185..04c83bd991e 100644
--- a/Resources/Prototypes/Entities/Structures/Power/substation.yml
+++ b/Resources/Prototypes/Entities/Structures/Power/substation.yml
@@ -244,6 +244,16 @@
- type: Battery
maxCharge: 2000000
startingCharge: 2000000
+ - type: ContainerFill
+ containers:
+ board: [ WallmountSubstationElectronics ]
+ capacitor: [ CapacitorStockPart ]
+ powercell: [ PowerCellSmall ]
+ - type: ContainerContainer
+ containers:
+ board: !type:Container
+ capacitor: !type:Container
+ powercell: !type:Container
# Construction Frame
- type: entity
diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml
index 9ed1889154d..8e518ab2f18 100644
--- a/Resources/Prototypes/GameRules/roundstart.yml
+++ b/Resources/Prototypes/GameRules/roundstart.yml
@@ -132,6 +132,16 @@
components:
- type: RampingStationEventScheduler
+- 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
+
# variation passes
- type: entity
id: BasicRoundstartVariation
diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/wallmount_substation.yml b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/wallmount_substation.yml
index 381871f94af..7e4087b20a2 100644
--- a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/wallmount_substation.yml
+++ b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/wallmount_substation.yml
@@ -26,7 +26,13 @@
steps:
- material: Cable
amount: 5
- doAfter: 2
+ doAfter: 0.5
+ - material: CableMV
+ amount: 5
+ doAfter: 0.5
+ - material: CableHV
+ amount: 5
+ doAfter: 0.5
- tool: Screwing
doAfter: 2
@@ -41,12 +47,34 @@
icon:
sprite: "Objects/Misc/module.rsi"
state: "charger_APC"
- doAfter: 1
+ doAfter: 0.5
+ - anyTags:
+ - PowerCell
+ - PowerCellSmall
+ store: powercell
+ name: a powercell
+ icon:
+ sprite: "Objects/Power/power_cells.rsi"
+ state: "medium"
+ doAfter: 0.5
+ - tag: CapacitorStockPart
+ name: a capacitor
+ store: capacitor
+ icon:
+ sprite: "Objects/Misc/stock_parts.rsi"
+ state: "capacitor"
+ doAfter: 0.5
- to: frame
completed:
- !type:GivePrototype
prototype: CableApcStack1
amount: 5
+ - !type:GivePrototype
+ prototype: CableMVStack1
+ amount: 5
+ - !type:GivePrototype
+ prototype: CableHVStack1
+ amount: 5
steps:
- tool: Cutting
doAfter: 1
diff --git a/Resources/Prototypes/Recipes/Lathes/electronics.yml b/Resources/Prototypes/Recipes/Lathes/electronics.yml
index f0c59a0bdf9..b6184272dc0 100644
--- a/Resources/Prototypes/Recipes/Lathes/electronics.yml
+++ b/Resources/Prototypes/Recipes/Lathes/electronics.yml
@@ -604,7 +604,7 @@
completetime: 4
materials:
Steel: 50
- Glass: 350
+ Glass: 450
- type: latheRecipe
id: SMESMachineCircuitboard
diff --git a/Resources/Prototypes/game_presets.yml b/Resources/Prototypes/game_presets.yml
index e99b51f82cd..7d7169bf10a 100644
--- a/Resources/Prototypes/game_presets.yml
+++ b/Resources/Prototypes/game_presets.yml
@@ -9,6 +9,17 @@
- RampingStationEventScheduler
- BasicRoundstartVariation
+- type: gamePreset
+ id: SurvivalHellshift
+ alias:
+ - hellshift
+ showInVote: true
+ name: hellshift-title
+ description: hellshift-description
+ rules:
+ - HellshiftStationEventScheduler
+ - BasicRoundstartVariation
+
- type: gamePreset
id: AllAtOnce
name: all-at-once-title
@@ -90,7 +101,7 @@
- traitor
name: traitor-title
description: traitor-description
- showInVote: false
+ showInVote: true
rules:
- Traitor
- SubGamemodesRule
diff --git a/Resources/Textures/Objects/Fun/toys.rsi/meta.json b/Resources/Textures/Objects/Fun/toys.rsi/meta.json
index fc92a479367..cae7880e414 100644
--- a/Resources/Textures/Objects/Fun/toys.rsi/meta.json
+++ b/Resources/Textures/Objects/Fun/toys.rsi/meta.json
@@ -104,6 +104,9 @@
{
"name": "plushie_diona"
},
+ {
+ "name": "plushie_arachne"
+ },
{
"name": "plushie_human"
},
diff --git a/Resources/Textures/Objects/Fun/toys.rsi/plushie_arachne.png b/Resources/Textures/Objects/Fun/toys.rsi/plushie_arachne.png
new file mode 100644
index 00000000000..4f72c31ddf6
Binary files /dev/null and b/Resources/Textures/Objects/Fun/toys.rsi/plushie_arachne.png differ