Station event component and system tweaks (#28331)

* Make anomaly, artifact and gifts events announcement sound optional

* Requested changes + Added new "GameRuleAfterAddedEvent" for StationEventSystem

We need to call "Add" in "StationEventSystem" after others GameRule's in case if we need to change StationEventComponent variables.

* Fix margins

* Makes use of GameRuleComponent.Delay and remove station system handling of delays plus small cleanup

* Fix merge

---------

Co-authored-by: AJCM <AJCM@tutanota.com>
This commit is contained in:
MilenVolf
2024-06-01 23:34:58 +03:00
committed by GitHub
parent 8c32072f67
commit 5d970b0861
13 changed files with 244 additions and 230 deletions

View File

@@ -823,7 +823,7 @@ public sealed partial class ChatSystem : SharedChatSystem
recipients.Add(player, new ICChatRecipientData(-1, true));
}
RaiseLocalEvent(new ExpandICChatRecipientstEvent(source, voiceGetRange, recipients));
RaiseLocalEvent(new ExpandICChatRecipientsEvent(source, voiceGetRange, recipients));
return recipients;
}
@@ -868,7 +868,7 @@ public sealed partial class ChatSystem : SharedChatSystem
/// This event is raised before chat messages are sent out to clients. This enables some systems to send the chat
/// messages to otherwise out-of view entities (e.g. for multiple viewports from cameras).
/// </summary>
public record ExpandICChatRecipientstEvent(EntityUid Source, float VoiceRange, Dictionary<ICommonSession, ChatSystem.ICChatRecipientData> Recipients)
public record ExpandICChatRecipientsEvent(EntityUid Source, float VoiceRange, Dictionary<ICommonSession, ChatSystem.ICChatRecipientData> Recipients)
{
}

View File

@@ -24,6 +24,12 @@ public sealed partial class StationEventComponent : Component
[DataField]
public string? EndAnnouncement;
[DataField]
public Color StartAnnouncementColor = Color.Gold;
[DataField]
public Color EndAnnouncementColor = Color.Gold;
[DataField]
public SoundSpecifier? StartAudio;
@@ -42,12 +48,6 @@ public sealed partial class StationEventComponent : Component
[DataField]
public int ReoccurrenceDelay = 30;
/// <summary>
/// How long after being added does the event start
/// </summary>
[DataField]
public TimeSpan StartDelay = TimeSpan.Zero;
/// <summary>
/// How long the event lasts.
/// </summary>
@@ -75,13 +75,6 @@ public sealed partial class StationEventComponent : Component
[DataField]
public int? MaxOccurrences;
/// <summary>
/// When the station event starts.
/// </summary>
[DataField("startTime", customTypeSerializer: typeof(TimeOffsetSerializer))]
[AutoPausedField]
public TimeSpan StartTime;
/// <summary>
/// When the station event ends.
/// </summary>

View File

@@ -1,6 +1,5 @@
using Content.Server.Anomaly;
using Content.Server.GameTicking.Components;
using Content.Server.GameTicking.Rules.Components;
using Content.Server.Station.Components;
using Content.Server.StationEvents.Components;
@@ -12,11 +11,14 @@ public sealed class AnomalySpawnRule : StationEventSystem<AnomalySpawnRuleCompon
protected override void Added(EntityUid uid, AnomalySpawnRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args)
{
base.Added(uid, component, gameRule, args);
if (!TryComp<StationEventComponent>(uid, out var stationEvent))
return;
var str = Loc.GetString("anomaly-spawn-event-announcement",
("sighting", Loc.GetString($"anomaly-spawn-sighting-{RobustRandom.Next(1, 6)}")));
ChatSystem.DispatchGlobalAnnouncement(str, colorOverride: Color.FromHex("#18abf5"));
stationEvent.StartAnnouncement = str;
base.Added(uid, component, gameRule, args);
}
protected override void Started(EntityUid uid, AnomalySpawnRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)

View File

