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,
}