using Robust.Shared.GameStates; using Content.Shared.StatusIcon; using Robust.Shared.Prototypes; using Robust.Shared.Audio; using Content.Shared._DV.CosmicCult.Prototypes; using Content.Shared.Damage; using Content.Shared.Damage.Prototypes; using Content.Shared.Alert; using Robust.Shared.Serialization; namespace Content.Shared._DV.CosmicCult.Components; /// /// Added to entities to tag that they are a cosmic cultist. Holds nearly all cultist-relevant data! Removal of this component is used to call for a deconversion /// [RegisterComponent, NetworkedComponent] [AutoGenerateComponentState] public sealed partial class CosmicCultComponent : Component { #region Housekeeping /// /// The status icon prototype displayed for cosmic cultists. /// [DataField] public ProtoId StatusIcon = "CosmicCultIcon"; #endregion #region Ability Data [DataField] [AutoNetworkedField] public HashSet> UnlockedInfluences = [ "InfluenceAberrantLapse", "InfluenceNullGlare", "InfluenceEschewMetabolism", ]; [DataField] [AutoNetworkedField] public HashSet CosmicCultActions = [ "ActionCosmicSiphon", "ActionCosmicBlank", ]; [DataField] public EntProtoId CosmicFragmentationAction = "ActionCosmicFragmentation"; public HashSet ActionEntities = []; [DataField] [AutoNetworkedField] public HashSet> OwnedInfluences = []; /// /// The duration of the doAfter for Siphon Entropy /// [DataField] public TimeSpan CosmicSiphonDelay = TimeSpan.FromSeconds(2); public static readonly TimeSpan DefaultCosmicSiphonDelay = TimeSpan.FromSeconds(2); /// /// The duration of the doAfter for Shunt Subjectivity /// [DataField] public TimeSpan CosmicBlankDelay = TimeSpan.FromSeconds(0.6f); public static readonly TimeSpan DefaultCosmicBlankDelay = TimeSpan.FromSeconds(0.6f); /// /// The duration of Shunt Subjectivity's trip to the cosmic void /// [DataField] public TimeSpan CosmicBlankDuration = TimeSpan.FromSeconds(9); public static readonly TimeSpan DefaultCosmicBlankDuration = TimeSpan.FromSeconds(9); /// /// The duration of Vacuous Imposition's shield. /// [DataField] public TimeSpan CosmicImpositionDuration = TimeSpan.FromSeconds(5.9); public static readonly TimeSpan DefaultCosmicImpositionDuration = TimeSpan.FromSeconds(5.9); /// /// The duration of Null Glare's flash/disorientation. /// [DataField] public TimeSpan CosmicGlareDuration = TimeSpan.FromSeconds(5); public static readonly TimeSpan DefaultCosmicGlareDuration = TimeSpan.FromSeconds(5); /// /// The range of Null Glare. /// [DataField] public int CosmicGlareRange = 8; public static readonly int DefaultCosmicGlareRange = 8; /// /// The movement speed penalty inflicted by Null Glare. /// [DataField] public float CosmicGlarePenalty = 0.3f; public static readonly float DefaultCosmicGlarePenalty = 0.3f; /// /// The stun duration inflicted by Null Glare. /// [DataField] public TimeSpan CosmicGlareStun = TimeSpan.FromSeconds(0); public static readonly TimeSpan DefaultCosmicGlareStun = TimeSpan.FromSeconds(0); /// /// The amount of Entropy generated by Siphon Entropy /// [DataField] public int CosmicSiphonQuantity = 1; public static readonly int DefaultCosmicSiphonQuantity = 1; /// /// The amount of Entropy generated by Siphon Entropy when used on a person in critical condition /// [DataField] public int SiphonQuantityCrit = 6; /// /// The amount of Entropy generated by Siphon Entropy when used on a mindshielded person in critical condition /// [DataField] public int SiphonQuantityCritMindshield = 10; /// /// The amount of damage dealt by Siphon Entropy when used on a person in critical condition /// [DataField] public DamageSpecifier SiphonCritDamage = new() { DamageDict = new() { { "Cold", 200 } } }; #endregion #region Misc Data /// /// The amount of Entropy the user is allowed to spend at The Monument. /// [DataField, AutoNetworkedField] public int EntropyBudget; /// /// The amount of Entropy the user is currently holding on to. /// [DataField, AutoNetworkedField] public int EntropyStored; /// /// The maximum amount of Entropy the user can have at once. /// [DataField, AutoNetworkedField] public int EntropyStoredCap = 14; /// /// Wether or not this cultist has been empowered by a Malign Rift. /// [DataField, AutoNetworkedField] public bool CosmicEmpowered; /// /// Wether or not this cultist needs to respirate. /// [DataField, AutoNetworkedField] public bool Respiration = true; /// /// A string for storing what damage container this cultist had upon conversion. /// [DataField, AutoNetworkedField] public ProtoId StoredDamageContainer = "Biological"; /// /// The alert for displaying the cultist's currently held Entropy. /// [DataField] public ProtoId EntropyAlert = "CosmicEntropy"; [DataField] public EntityUid? CosmicFragmentationActionEntity; #endregion /// /// The gamerule that this cultist is associated with /// [DataField(serverOnly: true)] public EntityUid CultGamerule; #region VFX & SFX [DataField] public EntProtoId SpawnWisp = "MobCosmicWisp"; [DataField] public EntProtoId LapseVFX = "CosmicLapseAbilityVFX"; [DataField] public EntProtoId BlankVFX = "CosmicBlankAbilityVFX"; [DataField] public EntProtoId GlareVFX = "CosmicGlareAbilityVFX"; [DataField] public EntProtoId AbsorbVFX = "CosmicGenericVFX"; [DataField] public EntProtoId ImpositionVFX = "CosmicImpositionAbilityVFX"; [DataField] public SoundSpecifier BlankSFX = new SoundPathSpecifier("/Audio/_DV/CosmicCult/ability_blank.ogg"); [DataField] public SoundSpecifier IngressSFX = new SoundPathSpecifier("/Audio/_DV/CosmicCult/ability_ingress.ogg"); [DataField] public SoundSpecifier GlareSFX = new SoundPathSpecifier("/Audio/_DV/CosmicCult/ability_glare.ogg"); [DataField] public SoundSpecifier NovaCastSFX = new SoundPathSpecifier("/Audio/_DV/CosmicCult/ability_nova_cast.ogg"); [DataField] public SoundSpecifier ImpositionSFX = new SoundPathSpecifier("/Audio/_DV/CosmicCult/ability_imposition.ogg"); #endregion } [NetSerializable, Serializable] public enum CultAlertVisualLayers : byte { Counter, }