@@ -1,5 +1,4 @@
using Content.Server.GameTicking.Components;
using Content.Server.GameTicking.Rules.Components;
using Content.Server.StationEvents.Components;
using Robust.Shared.Random;
@@ -9,11 +8,14 @@ public sealed class BluespaceArtifactRule : StationEventSystem<BluespaceArtifact
{
protected override void Added(EntityUid uid, BluespaceArtifactRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args)
{
base.Added(uid, component, gameRule, args);
if (!TryComp<StationEventComponent>(uid, out var stationEvent))
return;
var str = Loc.GetString("bluespace-artifact-event-announcement",
("sighting", Loc.GetString(RobustRandom.Pick(component.PossibleSighting))));
ChatSystem.DispatchGlobalAnnouncement(str, colorOverride: Color.FromHex("#18abf5"));
stationEvent.StartAnnouncement = str;
base.Added(uid, component, gameRule, args);
}
protected override void Started(EntityUid uid, BluespaceArtifactRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)

View File

@@ -1,5 +1,4 @@
using Content.Server.GameTicking.Components;
using Content.Server.GameTicking.Rules.Components;
using Content.Server.Power.Components;
using Content.Server.Power.EntitySystems;
using Content.Server.Station.Components;
@@ -15,10 +14,14 @@ public sealed class BreakerFlipRule : StationEventSystem<BreakerFlipRuleComponen
protected override void Added(EntityUid uid, BreakerFlipRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args)
{
base.Added(uid, component, gameRule, args);
if (!TryComp<StationEventComponent>(uid, out var stationEvent))
return;
var str = Loc.GetString("station-event-breaker-flip-announcement", ("data", Loc.GetString(Loc.GetString($"random-sentience-event-data-{RobustRandom.Next(1, 6)}"))));
ChatSystem.DispatchGlobalAnnouncement(str, playSound: false, colorOverride: Color.Gold);
stationEvent.StartAnnouncement = str;
base.Added(uid, component, gameRule, args);
}
protected override void Started(EntityUid uid, BreakerFlipRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)

View File

@@ -3,7 +3,6 @@ using Content.Server.Cargo.Components;
using Content.Server.Cargo.Systems;
using Content.Server.GameTicking;
using Content.Server.GameTicking.Components;
using Content.Server.GameTicking.Rules.Components;
using Content.Server.Station.Components;
using Content.Server.StationEvents.Components;
using Robust.Shared.Prototypes;
@@ -18,11 +17,14 @@ public sealed class CargoGiftsRule : StationEventSystem<CargoGiftsRuleComponent>
protected override void Added(EntityUid uid, CargoGiftsRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args)
{
base.Added(uid, component, gameRule, args);
if (!TryComp<StationEventComponent>(uid, out var stationEvent))
return;
var str = Loc.GetString(component.Announce,
("sender", Loc.GetString(component.Sender)), ("description", Loc.GetString(component.Description)), ("dest", Loc.GetString(component.Dest)));
ChatSystem.DispatchGlobalAnnouncement(str, colorOverride: Color.FromHex("#18abf5"));
stationEvent.StartAnnouncement = str;
base.Added(uid, component, gameRule, args);
}
/// <summary>

View File

@@ -1,9 +1,7 @@
using System.Linq;
using Content.Server.GameTicking.Components;
using Content.Server.GameTicking.Rules.Components;
using Content.Server.StationEvents.Components;
using JetBrains.Annotations;
using Robust.Shared.Player;
using Robust.Shared.Random;
namespace Content.Server.StationEvents.Events;
@@ -15,15 +13,16 @@ public sealed class FalseAlarmRule : StationEventSystem<FalseAlarmRuleComponent>
protected override void Started(EntityUid uid, FalseAlarmRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)
{
base.Started(uid, component, gameRule, args);
if (!TryComp<StationEventComponent>(uid, out var stationEvent))
return;
var allEv = _event.AllEvents().Select(p => p.Value).ToList();
var picked = RobustRandom.Pick(allEv);
if (picked.StartAnnouncement != null)
{
ChatSystem.DispatchGlobalAnnouncement(Loc.GetString(picked.StartAnnouncement), playSound: false, colorOverride: Color.Gold);
}
Audio.PlayGlobal(picked.StartAudio, Filter.Broadcast(), true);
stationEvent.StartAnnouncement = picked.StartAnnouncement;
stationEvent.StartAudio = picked.StartAudio;
stationEvent.StartAnnouncementColor = picked.StartAnnouncementColor;
base.Started(uid, component, gameRule, args);
}
}

