From 97b14b5f240e14acf22a0672884786d08543cd9a Mon Sep 17 00:00:00 2001 From: Zack Backmen Date: Sun, 23 Feb 2025 15:26:25 +0300 Subject: [PATCH 1/8] fix-psi --- .../GlimmerStationEventSchedulerComponent.cs | 36 ++++ .../GlimmerStationEventSchedulerSystem.cs | 80 ++++++++ .../Backmen/CCVar/CCVars.DiscordAuth.cs | 31 +++ .../Backmen/CCVar/CCVars.Glimmer.cs | 30 +++ .../Backmen/CCVar/CCVars.JoinQueue.cs | 19 ++ Content.Shared/Backmen/CCVar/CCVars.Mood.cs | 18 ++ .../Backmen/CCVar/CCVars.Sponsor.cs | 19 ++ .../Backmen/CCVar/CCVars.Supermatter.cs | 51 +++++ .../Backmen/CCVar/CCVars.Surgery.cs | 10 + Content.Shared/Backmen/CCVar/CCVars.cs | 177 +----------------- Content.Shared/Backmen/CCVar/CCVars.gpt.cs | 27 +++ .../Prototypes/_Backmen/GameRules/events.yml | 12 +- 12 files changed, 332 insertions(+), 178 deletions(-) create mode 100644 Content.Server/Backmen/Psionics/Glimmer/Components/GlimmerStationEventSchedulerComponent.cs create mode 100644 Content.Server/Backmen/Psionics/Glimmer/GlimmerStationEventSchedulerSystem.cs create mode 100644 Content.Shared/Backmen/CCVar/CCVars.DiscordAuth.cs create mode 100644 Content.Shared/Backmen/CCVar/CCVars.Glimmer.cs create mode 100644 Content.Shared/Backmen/CCVar/CCVars.JoinQueue.cs create mode 100644 Content.Shared/Backmen/CCVar/CCVars.Mood.cs create mode 100644 Content.Shared/Backmen/CCVar/CCVars.Sponsor.cs create mode 100644 Content.Shared/Backmen/CCVar/CCVars.Supermatter.cs create mode 100644 Content.Shared/Backmen/CCVar/CCVars.Surgery.cs create mode 100644 Content.Shared/Backmen/CCVar/CCVars.gpt.cs diff --git a/Content.Server/Backmen/Psionics/Glimmer/Components/GlimmerStationEventSchedulerComponent.cs b/Content.Server/Backmen/Psionics/Glimmer/Components/GlimmerStationEventSchedulerComponent.cs new file mode 100644 index 00000000000..59ff8d4ae32 --- /dev/null +++ b/Content.Server/Backmen/Psionics/Glimmer/Components/GlimmerStationEventSchedulerComponent.cs @@ -0,0 +1,36 @@ +using Content.Server.StationEvents; +using Content.Server.StationEvents.Components; +using Content.Shared.EntityTable.EntitySelectors; + +namespace Content.Server.Backmen.Psionics.Glimmer.Components; + +/// +/// Компонент для управления событиями, основанными на уровне сияния. +/// +[RegisterComponent] +public sealed partial class GlimmerStationEventSchedulerComponent : Component +{ + /// + /// Время до следующего события (в секундах). + /// + [DataField("timeUntilNextEvent")] + public float TimeUntilNextEvent = 0f; + + /// + /// Минимальное время до следующего события (в секундах). + /// + [DataField("minEventInterval")] + public float MinEventInterval = 120f; + + /// + /// Максимальное время до следующего события (в секундах). + /// + [DataField("maxEventInterval")] + public float MaxEventInterval = 600f; + + /// + /// Игровые правила, которые планировщик может выбрать. + /// + [DataField(required: true)] + public EntityTableSelector ScheduledGameRules = default!; +} diff --git a/Content.Server/Backmen/Psionics/Glimmer/GlimmerStationEventSchedulerSystem.cs b/Content.Server/Backmen/Psionics/Glimmer/GlimmerStationEventSchedulerSystem.cs new file mode 100644 index 00000000000..edcb2bee995 --- /dev/null +++ b/Content.Server/Backmen/Psionics/Glimmer/GlimmerStationEventSchedulerSystem.cs @@ -0,0 +1,80 @@ +using Content.Server.Backmen.Psionics.Glimmer.Components; +using Content.Server.GameTicking; +using Content.Server.GameTicking.Rules; +using Content.Server.StationEvents; +using Content.Shared.Backmen.Psionics.Glimmer; +using Content.Shared.GameTicking.Components; +using Robust.Shared.Random; + +namespace Content.Server.Backmen.Psionics.Glimmer; + +/// +/// Система, запускающая события в зависимости от уровня сияния. +/// +public sealed class GlimmerStationEventSchedulerSystem : GameRuleSystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; + [Dependency] private readonly EventManagerSystem _event = default!; + + protected override void Started(EntityUid uid, GlimmerStationEventSchedulerComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) + { + base.Started(uid, component, gameRule, args); + PickNextEventTime(uid, component); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + if (!_event.EventsEnabled) + return; + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var scheduler, out var gameRule)) + { + if (!GameTicker.IsGameRuleActive(uid, gameRule)) + continue; + + if (scheduler.TimeUntilNextEvent > 0f) + { + scheduler.TimeUntilNextEvent -= frameTime; + continue; + } + + PickNextEventTime(uid, scheduler); + _event.RunRandomEvent(scheduler.ScheduledGameRules); + } + } + + /// + /// Задаёт время до следующего события в зависимости от уровня сияния. + /// + private void PickNextEventTime(EntityUid uid, GlimmerStationEventSchedulerComponent component) + { + var tier = _glimmerSystem.GetGlimmerTier(); + var glimmerMod = GetGlimmerModifier(tier); + + // Интервал задается на основе значений из компонента + component.TimeUntilNextEvent = _random.NextFloat( + component.MinEventInterval / glimmerMod, + component.MaxEventInterval / glimmerMod + ); + } + + /// + /// Модификатор частоты событий в зависимости от уровня сияния. + /// + private float GetGlimmerModifier(GlimmerTier tier) + { + return tier switch + { + GlimmerTier.Minimal => 1f, + GlimmerTier.Low => 1.5f, + GlimmerTier.Moderate => 2f, + GlimmerTier.High => 3f, + GlimmerTier.Dangerous => 4f, + _ => 5f, // Critical + }; + } +} diff --git a/Content.Shared/Backmen/CCVar/CCVars.DiscordAuth.cs b/Content.Shared/Backmen/CCVar/CCVars.DiscordAuth.cs new file mode 100644 index 00000000000..725b9b0f0d3 --- /dev/null +++ b/Content.Shared/Backmen/CCVar/CCVars.DiscordAuth.cs @@ -0,0 +1,31 @@ +using Robust.Shared.Configuration; + +namespace Content.Shared.Backmen.CCVar; + +public sealed partial class CCVars +{ + /* + * Discord Auth + */ + + /// + /// Enabled Discord linking, show linking button and modal window + /// + public static readonly CVarDef DiscordAuthEnabled = + CVarDef.Create("discord_auth.enabled", false, CVar.SERVER | CVar.REPLICATED); + + /// + /// URL of the Discord auth server API + /// + public static readonly CVarDef DiscordAuthApiUrl = + CVarDef.Create("discord_auth.api_url", "", CVar.SERVERONLY); + + /// + /// Secret key of the Discord auth server API + /// + public static readonly CVarDef DiscordAuthApiKey = + CVarDef.Create("discord_auth.api_key", "", CVar.SERVERONLY | CVar.CONFIDENTIAL); + + public static readonly CVarDef DiscordAuthIsOptional = + CVarDef.Create("discord_auth.is_opt", false, CVar.SERVER | CVar.REPLICATED); +} diff --git a/Content.Shared/Backmen/CCVar/CCVars.Glimmer.cs b/Content.Shared/Backmen/CCVar/CCVars.Glimmer.cs new file mode 100644 index 00000000000..11157de4237 --- /dev/null +++ b/Content.Shared/Backmen/CCVar/CCVars.Glimmer.cs @@ -0,0 +1,30 @@ +using Robust.Shared.Configuration; + +namespace Content.Shared.Backmen.CCVar; + +public sealed partial class CCVars +{ + /* + * Glimmer + */ + + /// + /// Whether glimmer is enabled. + /// + public static readonly CVarDef GlimmerEnabled = + CVarDef.Create("glimmer.enabled", true, CVar.REPLICATED); + + /// + /// Passive glimmer drain per second. + /// Note that this is randomized and this is an average value. + /// + public static readonly CVarDef GlimmerLostPerSecond = + CVarDef.Create("glimmer.passive_drain_per_second", 0.1f, CVar.SERVERONLY); + + /// + /// Whether random rolls for psionics are allowed. + /// Guaranteed psionics will still go through. + /// + public static readonly CVarDef PsionicRollsEnabled = + CVarDef.Create("psionics.rolls_enabled", true, CVar.SERVERONLY); +} diff --git a/Content.Shared/Backmen/CCVar/CCVars.JoinQueue.cs b/Content.Shared/Backmen/CCVar/CCVars.JoinQueue.cs new file mode 100644 index 00000000000..918de018d4b --- /dev/null +++ b/Content.Shared/Backmen/CCVar/CCVars.JoinQueue.cs @@ -0,0 +1,19 @@ +using Robust.Shared.Configuration; + +namespace Content.Shared.Backmen.CCVar; + +public sealed partial class CCVars +{ + /* + * Queue + */ + + /// + /// Controls if the connections queue is enabled. If enabled stop kicking new players after `SoftMaxPlayers` cap and instead add them to queue. + /// + public static readonly CVarDef + QueueEnabled = CVarDef.Create("queue.enabled", false, CVar.SERVERONLY); + + public static readonly CVarDef + QueueAltEnabled = CVarDef.Create("queue.alt_servers", false, CVar.SERVERONLY); +} diff --git a/Content.Shared/Backmen/CCVar/CCVars.Mood.cs b/Content.Shared/Backmen/CCVar/CCVars.Mood.cs new file mode 100644 index 00000000000..59acb078578 --- /dev/null +++ b/Content.Shared/Backmen/CCVar/CCVars.Mood.cs @@ -0,0 +1,18 @@ +using Robust.Shared.Configuration; + +namespace Content.Shared.Backmen.CCVar; + +public sealed partial class CCVars +{ + public static readonly CVarDef MoodEnabled = + CVarDef.Create("mood.enabled", true, CVar.SERVER); + + public static readonly CVarDef MoodIncreasesSpeed = + CVarDef.Create("mood.increases_speed", true, CVar.SERVER); + + public static readonly CVarDef MoodDecreasesSpeed = + CVarDef.Create("mood.decreases_speed", true, CVar.SERVER); + + public static readonly CVarDef MoodModifiesThresholds = + CVarDef.Create("mood.modify_thresholds", false, CVar.SERVER); +} diff --git a/Content.Shared/Backmen/CCVar/CCVars.Sponsor.cs b/Content.Shared/Backmen/CCVar/CCVars.Sponsor.cs new file mode 100644 index 00000000000..20eccfffa73 --- /dev/null +++ b/Content.Shared/Backmen/CCVar/CCVars.Sponsor.cs @@ -0,0 +1,19 @@ +using Robust.Shared.Configuration; + +namespace Content.Shared.Backmen.CCVar; + +public sealed partial class CCVars +{ + /** + * Sponsors + */ + + /// + /// URL of the sponsors server API. + /// + public static readonly CVarDef SponsorsApiUrl = + CVarDef.Create("sponsor.api_url", "", CVar.SERVERONLY); + + public static readonly CVarDef SponsorsSelectedGhost = + CVarDef.Create("sponsor.ghost", "", CVar.REPLICATED | CVar.CLIENT | CVar.ARCHIVE); +} diff --git a/Content.Shared/Backmen/CCVar/CCVars.Supermatter.cs b/Content.Shared/Backmen/CCVar/CCVars.Supermatter.cs new file mode 100644 index 00000000000..d5f97a0ac48 --- /dev/null +++ b/Content.Shared/Backmen/CCVar/CCVars.Supermatter.cs @@ -0,0 +1,51 @@ +using Robust.Shared.Configuration; + +namespace Content.Shared.Backmen.CCVar; + +public sealed partial class CCVars +{ + /// + /// With completely default supermatter values, Singuloose delamination will occur if engineers inject at least 900 moles of coolant per tile + /// in the crystal chamber. For reference, a gas canister contains 1800 moles of air. This Cvar directly multiplies the amount of moles required to singuloose. + /// + public static readonly CVarDef SupermatterSingulooseMolesModifier = + CVarDef.Create("supermatter.singuloose_moles_modifier", 1f, CVar.SERVER); + + /// + /// Toggles whether or not Singuloose delaminations can occur. If both Singuloose and Tesloose are disabled, it will always delam into a Nuke. + /// + public static readonly CVarDef SupermatterDoSingulooseDelam = + CVarDef.Create("supermatter.do_singuloose", true, CVar.SERVER); + + /// + /// By default, Supermatter will "Tesloose" if the conditions for Singuloose are not met, and the core's power is at least 4000. + /// The actual reasons for being at least this amount vary by how the core was screwed up, but traditionally it's caused by "The core is on fire". + /// This Cvar multiplies said power threshold for the purpose of determining if the delam is a Tesloose. + /// + public static readonly CVarDef SupermatterTesloosePowerModifier = + CVarDef.Create("supermatter.tesloose_power_modifier", 1f, CVar.SERVER); + + /// + /// Toggles whether or not Tesloose delaminations can occur. If both Singuloose and Tesloose are disabled, it will always delam into a Nuke. + /// + public static readonly CVarDef SupermatterDoTeslooseDelam = + CVarDef.Create("supermatter.do_tesloose", true, CVar.SERVER); + + /// + /// When true, bypass the normal checks to determine delam type, and instead use the type chosen by supermatter.forced_delam_type + /// + public static readonly CVarDef SupermatterDoForceDelam = + CVarDef.Create("supermatter.do_force_delam", false, CVar.SERVER); + + /// + /// If supermatter.do_force_delam is true, this determines the delamination type, bypassing the normal checks. + /// + public static readonly CVarDef SupermatterForcedDelamType = + CVarDef.Create("supermatter.forced_delam_type", "Singulo", CVar.SERVER); + + /// + /// Directly multiplies the amount of rads put out by the supermatter. Be VERY conservative with this. + /// + public static readonly CVarDef SupermatterRadsModifier = + CVarDef.Create("supermatter.rads_modifier", 1f, CVar.SERVER); +} diff --git a/Content.Shared/Backmen/CCVar/CCVars.Surgery.cs b/Content.Shared/Backmen/CCVar/CCVars.Surgery.cs new file mode 100644 index 00000000000..46b6137cb44 --- /dev/null +++ b/Content.Shared/Backmen/CCVar/CCVars.Surgery.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Configuration; + +namespace Content.Shared.Backmen.CCVar; + +public sealed partial class CCVars +{ + + public static readonly CVarDef CanOperateOnSelf = + CVarDef.Create("surgery.can_operate_on_self", false, CVar.SERVERONLY); +} diff --git a/Content.Shared/Backmen/CCVar/CCVars.cs b/Content.Shared/Backmen/CCVar/CCVars.cs index c712dde4b02..b44dd2d67b6 100644 --- a/Content.Shared/Backmen/CCVar/CCVars.cs +++ b/Content.Shared/Backmen/CCVar/CCVars.cs @@ -4,83 +4,16 @@ namespace Content.Shared.Backmen.CCVar; // ReSharper disable once InconsistentNaming [CVarDefs] -public sealed class CCVars +public sealed partial class CCVars { public static readonly CVarDef GameDiseaseEnabled = CVarDef.Create("game.disease", true, CVar.SERVERONLY); - /* - * GPT - */ - public static readonly CVarDef - GptEnabled = CVarDef.Create("gpt.enabled", false, CVar.SERVERONLY); - - public static readonly CVarDef - GptModel = CVarDef.Create("gpt.model", "gpt-3.5-turbo-0613", CVar.SERVERONLY); - - public static readonly CVarDef - GptApiUrl = CVarDef.Create("gpt.api", "https://api.openai.com/v1/", CVar.SERVERONLY | CVar.CONFIDENTIAL); - - public static readonly CVarDef - GptApiToken = CVarDef.Create("gpt.token", "", CVar.SERVERONLY | CVar.CONFIDENTIAL); - - public static readonly CVarDef - GptApiGigaToken = CVarDef.Create("gpt.giga_token", "", CVar.SERVERONLY | CVar.CONFIDENTIAL); - - public static readonly CVarDef - GptApiNoAdminAuto = CVarDef.Create("gpt.no_admin_auto", false, CVar.SERVERONLY | CVar.CONFIDENTIAL); - - /* - * Queue - */ - - /// - /// Controls if the connections queue is enabled. If enabled stop kicking new players after `SoftMaxPlayers` cap and instead add them to queue. - /// - public static readonly CVarDef - QueueEnabled = CVarDef.Create("queue.enabled", false, CVar.SERVERONLY); - - public static readonly CVarDef - QueueAltEnabled = CVarDef.Create("queue.alt_servers", false, CVar.SERVERONLY); - - /* - * Discord Auth - */ - - /// - /// Enabled Discord linking, show linking button and modal window - /// - public static readonly CVarDef DiscordAuthEnabled = - CVarDef.Create("discord_auth.enabled", false, CVar.SERVER | CVar.REPLICATED); - /// - /// URL of the Discord auth server API - /// - public static readonly CVarDef DiscordAuthApiUrl = - CVarDef.Create("discord_auth.api_url", "", CVar.SERVERONLY); - - /// - /// Secret key of the Discord auth server API - /// - public static readonly CVarDef DiscordAuthApiKey = - CVarDef.Create("discord_auth.api_key", "", CVar.SERVERONLY | CVar.CONFIDENTIAL); - - public static readonly CVarDef DiscordAuthIsOptional = - CVarDef.Create("discord_auth.is_opt", false, CVar.SERVER | CVar.REPLICATED); - - /** - * Sponsors - */ - - /// - /// URL of the sponsors server API. + /// Whether the Shipyard is enabled. /// - public static readonly CVarDef SponsorsApiUrl = - CVarDef.Create("sponsor.api_url", "", CVar.SERVERONLY); - - public static readonly CVarDef SponsorsSelectedGhost = - CVarDef.Create("sponsor.ghost", "", CVar.REPLICATED | CVar.CLIENT | CVar.ARCHIVE); - + public static readonly CVarDef Shipyard = + CVarDef.Create("shuttle.shipyard", true, CVar.SERVERONLY); public static readonly CVarDef EconomyWagesEnabled = CVarDef.Create("economy.wages_enabled", true, CVar.SERVERONLY); @@ -88,36 +21,6 @@ public static readonly CVarDef public static readonly CVarDef WhitelistRolesEnabled = CVarDef.Create("game.whitelist_role_enabled", true, CVar.SERVER | CVar.REPLICATED); - /// - /// Whether the Shipyard is enabled. - /// - public static readonly CVarDef Shipyard = - CVarDef.Create("shuttle.shipyard", true, CVar.SERVERONLY); - - /* - * Glimmer - */ - - /// - /// Whether glimmer is enabled. - /// - public static readonly CVarDef GlimmerEnabled = - CVarDef.Create("glimmer.enabled", true, CVar.REPLICATED); - - /// - /// Passive glimmer drain per second. - /// Note that this is randomized and this is an average value. - /// - public static readonly CVarDef GlimmerLostPerSecond = - CVarDef.Create("glimmer.passive_drain_per_second", 0.1f, CVar.SERVERONLY); - - /// - /// Whether random rolls for psionics are allowed. - /// Guaranteed psionics will still go through. - /// - public static readonly CVarDef PsionicRollsEnabled = - CVarDef.Create("psionics.rolls_enabled", true, CVar.SERVERONLY); - /// /// Shipwrecked /// @@ -212,76 +115,4 @@ public static readonly CVarDef /// public static readonly CVarDef StrictPipeStacking = CVarDef.Create("atmos.strict_pipe_stacking", false, CVar.SERVERONLY); - - #region Supermatter System - - /// - /// With completely default supermatter values, Singuloose delamination will occur if engineers inject at least 900 moles of coolant per tile - /// in the crystal chamber. For reference, a gas canister contains 1800 moles of air. This Cvar directly multiplies the amount of moles required to singuloose. - /// - public static readonly CVarDef SupermatterSingulooseMolesModifier = - CVarDef.Create("supermatter.singuloose_moles_modifier", 1f, CVar.SERVER); - - /// - /// Toggles whether or not Singuloose delaminations can occur. If both Singuloose and Tesloose are disabled, it will always delam into a Nuke. - /// - public static readonly CVarDef SupermatterDoSingulooseDelam = - CVarDef.Create("supermatter.do_singuloose", true, CVar.SERVER); - - /// - /// By default, Supermatter will "Tesloose" if the conditions for Singuloose are not met, and the core's power is at least 4000. - /// The actual reasons for being at least this amount vary by how the core was screwed up, but traditionally it's caused by "The core is on fire". - /// This Cvar multiplies said power threshold for the purpose of determining if the delam is a Tesloose. - /// - public static readonly CVarDef SupermatterTesloosePowerModifier = - CVarDef.Create("supermatter.tesloose_power_modifier", 1f, CVar.SERVER); - - /// - /// Toggles whether or not Tesloose delaminations can occur. If both Singuloose and Tesloose are disabled, it will always delam into a Nuke. - /// - public static readonly CVarDef SupermatterDoTeslooseDelam = - CVarDef.Create("supermatter.do_tesloose", true, CVar.SERVER); - - /// - /// When true, bypass the normal checks to determine delam type, and instead use the type chosen by supermatter.forced_delam_type - /// - public static readonly CVarDef SupermatterDoForceDelam = - CVarDef.Create("supermatter.do_force_delam", false, CVar.SERVER); - - /// - /// If supermatter.do_force_delam is true, this determines the delamination type, bypassing the normal checks. - /// - public static readonly CVarDef SupermatterForcedDelamType = - CVarDef.Create("supermatter.forced_delam_type", "Singulo", CVar.SERVER); - - /// - /// Directly multiplies the amount of rads put out by the supermatter. Be VERY conservative with this. - /// - public static readonly CVarDef SupermatterRadsModifier = - CVarDef.Create("supermatter.rads_modifier", 1f, CVar.SERVER); - - #endregion - - #region Surgery - - public static readonly CVarDef CanOperateOnSelf = - CVarDef.Create("surgery.can_operate_on_self", false, CVar.SERVERONLY); - - #endregion - - #region Mood System - - public static readonly CVarDef MoodEnabled = - CVarDef.Create("mood.enabled", true, CVar.SERVER); - - public static readonly CVarDef MoodIncreasesSpeed = - CVarDef.Create("mood.increases_speed", true, CVar.SERVER); - - public static readonly CVarDef MoodDecreasesSpeed = - CVarDef.Create("mood.decreases_speed", true, CVar.SERVER); - - public static readonly CVarDef MoodModifiesThresholds = - CVarDef.Create("mood.modify_thresholds", false, CVar.SERVER); - - #endregion } diff --git a/Content.Shared/Backmen/CCVar/CCVars.gpt.cs b/Content.Shared/Backmen/CCVar/CCVars.gpt.cs new file mode 100644 index 00000000000..6bcb59095cc --- /dev/null +++ b/Content.Shared/Backmen/CCVar/CCVars.gpt.cs @@ -0,0 +1,27 @@ +using Robust.Shared.Configuration; + +namespace Content.Shared.Backmen.CCVar; + +public sealed partial class CCVars +{ + /* + * GPT + */ + public static readonly CVarDef + GptEnabled = CVarDef.Create("gpt.enabled", false, CVar.SERVERONLY); + + public static readonly CVarDef + GptModel = CVarDef.Create("gpt.model", "gpt-3.5-turbo-0613", CVar.SERVERONLY); + + public static readonly CVarDef + GptApiUrl = CVarDef.Create("gpt.api", "https://api.openai.com/v1/", CVar.SERVERONLY | CVar.CONFIDENTIAL); + + public static readonly CVarDef + GptApiToken = CVarDef.Create("gpt.token", "", CVar.SERVERONLY | CVar.CONFIDENTIAL); + + public static readonly CVarDef + GptApiGigaToken = CVarDef.Create("gpt.giga_token", "", CVar.SERVERONLY | CVar.CONFIDENTIAL); + + public static readonly CVarDef + GptApiNoAdminAuto = CVarDef.Create("gpt.no_admin_auto", false, CVar.SERVERONLY | CVar.CONFIDENTIAL); +} diff --git a/Resources/Prototypes/_Backmen/GameRules/events.yml b/Resources/Prototypes/_Backmen/GameRules/events.yml index 771bf94f419..0e507754316 100644 --- a/Resources/Prototypes/_Backmen/GameRules/events.yml +++ b/Resources/Prototypes/_Backmen/GameRules/events.yml @@ -3,11 +3,7 @@ id: PsiScheduler components: - type: GameRule - - type: BasicStationEventScheduler - minimumTimeUntilFirstEvent: 0 - minMaxEventTiming: - min: 240 # 4 min - max: 480 # 8 min + - type: GlimmerStationEventScheduler scheduledGameRules: !type:NestedSelector tableId: PsiBackmenEventsTable @@ -217,6 +213,12 @@ parent: BaseGlimmerEvent categories: [ HideSpawnMenu ] components: + - type: StationEvent + weight: 5 + duration: 1 + earliestStart: 50 + minimumPlayers: 20 + maxOccurrences: 2 - type: GlimmerEvent minimumGlimmer: 500 maximumGlimmer: 900 From 4b5ba701a5951920779917ebf91358ff9f96a44b Mon Sep 17 00:00:00 2001 From: Zack Backmen Date: Sun, 23 Feb 2025 19:13:27 +0300 Subject: [PATCH 2/8] Update CCVars.Mood.cs --- Content.Shared/Backmen/CCVar/CCVars.Mood.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Content.Shared/Backmen/CCVar/CCVars.Mood.cs b/Content.Shared/Backmen/CCVar/CCVars.Mood.cs index 59acb078578..0303494de22 100644 --- a/Content.Shared/Backmen/CCVar/CCVars.Mood.cs +++ b/Content.Shared/Backmen/CCVar/CCVars.Mood.cs @@ -5,14 +5,14 @@ namespace Content.Shared.Backmen.CCVar; public sealed partial class CCVars { public static readonly CVarDef MoodEnabled = - CVarDef.Create("mood.enabled", true, CVar.SERVER); + CVarDef.Create("mood.enabled", true, CVar.SERVERONLY); public static readonly CVarDef MoodIncreasesSpeed = - CVarDef.Create("mood.increases_speed", true, CVar.SERVER); + CVarDef.Create("mood.increases_speed", true, CVar.SERVERONLY); public static readonly CVarDef MoodDecreasesSpeed = - CVarDef.Create("mood.decreases_speed", true, CVar.SERVER); + CVarDef.Create("mood.decreases_speed", true, CVar.SERVERONLY); public static readonly CVarDef MoodModifiesThresholds = - CVarDef.Create("mood.modify_thresholds", false, CVar.SERVER); + CVarDef.Create("mood.modify_thresholds", false, CVar.SERVERONLY); } From 10232ed62088432aa67b04bd189f7eae2bcefaf7 Mon Sep 17 00:00:00 2001 From: Zack Backmen Date: Sun, 23 Feb 2025 19:39:47 +0300 Subject: [PATCH 3/8] Update CCVars.Mood.cs --- Content.Shared/Backmen/CCVar/CCVars.Mood.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Shared/Backmen/CCVar/CCVars.Mood.cs b/Content.Shared/Backmen/CCVar/CCVars.Mood.cs index 0303494de22..7d4ea59005a 100644 --- a/Content.Shared/Backmen/CCVar/CCVars.Mood.cs +++ b/Content.Shared/Backmen/CCVar/CCVars.Mood.cs @@ -5,10 +5,10 @@ namespace Content.Shared.Backmen.CCVar; public sealed partial class CCVars { public static readonly CVarDef MoodEnabled = - CVarDef.Create("mood.enabled", true, CVar.SERVERONLY); + CVarDef.Create("mood.enabled", true, CVar.SERVER | CVar.REPLICATED); public static readonly CVarDef MoodIncreasesSpeed = - CVarDef.Create("mood.increases_speed", true, CVar.SERVERONLY); + CVarDef.Create("mood.increases_speed", false, CVar.SERVERONLY); public static readonly CVarDef MoodDecreasesSpeed = CVarDef.Create("mood.decreases_speed", true, CVar.SERVERONLY); From 1bc06d0fbd126702a1d643a55ea606271fa0baf3 Mon Sep 17 00:00:00 2001 From: Zack Backmen Date: Mon, 24 Feb 2025 12:05:51 +0300 Subject: [PATCH 4/8] Merge branch 'master' into fix-psi From c68889e946753fdac9a0db8b9c73b24fb3af895c Mon Sep 17 00:00:00 2001 From: Zack Backmen Date: Mon, 24 Feb 2025 12:29:46 +0300 Subject: [PATCH 5/8] v3 --- .../Glimmer/Structures/GlimmerStructuresSystem.cs | 7 +++++-- .../Events/GlimmerRevenantSpawnRule.cs | 3 +++ .../StationEvents/Events/GlimmerWispSpawnRule.cs | 3 +++ .../Entities/Objects/Specific/Medical/morgue.yml | 6 ++++-- Resources/Prototypes/_Backmen/GameRules/events.yml | 13 ++++++++++--- Resources/Prototypes/_Backmen/Reactions/psionic.yml | 10 +++++----- .../_Backmen/Guidebook/Epistemics/Psionics.xml | 3 +++ 7 files changed, 33 insertions(+), 12 deletions(-) diff --git a/Content.Server/Backmen/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs b/Content.Server/Backmen/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs index 23d0eb204f6..baa17974dc1 100644 --- a/Content.Server/Backmen/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs +++ b/Content.Server/Backmen/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs @@ -130,9 +130,12 @@ private void OnAnomalySupercritical(EntityUid uid, GlimmerSourceComponent compon public override void Update(float frameTime) { base.Update(frameTime); - var q = EntityQueryEnumerator(); - while (q.MoveNext(out var owner, out var source)) + var q = EntityQueryEnumerator(); + while (q.MoveNext(out var owner, out var source, out var md)) { + if(Paused(owner, md)) + continue; + if (!source.Active) continue; diff --git a/Content.Server/Backmen/StationEvents/Events/GlimmerRevenantSpawnRule.cs b/Content.Server/Backmen/StationEvents/Events/GlimmerRevenantSpawnRule.cs index 168bc75cdfd..a394be545f0 100644 --- a/Content.Server/Backmen/StationEvents/Events/GlimmerRevenantSpawnRule.cs +++ b/Content.Server/Backmen/StationEvents/Events/GlimmerRevenantSpawnRule.cs @@ -27,6 +27,9 @@ protected override void Started(EntityUid uid, GlimmerRevenantRuleComponent comp var query = EntityQueryEnumerator(); while (query.MoveNext(out var source, out _, out var transform)) { + if(Paused(source)) + continue; + if (_stationSystem.GetOwningStation(source, transform) == station) glimmerSources.Add(source); } diff --git a/Content.Server/Backmen/StationEvents/Events/GlimmerWispSpawnRule.cs b/Content.Server/Backmen/StationEvents/Events/GlimmerWispSpawnRule.cs index e95b1fbb7c4..72a4cf130dd 100644 --- a/Content.Server/Backmen/StationEvents/Events/GlimmerWispSpawnRule.cs +++ b/Content.Server/Backmen/StationEvents/Events/GlimmerWispSpawnRule.cs @@ -38,6 +38,9 @@ protected override void Started(EntityUid uid, GlimmerWispRuleComponent componen var locations = EntityQueryEnumerator(); while (locations.MoveNext(out var sUid, out _, out var transform)) { + if(Paused(sUid)) + continue; + if (_stationSystem.GetOwningStation(sUid, transform) == station) { glimmerSources.Add(transform.Coordinates); diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml index 9f783bb2295..026e622d175 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml @@ -154,9 +154,11 @@ maxVol: 50 reagents: - ReagentId: Ash - Quantity: 25 + Quantity: 10 - ReagentId: Necrosol - Quantity: 25 + Quantity: 10 + - ReagentId: Ectoplasm + Quantity: 5 - type: GuideHelp guides: - MinorAntagonists diff --git a/Resources/Prototypes/_Backmen/GameRules/events.yml b/Resources/Prototypes/_Backmen/GameRules/events.yml index 0e507754316..8d0c5ea1b08 100644 --- a/Resources/Prototypes/_Backmen/GameRules/events.yml +++ b/Resources/Prototypes/_Backmen/GameRules/events.yml @@ -112,10 +112,9 @@ abstract: true components: - type: StationEvent - # Favor glimmer events just a little more than regular events. weight: 12 earliestStart: 1 - reoccurrenceDelay: 1 + reoccurrenceDelay: 5 - type: GlimmerEvent ## Glimmer events @@ -134,7 +133,7 @@ components: - type: GlimmerEvent minimumGlimmer: 300 - maximumGlimmer: 900 + maximumGlimmer: 1000 - type: NoosphericFryRule @@ -177,6 +176,10 @@ parent: BaseGlimmerEvent categories: [ HideSpawnMenu ] components: + - type: StationEvent + weight: 12 + earliestStart: 1 + reoccurrenceDelay: 1 - type: GlimmerEvent minimumGlimmer: 0 maximumGlimmer: 100 @@ -190,6 +193,10 @@ parent: BaseGlimmerEvent categories: [ HideSpawnMenu ] components: + - type: StationEvent + weight: 12 + earliestStart: 1 + reoccurrenceDelay: 1 - type: GlimmerEvent minimumGlimmer: 300 maximumGlimmer: 1000 diff --git a/Resources/Prototypes/_Backmen/Reactions/psionic.yml b/Resources/Prototypes/_Backmen/Reactions/psionic.yml index 77fd3dae0f2..46594d5aa1a 100644 --- a/Resources/Prototypes/_Backmen/Reactions/psionic.yml +++ b/Resources/Prototypes/_Backmen/Reactions/psionic.yml @@ -18,15 +18,15 @@ minTemp: 400 reactants: Ash: - amount: 10 + amount: 5 Water: - amount: 10 + amount: 5 Blood: - amount: 10 + amount: 5 Ectoplasm: - amount: 10 + amount: 5 Plasma: - amount: 10 + amount: 5 catalyst: true effects: - !type:CreateEntityReactionEffect diff --git a/Resources/ServerInfo/_Backmen/Guidebook/Epistemics/Psionics.xml b/Resources/ServerInfo/_Backmen/Guidebook/Epistemics/Psionics.xml index 3ed9a9560d2..fdf6bd36b7b 100644 --- a/Resources/ServerInfo/_Backmen/Guidebook/Epistemics/Psionics.xml +++ b/Resources/ServerInfo/_Backmen/Guidebook/Epistemics/Psionics.xml @@ -54,6 +54,9 @@ [color=#a4885c]Снаряды Soulbreaker[/color] удаляют псионику у псиоников, в которых они попадают. + [color=#a4885c] Эктоплазма[/color], смешанная в мензурке с равными частями воды, золы, крови и плазмы, при достаточном нагревании даст нормальный кристалл. [color=#fcdf03]Используйте для этого горячую плиту.[/color] + + From 7d993f62539a4e60734c2ffef2ad2d66f4026c88 Mon Sep 17 00:00:00 2001 From: Zack Backmen Date: Mon, 24 Feb 2025 13:13:43 +0300 Subject: [PATCH 6/8] balance --- .../Chapel/Components/SacrificialAltarComponent.cs | 14 ++++++++------ Resources/Prototypes/_Backmen/GameRules/events.yml | 6 ++++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Content.Shared/Backmen/Chapel/Components/SacrificialAltarComponent.cs b/Content.Shared/Backmen/Chapel/Components/SacrificialAltarComponent.cs index 7af4f71d4b2..765907142eb 100644 --- a/Content.Shared/Backmen/Chapel/Components/SacrificialAltarComponent.cs +++ b/Content.Shared/Backmen/Chapel/Components/SacrificialAltarComponent.cs @@ -1,7 +1,9 @@ using Content.Shared.DoAfter; +using Content.Shared.Random; using Robust.Shared.Audio; using Robust.Shared.Audio.Components; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; namespace Content.Shared.Backmen.Chapel.Components; @@ -20,7 +22,7 @@ public sealed partial class SacrificialAltarComponent : Component public Entity? SacrificeStingStream; [DataField("rewardPool")] - public string RewardPool = "PsionicArtifactPool"; + public ProtoId RewardPool = "PsionicArtifactPool"; [DataField("rewardPoolChance")] public float RewardPoolChance = 0.1f; @@ -29,19 +31,19 @@ public sealed partial class SacrificialAltarComponent : Component public float RewardPoolChanceBibleUser = 0.5f; [DataField("bluespaceRewardMin")] - public int BluespaceRewardMin = 1; + public int BluespaceRewardMin = 4; [DataField("bluespaceRewardMax")] - public int BlueSpaceRewardMax = 4; + public int BlueSpaceRewardMax = 8; [DataField("glimmerReductionMin")] - public int GlimmerReductionMin = 30; + public int GlimmerReductionMin = 300; [DataField("glimmerReductionMax")] - public int GlimmerReductionMax = 60; + public int GlimmerReductionMax = 600; [DataField("trapPrototype")] - public string TrapPrototype = "CrystalSoul"; + public EntProtoId TrapPrototype = "CrystalSoul"; /// /// Antiexploit. diff --git a/Resources/Prototypes/_Backmen/GameRules/events.yml b/Resources/Prototypes/_Backmen/GameRules/events.yml index 8d0c5ea1b08..f629018f8d3 100644 --- a/Resources/Prototypes/_Backmen/GameRules/events.yml +++ b/Resources/Prototypes/_Backmen/GameRules/events.yml @@ -156,8 +156,8 @@ components: - type: GlimmerEvent minimumGlimmer: 400 - glimmerBurnLower: 20 - glimmerBurnUpper: 70 + glimmerBurnLower: 50 + glimmerBurnUpper: 200 - type: MassMindSwapRule - type: entity @@ -168,6 +168,8 @@ - type: GlimmerEvent minimumGlimmer: 300 maximumGlimmer: 1000 + glimmerBurnLower: 90 + glimmerBurnUpper: 120 report: glimmer-event-report-signatures - type: GlimmerWispRule From 396cc3a0b5b3ebd9632ebea57f3e7c8e4608fe5f Mon Sep 17 00:00:00 2001 From: Zack Backmen Date: Mon, 24 Feb 2025 13:18:34 +0300 Subject: [PATCH 7/8] up --- .../Chapel/Components/SacrificialAltarComponent.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Content.Shared/Backmen/Chapel/Components/SacrificialAltarComponent.cs b/Content.Shared/Backmen/Chapel/Components/SacrificialAltarComponent.cs index 765907142eb..5eed1781d20 100644 --- a/Content.Shared/Backmen/Chapel/Components/SacrificialAltarComponent.cs +++ b/Content.Shared/Backmen/Chapel/Components/SacrificialAltarComponent.cs @@ -25,10 +25,10 @@ public sealed partial class SacrificialAltarComponent : Component public ProtoId RewardPool = "PsionicArtifactPool"; [DataField("rewardPoolChance")] - public float RewardPoolChance = 0.1f; + public float RewardPoolChance = 0.3f; [DataField("rewardPoolChanceBibleUser")] - public float RewardPoolChanceBibleUser = 0.5f; + public float RewardPoolChanceBibleUser = 0.8f; [DataField("bluespaceRewardMin")] public int BluespaceRewardMin = 4; @@ -37,10 +37,10 @@ public sealed partial class SacrificialAltarComponent : Component public int BlueSpaceRewardMax = 8; [DataField("glimmerReductionMin")] - public int GlimmerReductionMin = 300; + public int GlimmerReductionMin = 500; [DataField("glimmerReductionMax")] - public int GlimmerReductionMax = 600; + public int GlimmerReductionMax = 900; [DataField("trapPrototype")] public EntProtoId TrapPrototype = "CrystalSoul"; From 1359c498356de9dfb00644176efe4990f3b598cf Mon Sep 17 00:00:00 2001 From: Zack Backmen Date: Mon, 24 Feb 2025 14:30:43 +0300 Subject: [PATCH 8/8] fix altar, admin zone --- .../Systems/AdminTestArenaSystem.cs | 8 +- .../Backmen/Chapel/SacrificialAltarSystem.cs | 61 ++-- .../Chapel/SharedSacrificialAltarSystem.cs | 9 + Resources/Maps/Test/admin_test_arena.yml | 292 ++++++++++++++---- 4 files changed, 281 insertions(+), 89 deletions(-) diff --git a/Content.Server/Administration/Systems/AdminTestArenaSystem.cs b/Content.Server/Administration/Systems/AdminTestArenaSystem.cs index 12bf0eba648..4aa989da274 100644 --- a/Content.Server/Administration/Systems/AdminTestArenaSystem.cs +++ b/Content.Server/Administration/Systems/AdminTestArenaSystem.cs @@ -1,3 +1,4 @@ +using Robust.Shared.EntitySerialization; using Robust.Shared.EntitySerialization.Systems; using Robust.Shared.Network; using Robust.Shared.Player; @@ -33,7 +34,12 @@ public sealed class AdminTestArenaSystem : EntitySystem } var path = new ResPath(ArenaMapPath); - if (!_loader.TryLoadMap(path, out var map, out var grids)) + if (!_loader.TryLoadMap(path, out var map, out var grids, new DeserializationOptions + { + InitializeMaps = true, + PauseMaps = false, + StoreYamlUids = true + })) throw new Exception($"Failed to load admin arena"); ArenaMap[admin.UserId] = map.Value.Owner; diff --git a/Content.Server/Backmen/Chapel/SacrificialAltarSystem.cs b/Content.Server/Backmen/Chapel/SacrificialAltarSystem.cs index c15bb67adc6..67e1f5bf534 100644 --- a/Content.Server/Backmen/Chapel/SacrificialAltarSystem.cs +++ b/Content.Server/Backmen/Chapel/SacrificialAltarSystem.cs @@ -20,6 +20,7 @@ using Content.Shared.Backmen.Chapel.Components; using Content.Shared.Backmen.Psionics.Glimmer; using Content.Shared.Backmen.Soul; +using Content.Shared.Ghost; using Content.Shared.Hands.Components; using Content.Shared.Players; using Robust.Server.Audio; @@ -53,61 +54,57 @@ public override void Initialize() } + [ValidatePrototypeId] + private const string MaterialBluespace = "MaterialBluespace1"; private void OnDoAfter(EntityUid uid, SacrificialAltarComponent component, SacrificeDoAfterEvent args) { _audioSystem.Stop(component.SacrificeStingStream,component.SacrificeStingStream); component.DoAfter = null; - if (args.Cancelled || args.Handled || args.Args.Target == null) + if (args.Cancelled || args.Handled || args.Args.Target is not { } target) return; - // note: we checked this twice in case they could have gone SSD in the doafter time. - if (!TryComp(args.Args.Target.Value, out var actor)) + if (!_mindSystem.TryGetMind(target, out var mindId, out var mind)) return; - if (!_mindSystem.TryGetMind(args.Args.Target.Value, out var mindId, out var mind)) - return; - - _adminLogger.Add(LogType.Action, LogImpact.Extreme, $"{ToPrettyString(args.Args.User):player} sacrificed {ToPrettyString(args.Args.Target.Value):target} on {ToPrettyString(uid):altar}"); + _adminLogger.Add(LogType.Action, LogImpact.Extreme, $"{ToPrettyString(args.Args.User):player} sacrificed {ToPrettyString(target):target} on {ToPrettyString(uid):altar}"); - if (!_prototypeManager.TryIndex(component.RewardPool, out var pool)) - return; + var pool = _prototypeManager.Index(component.RewardPool); var chance = HasComp(args.Args.User) ? component.RewardPoolChanceBibleUser : component.RewardPoolChance; + var pos = Transform(uid).Coordinates; + if (_robustRandom.Prob(chance)) - Spawn(pool.Pick(), Transform(uid).Coordinates); + Spawn(pool.Pick(), pos); - int i = _robustRandom.Next(component.BluespaceRewardMin, component.BlueSpaceRewardMax); + var i = _robustRandom.Next(component.BluespaceRewardMin, component.BlueSpaceRewardMax); while (i > 0) { - Spawn("MaterialBluespace1", Transform(uid).Coordinates); + Spawn(MaterialBluespace, pos); i--; } int reduction = _robustRandom.Next(component.GlimmerReductionMin, component.GlimmerReductionMax); _glimmerSystem.Glimmer -= reduction; - if (actor.PlayerSession.ContentData()?.Mind != null) - { - var trap = Spawn(component.TrapPrototype, Transform(uid).Coordinates); - _mindSystem.TransferTo(mindId, trap); + var trap = Spawn(component.TrapPrototype, pos); + _mindSystem.TransferTo(mindId, trap, mind: mind); - if (TryComp(trap, out var crystalComponent)) - crystalComponent.TrueName = Name(args.Args.Target.Value); + if (TryComp(trap, out var crystalComponent)) + crystalComponent.TrueName = Name(target); - _metaDataSystem.SetEntityName(trap, Loc.GetString("soul-entity-name", ("trapped", args.Args.Target))); - _metaDataSystem.SetEntityDescription(trap, Loc.GetString("soul-entity-name", ("trapped", args.Args.Target))); - } + _metaDataSystem.SetEntityName(trap, Loc.GetString("soul-entity-name", ("trapped", target))); + _metaDataSystem.SetEntityDescription(trap, Loc.GetString("soul-entity-name", ("trapped", target))); - if (TryComp(args.Args.Target, out var body)) + if (TryComp(target, out var body)) { - _bodySystem.GibBody(args.Args.Target.Value, false, body, false); + _bodySystem.GibBody(target, false, body, true); } else { - QueueDel(args.Args.Target.Value); + QueueDel(target); } } @@ -122,39 +119,39 @@ protected override void AttemptSacrifice(EntityUid agent, EntityUid patient, Ent // can't sacrifice yourself if (agent == patient) { - _popups.PopupEntity(Loc.GetString("altar-failure-reason-self"), altar, agent, Shared.Popups.PopupType.SmallCaution); + _popups.PopupEntity(Loc.GetString("altar-failure-reason-self"), altar, agent, Shared.Popups.PopupType.MediumCaution); return; } // you need psionic OR bible user - if (!HasComp(agent) && !HasComp(agent)) + if (!(HasComp(agent) || HasComp(agent) || HasComp(agent))) { - _popups.PopupEntity(Loc.GetString("altar-failure-reason-user"), altar, agent, Shared.Popups.PopupType.SmallCaution); + _popups.PopupEntity(Loc.GetString("altar-failure-reason-user"), altar, agent, Shared.Popups.PopupType.MediumCaution); return; } // and no golems or familiars or whatever should be sacrificing - if (!HasComp(agent)) + if (!(HasComp(agent) || HasComp(agent))) { - _popups.PopupEntity(Loc.GetString("altar-failure-reason-user-humanoid"), altar, agent, Shared.Popups.PopupType.SmallCaution); + _popups.PopupEntity(Loc.GetString("altar-failure-reason-user-humanoid"), altar, agent, Shared.Popups.PopupType.MediumCaution); return; } if (!HasComp(patient)) { - _popups.PopupEntity(Loc.GetString("altar-failure-reason-target", ("target", patient)), altar, agent, Shared.Popups.PopupType.SmallCaution); + _popups.PopupEntity(Loc.GetString("altar-failure-reason-target", ("target", patient)), altar, agent, Shared.Popups.PopupType.MediumCaution); return; } if (!HasComp(patient) && !HasComp(patient)) { - _popups.PopupEntity(Loc.GetString("altar-failure-reason-target-humanoid", ("target", patient)), altar, agent, Shared.Popups.PopupType.SmallCaution); + _popups.PopupEntity(Loc.GetString("altar-failure-reason-target-humanoid", ("target", patient)), altar, agent, Shared.Popups.PopupType.MediumCaution); return; } if (!HasComp(patient)) { - _popups.PopupEntity(Loc.GetString("altar-failure-reason-target-ssd", ("target", patient)), altar, agent, Shared.Popups.PopupType.SmallCaution); + _popups.PopupEntity(Loc.GetString("altar-failure-reason-target-ssd", ("target", patient)), altar, agent, Shared.Popups.PopupType.MediumCaution); return; } diff --git a/Content.Shared/Backmen/Chapel/SharedSacrificialAltarSystem.cs b/Content.Shared/Backmen/Chapel/SharedSacrificialAltarSystem.cs index c2dd14fdd43..542fb2ea311 100644 --- a/Content.Shared/Backmen/Chapel/SharedSacrificialAltarSystem.cs +++ b/Content.Shared/Backmen/Chapel/SharedSacrificialAltarSystem.cs @@ -2,6 +2,7 @@ using Content.Shared.Buckle.Components; using Content.Shared.Cuffs; using Content.Shared.Cuffs.Components; +using Content.Shared.DoAfter; using Content.Shared.Verbs; namespace Content.Shared.Backmen.Chapel; @@ -10,6 +11,9 @@ public abstract class SharedSacrificialAltarSystem : EntitySystem { [Dependency] private readonly SharedCuffableSystem _cuffable = default!; + + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + public override void Initialize() { base.Initialize(); @@ -28,6 +32,11 @@ private void OnUnstrappedEvent(EntityUid uid, SacrificialAltarComponent componen args.Cancelled = true; return; } + if (component.DoAfter is {} id) + { + _doAfterSystem.Cancel(id); + component.DoAfter = null; + } } private void OnStrappedEvent(EntityUid uid, SacrificialAltarComponent component, ref StrapAttemptEvent args) diff --git a/Resources/Maps/Test/admin_test_arena.yml b/Resources/Maps/Test/admin_test_arena.yml index d69ab603b19..bfc2fe5d625 100644 --- a/Resources/Maps/Test/admin_test_arena.yml +++ b/Resources/Maps/Test/admin_test_arena.yml @@ -1,22 +1,22 @@ meta: format: 7 - category: Grid - engineVersion: 247.0.0 + category: Map + engineVersion: 247.1.0 forkId: "" forkVersion: "" - time: 02/19/2025 11:09:46 - entityCount: 160 -maps: [] + time: 02/24/2025 11:26:26 + entityCount: 162 +maps: +- 161 grids: - 104 -orphans: -- 104 +orphans: [] nullspace: [] tilemap: 0: Space 64: FloorMetalDiamond - 92: FloorSteel - 125: Plating + 89: FloorSteel + 121: Plating entities: - proto: "" entities: @@ -25,24 +25,24 @@ entities: - type: MetaData - type: Transform pos: 0.43750095,0.583333 - parent: invalid + parent: 161 - type: MapGrid chunks: -1,-1: ind: -1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAQAAAAAAAQAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAQAAAAAAAQAAAAAAA version: 6 -1,0: ind: -1,0 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 0,0: ind: 0,0 - tiles: QAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: QAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 0,-1: ind: 0,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAXAAAAAAAXAAAAAAAXAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 - type: Broadphase - type: Physics @@ -59,63 +59,223 @@ entities: - type: DecalGrid chunkCollection: version: 2 - nodes: [] + nodes: + - node: + color: '#FF0038FF' + id: MiniTileSteelCornerNe + decals: + 30: 3,3 + - node: + color: '#FF0038FF' + id: MiniTileSteelCornerNw + decals: + 29: -5,3 + - node: + color: '#FF0038FF' + id: MiniTileSteelCornerSe + decals: + 32: 3,-5 + - node: + color: '#FF0038FF' + id: MiniTileSteelCornerSw + decals: + 31: -5,-5 + - node: + color: '#FF0038FF' + id: MiniTileSteelLineE + decals: + 33: 3,-4 + 34: 3,-3 + 35: 3,-2 + 36: 3,-1 + 37: 3,0 + 38: 3,1 + 39: 3,2 + - node: + color: '#FF0038FF' + id: MiniTileSteelLineN + decals: + 54: -4,3 + 55: -3,3 + 56: -2,3 + 57: -1,3 + 58: 0,3 + 59: 1,3 + 60: 2,3 + - node: + color: '#FF0038FF' + id: MiniTileSteelLineS + decals: + 40: -4,-5 + 41: -3,-5 + 42: -2,-5 + 43: -1,-5 + 44: 0,-5 + 45: 1,-5 + 46: 2,-5 + - node: + color: '#FF0038FF' + id: MiniTileSteelLineW + decals: + 47: -5,-4 + 48: -5,-3 + 49: -5,-2 + 50: -5,-1 + 51: -5,0 + 52: -5,1 + 53: -5,2 + - node: + color: '#FF0038FF' + id: Omni + decals: + 26: 1,2 + - node: + color: '#FF0038FF' + id: SpaceStationSign1 + decals: + 9: -3,-3 + - node: + color: '#FF0038FF' + id: SpaceStationSign2 + decals: + 10: -2,-3 + - node: + color: '#FF0038FF' + id: SpaceStationSign3 + decals: + 11: -1,-3 + - node: + color: '#FF0038FF' + id: SpaceStationSign4 + decals: + 12: 0,-3 + - node: + color: '#FF0038FF' + id: SpaceStationSign5 + decals: + 13: 1,-3 + - node: + color: '#FF0038FF' + id: SpaceStationSign6 + decals: + 14: 2,-3 + - node: + color: '#FF0038FF' + id: SpaceStationSign7 + decals: + 15: 3,-3 + - node: + color: '#FF0038FF' + id: Tunnel + decals: + 25: -1,-1 + - node: + color: '#FF0038FF' + id: cyr_b + decals: + 6: 0,1 + 20: -3,2 + - node: + color: '#FF0038FF' + id: cyr_eh + decals: + 8: -1,1 + - node: + color: '#FF0038FF' + id: cyr_g + decals: + 5: -3,1 + - node: + color: '#FF0038FF' + id: cyr_l + decals: + 7: -2,1 + 22: -1,2 + - node: + color: '#FF0038FF' + id: cyr_u + decals: + 21: -2,2 + - node: + color: '#FF0038FF' + id: danger + decals: + 19: 0,3 + - node: + color: '#FF0038FF' + id: evac + decals: + 64: -1,-5 + - node: + color: '#FF0038FF' + id: food + decals: + 63: 2,0 + - node: + color: '#FF0038FF' + id: ghost + decals: + 61: -3,-1 + 62: 1,-1 + - node: + color: '#FF0038FF' + id: nay + decals: + 27: -1,4 + 28: -1,-6 + - node: + color: '#FF0038FF' + id: peace + decals: + 17: -4,-3 + 18: 3,-3 + - node: + color: '#FF0038FF' + id: t + decals: + 23: -3,3 + 24: -1,3 + - node: + color: '#FF0038FF' + id: y + decals: + 16: -2,3 - type: GridAtmosphere version: 2 data: tiles: - -1,-1: - 0: 65535 - -1,0: - 0: 65535 - 0,0: - 0: 65535 - 0,-1: - 0: 65535 -2,-3: - 0: 52224 + 0: 32768 -2,-2: - 0: 52428 + 0: 32904 -2,-1: - 0: 52428 + 0: 34952 -1,-3: - 0: 65280 + 0: 61440 -1,-2: + 0: 63743 + -1,-1: 0: 65535 - -3,1: - 0: 52428 - -3,2: - 0: 12 - -2,1: - 0: 65535 - -2,2: - 0: 15 -2,0: - 0: 52428 - -1,1: - 0: 65535 - -1,2: - 0: 15 - 0,1: + 0: 34952 + -1,0: 0: 65535 - 0,2: - 0: 15 - 1,0: - 0: 4369 - 1,1: - 0: 4369 - 1,2: - 0: 1 0,-3: - 0: 65280 + 0: 61440 0,-2: + 0: 61695 + 0,-1: + 0: 65535 + -3,1: + 0: 34944 + -2,1: + 0: 48048 + -1,1: + 0: 65528 + 0,0: 0: 65535 - 1,-3: - 0: 4352 - 1,-2: - 0: 4369 - 1,-1: - 0: 4369 + 0,1: + 0: 65520 uniqueMixes: - volume: 2500 temperature: 293.15 @@ -149,6 +309,19 @@ entities: - type: GravityShake shakeTimes: 10 - type: GasTileOverlay + - uid: 161 + components: + - type: MetaData + name: Map Entity + - type: Transform + - type: Map + mapPaused: True + - type: PhysicsMap + - type: GridTree + - type: MovedGrids + - type: Broadphase + - type: OccluderTree + - type: MapAtmosphere - proto: AirlockCommandLocked entities: - uid: 37 @@ -524,6 +697,13 @@ entities: - type: Transform pos: -7.5,4.5 parent: 104 +- proto: CrayonYellow + entities: + - uid: 162 + components: + - type: Transform + pos: -2.7291613,6.145059 + parent: 104 - proto: GeneratorBasic15kW entities: - uid: 34