View File

@@ -29,10 +29,10 @@ namespace Content.Server.StationEvents.Events
component.LeakGas = RobustRandom.Pick(component.LeakableGases);
// Was 50-50 on using normal distribution.
var totalGas = RobustRandom.Next(component.MinimumGas, component.MaximumGas);
var startAfter = stationEvent.StartDelay;
component.MolesPerSecond = RobustRandom.Next(component.MinimumMolesPerSecond, component.MaximumMolesPerSecond);
stationEvent.EndTime = _timing.CurTime + TimeSpan.FromSeconds(totalGas / component.MolesPerSecond + startAfter.TotalSeconds);
if (gameRule.Delay is {} startAfter)
stationEvent.EndTime = _timing.CurTime + TimeSpan.FromSeconds(totalGas / component.MolesPerSecond + startAfter.Next(RobustRandom));
}
// Look technically if you wanted to guarantee a leak you'd do this in announcement but having the announcement

View File

@@ -1,14 +1,11 @@
using System.Linq;
using Content.Server.Administration.Logs;
using Content.Server.Chat.Systems;
using Content.Server.GameTicking.Components;
using Content.Server.GameTicking.Rules;
using Content.Server.GameTicking.Rules.Components;
using Content.Server.Station.Systems;
using Content.Server.StationEvents.Components;
using Content.Shared.Database;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Map;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
@@ -20,7 +17,6 @@ namespace Content.Server.StationEvents.Events;
public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : IComponent
{
[Dependency] protected readonly IAdminLogManager AdminLogManager = default!;
[Dependency] protected readonly IMapManager MapManager = default!;
[Dependency] protected readonly IPrototypeManager PrototypeManager = default!;
[Dependency] protected readonly ChatSystem ChatSystem = default!;
[Dependency] protected readonly SharedAudioSystem Audio = default!;
@@ -43,16 +39,12 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : ICompo
if (!TryComp<StationEventComponent>(uid, out var stationEvent))
return;
AdminLogManager.Add(LogType.EventAnnounced, $"Event added / announced: {ToPrettyString(uid)}");
if (stationEvent.StartAnnouncement != null)
{
ChatSystem.DispatchGlobalAnnouncement(Loc.GetString(stationEvent.StartAnnouncement), playSound: false, colorOverride: Color.Gold);
}
ChatSystem.DispatchGlobalAnnouncement(Loc.GetString(stationEvent.StartAnnouncement), playSound: false, colorOverride: stationEvent.StartAnnouncementColor);
Audio.PlayGlobal(stationEvent.StartAudio, Filter.Broadcast(), true);
stationEvent.StartTime = Timing.CurTime + stationEvent.StartDelay;
}
/// <inheritdoc/>
@@ -86,9 +78,7 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : ICompo
AdminLogManager.Add(LogType.EventStopped, $"Event ended: {ToPrettyString(uid)}");
if (stationEvent.EndAnnouncement != null)
{
ChatSystem.DispatchGlobalAnnouncement(Loc.GetString(stationEvent.EndAnnouncement), playSound: false, colorOverride: Color.Gold);
}
ChatSystem.DispatchGlobalAnnouncement(Loc.GetString(stationEvent.EndAnnouncement), playSound: false, colorOverride: stationEvent.EndAnnouncementColor);
Audio.PlayGlobal(stationEvent.EndAudio, Filter.Broadcast(), true);
}
@@ -108,11 +98,7 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : ICompo
if (!GameTicker.IsGameRuleAdded(uid, ruleData))
continue;
if (!GameTicker.IsGameRuleActive(uid, ruleData) && Timing.CurTime >= stationEvent.StartTime)
{
GameTicker.StartGameRule(uid, ruleData);
}
else if (stationEvent.EndTime != null && Timing.CurTime >= stationEvent.EndTime && GameTicker.IsGameRuleActive(uid, ruleData))
if (stationEvent.EndTime != null && Timing.CurTime >= stationEvent.EndTime && GameTicker.IsGameRuleActive(uid, ruleData))
{
GameTicker.EndGameRule(uid, ruleData);
}

View File

@@ -16,10 +16,10 @@ public sealed class SurveillanceCameraMicrophoneSystem : EntitySystem
SubscribeLocalEvent<SurveillanceCameraMicrophoneComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<SurveillanceCameraMicrophoneComponent, ListenEvent>(RelayEntityMessage);
SubscribeLocalEvent<SurveillanceCameraMicrophoneComponent, ListenAttemptEvent>(CanListen);
SubscribeLocalEvent<ExpandICChatRecipientstEvent>(OnExpandRecipients);
SubscribeLocalEvent<ExpandICChatRecipientsEvent>(OnExpandRecipients);
}
private void OnExpandRecipients(ExpandICChatRecipientstEvent ev)
private void OnExpandRecipients(ExpandICChatRecipientsEvent ev)
{
var xformQuery = GetEntityQuery<TransformComponent>();
var sourceXform = Transform(ev.Source);

View File

@@ -1,4 +1,4 @@
anomaly-spawn-event-announcement = Our readings have detected a dangerous interspacial anomaly. Please inform the research team of { $sighting }.
anomaly-spawn-event-announcement = Our readings have detected a dangerous interspacial anomaly. Please inform the research team about { $sighting }.
anomaly-spawn-sighting-1 = low pulsating sounds heard throughout the station
anomaly-spawn-sighting-2 = strange sources of light

View File

@@ -1,16 +1,30 @@
- type: entity
id: CargoGiftsBase
parent: BaseGameRule
abstract: true
components:
- type: GameRule
delay:
min: 10
max: 10
- type: StationEvent
startColor: "#18abf5"
startAudio:
path: /Audio/Announcements/announce.ogg
- type: CargoGiftsRule
sender: cargo-gift-default-sender
- type: entity
id: GiftsPizzaPartySmall
parent: BaseGameRule
parent: CargoGiftsBase
noSpawn: true
components:
- type: StationEvent
weight: 5
startDelay: 10
duration: 120
earliestStart: 20
- type: CargoGiftsRule
description: cargo-gift-pizza-small
sender: cargo-gift-default-sender
dest: cargo-gift-dest-bar
gifts:
FoodPizza: 1 # 4 pizzas
@@ -20,191 +34,173 @@
- type: entity
id: GiftsPizzaPartyLarge
parent: BaseGameRule
parent: CargoGiftsBase
noSpawn: true
components:
- type: StationEvent
weight: 2
startDelay: 10
duration: 240
earliestStart: 20
minimumPlayers: 40
- type: CargoGiftsRule
description: cargo-gift-pizza-large
sender: cargo-gift-default-sender
dest: cargo-gift-dest-bar
gifts:
FoodPizzaLarge: 1 # 16 pizzas
FoodBarSupply: 1
FoodSoftdrinksLarge: 1
- type: StationEvent
weight: 2
duration: 240
earliestStart: 20
minimumPlayers: 40
- type: CargoGiftsRule
description: cargo-gift-pizza-large
dest: cargo-gift-dest-bar
gifts:
FoodPizzaLarge: 1 # 16 pizzas
FoodBarSupply: 1
FoodSoftdrinksLarge: 1
- type: entity
id: GiftsEngineering
parent: BaseGameRule
parent: CargoGiftsBase
noSpawn: true
components:
- type: StationEvent
weight: 5
startDelay: 10
duration: 240
earliestStart: 30
minimumPlayers: 10
- type: CargoGiftsRule
description: cargo-gift-eng
sender: cargo-gift-default-sender
dest: cargo-gift-dest-eng
gifts:
EngineeringCableBulk: 1
AirlockKit: 1
MaterialSteel: 1
MaterialPlasteel: 1
MaterialGlass: 1
CrateVendingMachineRestockEngineering: 1
- type: StationEvent
weight: 5
duration: 240
earliestStart: 30
minimumPlayers: 10
- type: CargoGiftsRule
description: cargo-gift-eng
dest: cargo-gift-dest-eng
gifts:
EngineeringCableBulk: 1
AirlockKit: 1
MaterialSteel: 1
MaterialPlasteel: 1
MaterialGlass: 1
CrateVendingMachineRestockEngineering: 1
- type: entity
id: GiftsVendingRestock
parent: BaseGameRule
parent: CargoGiftsBase
noSpawn: true
components:
- type: StationEvent
weight: 4
startDelay: 10
duration: 120
minimumPlayers: 40
earliestStart: 30
- type: CargoGiftsRule
description: cargo-gift-vending
sender: cargo-gift-default-sender
dest: cargo-gift-dest-supp
gifts:
CrateVendingMachineRestockHotDrinks: 3
CrateVendingMachineRestockBooze: 1
CrateVendingMachineRestockNutriMax: 1
CrateVendingMachineRestockRobustSoftdrinks: 2
CrateVendingMachineRestockVendomat: 1
CrateVendingMachineRestockGetmoreChocolateCorp: 1
- type: StationEvent
weight: 4
duration: 120
minimumPlayers: 40
earliestStart: 30
- type: CargoGiftsRule
description: cargo-gift-vending
dest: cargo-gift-dest-supp
gifts:
CrateVendingMachineRestockHotDrinks: 3
CrateVendingMachineRestockBooze: 1
CrateVendingMachineRestockNutriMax: 1
CrateVendingMachineRestockRobustSoftdrinks: 2
CrateVendingMachineRestockVendomat: 1
CrateVendingMachineRestockGetmoreChocolateCorp: 1
- type: entity
id: GiftsJanitor
parent: BaseGameRule
parent: CargoGiftsBase
noSpawn: true
components:
- type: StationEvent
weight: 6
startDelay: 10
duration: 120
minimumPlayers: 30
earliestStart: 20
- type: CargoGiftsRule
description: cargo-gift-cleaning
sender: cargo-gift-default-sender
dest: cargo-gift-dest-janitor
gifts:
ServiceJanitorial: 2
ServiceLightsReplacement: 2
ServiceJanitorBiosuit: 1
- type: StationEvent
weight: 6
duration: 120
minimumPlayers: 30
earliestStart: 20
- type: CargoGiftsRule
description: cargo-gift-cleaning
dest: cargo-gift-dest-janitor
gifts:
ServiceJanitorial: 2
ServiceLightsReplacement: 2
ServiceJanitorBiosuit: 1
- type: entity
id: GiftsMedical
parent: BaseGameRule
parent: CargoGiftsBase
noSpawn: true
components:
- type: StationEvent
weight: 8
startDelay: 10
duration: 120
earliestStart: 20
minimumPlayers: 30
- type: CargoGiftsRule
description: cargo-gift-medical-supply
sender: cargo-gift-default-sender
dest: cargo-gift-dest-med
gifts:
MedicalSupplies: 1
MedicalChemistrySupplies: 1
EmergencyBruteKit: 1
EmergencyAdvancedKit: 1
MedicalBiosuit: 1
- type: StationEvent
weight: 8
duration: 120
earliestStart: 20
minimumPlayers: 30
- type: CargoGiftsRule
description: cargo-gift-medical-supply
dest: cargo-gift-dest-med
gifts:
MedicalSupplies: 1
MedicalChemistrySupplies: 1
EmergencyBruteKit: 1
EmergencyAdvancedKit: 1
MedicalBiosuit: 1
- type: entity
id: GiftsSpacingSupplies
parent: BaseGameRule
parent: CargoGiftsBase
noSpawn: true
components:
- type: StationEvent
weight: 4
startDelay: 10
duration: 120
earliestStart: 10
minimumPlayers: 40
- type: CargoGiftsRule
description: cargo-gift-space-protection
sender: cargo-gift-default-sender
dest: cargo-gift-dest-supp
gifts:
EmergencyInternalsLarge: 2
EmergencyInflatablewall: 1
EmergencyAdvancedKit: 1
MedicalBiosuit: 1
EmergencyO2Kit: 1
- type: StationEvent
weight: 4
duration: 120
earliestStart: 10
minimumPlayers: 40
- type: CargoGiftsRule
description: cargo-gift-space-protection
dest: cargo-gift-dest-supp
gifts:
EmergencyInternalsLarge: 2
EmergencyInflatablewall: 1
EmergencyAdvancedKit: 1
MedicalBiosuit: 1
EmergencyO2Kit: 1
- type: entity
id: GiftsFireProtection
parent: BaseGameRule
parent: CargoGiftsBase
noSpawn: true
components:
- type: StationEvent
weight: 4
startDelay: 10
duration: 120
earliestStart: 20
minimumPlayers: 40
- type: CargoGiftsRule
description: cargo-gift-fire-protection
sender: cargo-gift-default-sender
dest: cargo-gift-dest-supp
gifts:
EmergencyFire: 2
EmergencyBurnKit: 1
EmergencyBruteKit: 1
- type: StationEvent
weight: 4
duration: 120
earliestStart: 20
minimumPlayers: 40
- type: CargoGiftsRule
description: cargo-gift-fire-protection
dest: cargo-gift-dest-supp
gifts:
EmergencyFire: 2
EmergencyBurnKit: 1
EmergencyBruteKit: 1
- type: entity
id: GiftsSecurityGuns
parent: BaseGameRule
parent: CargoGiftsBase
noSpawn: true
components:
- type: StationEvent
weight: 3
startDelay: 10
duration: 120
earliestStart: 20
minimumPlayers: 50
- type: CargoGiftsRule
description: cargo-gift-security-guns
sender: cargo-gift-default-sender
dest: cargo-gift-dest-sec
gifts:
SecurityArmor: 3
ArmorySmg: 1
ArmoryShotgun: 1
ArmoryLaser: 1
- type: StationEvent
weight: 3
duration: 120
earliestStart: 20
minimumPlayers: 50
- type: CargoGiftsRule
description: cargo-gift-security-guns
dest: cargo-gift-dest-sec
gifts:
SecurityArmor: 3
ArmorySmg: 1
ArmoryShotgun: 1
ArmoryLaser: 1
- type: entity
id: GiftsSecurityRiot
parent: BaseGameRule
parent: CargoGiftsBase
noSpawn: true
components:
- type: StationEvent
weight: 4
startDelay: 10
duration: 120
earliestStart: 20
minimumPlayers: 50
- type: CargoGiftsRule
description: cargo-gift-security-riot
sender: cargo-gift-default-sender
dest: cargo-gift-dest-sec
gifts:
SecurityRiot: 2
SecurityRestraints: 2
SecurityNonLethal: 2
- type: StationEvent
weight: 4
duration: 120
earliestStart: 20
minimumPlayers: 50
- type: CargoGiftsRule
description: cargo-gift-security-riot
dest: cargo-gift-dest-sec
gifts:
SecurityRiot: 2
SecurityRestraints: 2
SecurityNonLethal: 2

View File

@@ -1,22 +1,63 @@
- type: entity
id: BaseStationEvent
parent: BaseGameRule
abstract: true
noSpawn: true
components:
- type: GameRule
delay:
min: 10
max: 20
- type: entity
id: BaseStationEventShortDelay
parent: BaseGameRule
abstract: true
noSpawn: true
components:
- type: GameRule
delay:
min: 10
max: 20
- type: entity
id: BaseStationEventLongDelay
parent: BaseGameRule
abstract: true
noSpawn: true
components:
- type: GameRule
delay:
min: 40
max: 60
- type: entity
id: AnomalySpawn
parent: BaseGameRule
parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
startAnnouncementColor: "#18abf5"
startAudio:
path: /Audio/Announcements/announce.ogg
weight: 8
startDelay: 30
duration: 35
- type: AnomalySpawnRule
- type: entity
id: BluespaceArtifact
parent: BaseGameRule
parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: GameRule
delay:
min: 30
max: 30
- type: StationEvent
startAnnouncementColor: "#18abf5"
startAudio:
path: /Audio/Announcements/announce.ogg
weight: 8
startDelay: 30
duration: 35
- type: BluespaceArtifactRule
@@ -148,7 +189,7 @@
- type: entity
id: GasLeak
parent: BaseGameRule
parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
@@ -157,25 +198,23 @@
path: /Audio/Announcements/attention.ogg
endAnnouncement: station-event-gas-leak-end-announcement
weight: 8
startDelay: 20
- type: GasLeakRule
- type: entity
id: KudzuGrowth
parent: BaseGameRule
parent: BaseStationEventLongDelay
noSpawn: true
components:
- type: StationEvent
earliestStart: 15
minimumPlayers: 15
weight: 7
startDelay: 50
duration: 240
- type: KudzuGrowthRule
- type: entity
id: MeteorSwarm
parent: BaseGameRule
parent: BaseStationEventLongDelay
noSpawn: true
components:
- type: StationEvent
@@ -189,19 +228,17 @@
params:
volume: -4
duration: null #ending is handled by MeteorSwarmRule
startDelay: 30
- type: MeteorSwarmRule
- type: entity
id: MouseMigration
parent: BaseGameRule
parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
startAnnouncement: station-event-vent-creatures-start-announcement
startAudio:
path: /Audio/Announcements/attention.ogg
startDelay: 10
earliestStart: 15
weight: 6
duration: 50
@@ -221,14 +258,13 @@
- type: entity
id: CockroachMigration
parent: BaseGameRule
parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
startAnnouncement: station-event-vent-creatures-start-announcement
startAudio:
path: /Audio/Announcements/attention.ogg
startDelay: 10
weight: 6
duration: 50
- type: VentCrittersRule
@@ -240,7 +276,7 @@
- type: entity
id: PowerGridCheck
parent: BaseGameRule
parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
@@ -251,7 +287,6 @@
path: /Audio/Announcements/power_off.ogg
params:
volume: -4
startDelay: 24
duration: 60
maxDuration: 120
- type: PowerGridCheckRule
@@ -300,7 +335,7 @@
- type: entity
id: VentClog
parent: BaseGameRule
parent: BaseStationEventLongDelay
noSpawn: true
components:
- type: StationEvent
@@ -310,20 +345,18 @@
earliestStart: 15
minimumPlayers: 15
weight: 5
startDelay: 50
duration: 60
- type: VentClogRule
- type: entity
id: SlimesSpawn
parent: BaseGameRule
parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
startAnnouncement: station-event-vent-creatures-start-announcement
startAudio:
path: /Audio/Announcements/attention.ogg
startDelay: 10
earliestStart: 20
minimumPlayers: 15
weight: 5
@@ -339,14 +372,13 @@
- type: entity
id: SpiderSpawn
parent: BaseGameRule
parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
startAnnouncement: station-event-vent-creatures-start-announcement
startAudio:
path: /Audio/Announcements/attention.ogg
startDelay: 10
earliestStart: 20
minimumPlayers: 15
weight: 5
@@ -358,14 +390,13 @@
- type: entity
id: SpiderClownSpawn
parent: BaseGameRule
parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
startAnnouncement: station-event-vent-creatures-start-announcement
startAudio:
path: /Audio/Announcements/attention.ogg
startDelay: 10
earliestStart: 20
minimumPlayers: 20
weight: 1.5