using System.Numerics; using Content.Shared.Alert; using Content.Shared.FixedPoint; using Content.Shared.Store; using Content.Shared.Whitelist; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Revenant.Components; [RegisterComponent, NetworkedComponent] [AutoGenerateComponentState] public sealed partial class RevenantComponent : Component { /// /// The total amount of Essence the revenant has. Functions /// as health and is regenerated. /// [DataField, ViewVariables(VVAccess.ReadWrite)] [AutoNetworkedField] public FixedPoint2 Essence = 75; [DataField("stolenEssenceCurrencyPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] public string StolenEssenceCurrencyPrototype = "StolenEssence"; /// /// Prototype to spawn when the entity dies. /// [DataField("spawnOnDeathPrototype", customTypeSerializer:typeof(PrototypeIdSerializer))] public string SpawnOnDeathPrototype = "Ectoplasm"; /// /// The entity's current max amount of essence. Can be increased /// through harvesting player souls. /// [ViewVariables(VVAccess.ReadWrite), DataField("maxEssence")] public FixedPoint2 EssenceRegenCap = 75; /// /// The coefficient of damage taken to actual health lost. /// [ViewVariables(VVAccess.ReadWrite), DataField("damageToEssenceCoefficient")] public float DamageToEssenceCoefficient = 0.75f; /// /// The amount of essence passively generated per second. /// [ViewVariables(VVAccess.ReadWrite), DataField("essencePerSecond")] public FixedPoint2 EssencePerSecond = 0.5f; [ViewVariables] public float Accumulator = 0; // Here's the gist of the harvest ability: // Step 1: The revenant clicks on an entity to "search" for it's soul, which creates a doafter. // Step 2: After the doafter is completed, the soul is "found" and can be harvested. // Step 3: Clicking the entity again begins to harvest the soul, which causes the revenant to become vulnerable // Step 4: The second doafter for the harvest completes, killing the target and granting the revenant essence. #region Harvest Ability /// /// The duration of the soul search /// [DataField("soulSearchDuration")] public float SoulSearchDuration = 2.5f; /// /// The status effects applied after the ability /// the first float corresponds to amount of time the entity is stunned. /// the second corresponds to the amount of time the entity is made solid. /// [DataField("harvestDebuffs")] public Vector2 HarvestDebuffs = new(5, 5); /// /// The amount that is given to the revenant each time it's max essence is upgraded. /// [ViewVariables(VVAccess.ReadWrite), DataField("maxEssenceUpgradeAmount")] public float MaxEssenceUpgradeAmount = 10; #endregion //In the nearby radius, causes various objects to be thrown, messed with, and containers opened //Generally just causes a mess #region Defile Ability /// /// The amount of essence that is needed to use the ability. /// [ViewVariables(VVAccess.ReadWrite), DataField("defileCost")] public FixedPoint2 DefileCost = 30; /// /// The status effects applied after the ability /// the first float corresponds to amount of time the entity is stunned. /// the second corresponds to the amount of time the entity is made solid. /// [DataField("defileDebuffs")] public Vector2 DefileDebuffs = new(1, 4); /// /// The radius around the user that this ability affects /// [ViewVariables(VVAccess.ReadWrite), DataField("defileRadius")] public float DefileRadius = 3.5f; /// /// The amount of tiles that are uprooted by the ability /// [ViewVariables(VVAccess.ReadWrite), DataField("defileTilePryAmount")] public int DefileTilePryAmount = 15; /// /// The chance that an individual entity will have any of the effects /// happen to it. /// [ViewVariables(VVAccess.ReadWrite), DataField("defileEffectChance")] public float DefileEffectChance = 0.5f; #endregion #region Overload Lights Ability /// /// The amount of essence that is needed to use the ability. /// [ViewVariables(VVAccess.ReadWrite), DataField("overloadCost")] public FixedPoint2 OverloadCost = 40; /// /// The status effects applied after the ability /// the first float corresponds to amount of time the entity is stunned. /// the second corresponds to the amount of time the entity is made solid. /// [DataField("overloadDebuffs")] public Vector2 OverloadDebuffs = new(3, 8); /// /// The radius around the user that this ability affects /// [ViewVariables(VVAccess.ReadWrite), DataField("overloadRadius")] public float OverloadRadius = 5f; /// /// How close to the light the entity has to be in order to be zapped. /// [ViewVariables(VVAccess.ReadWrite), DataField("overloadZapRadius")] public float OverloadZapRadius = 2f; #endregion #region Blight Ability /// /// The amount of essence that is needed to use the ability. /// [ViewVariables(VVAccess.ReadWrite), DataField("blightCost")] public float BlightCost = 50; /// /// The status effects applied after the ability /// the first float corresponds to amount of time the entity is stunned. /// the second corresponds to the amount of time the entity is made solid. /// [DataField("blightDebuffs")] public Vector2 BlightDebuffs = new(2, 5); /// /// The radius around the user that this ability affects /// [ViewVariables(VVAccess.ReadWrite), DataField("blightRadius")] public float BlightRadius = 3.5f; #endregion #region Malfunction Ability /// /// The amount of essence that is needed to use the ability. /// [ViewVariables(VVAccess.ReadWrite), DataField("malfunctionCost")] public FixedPoint2 MalfunctionCost = 60; /// /// The status effects applied after the ability /// the first float corresponds to amount of time the entity is stunned. /// the second corresponds to the amount of time the entity is made solid. /// [DataField("malfunctionDebuffs")] public Vector2 MalfunctionDebuffs = new(2, 8); /// /// The radius around the user that this ability affects /// [ViewVariables(VVAccess.ReadWrite), DataField("malfunctionRadius")] public float MalfunctionRadius = 3.5f; /// /// Whitelist for entities that can be emagged by malfunction. /// Used to prevent ultra gamer things like ghost emagging chem or instantly launching the shuttle. /// [DataField] public EntityWhitelist? MalfunctionWhitelist; /// /// Whitelist for entities that can never be emagged by malfunction. /// [DataField] public EntityWhitelist? MalfunctionBlacklist; #endregion [DataField] public ProtoId EssenceAlert = "Essence"; #region Visualizer [DataField("state")] public string State = "idle"; [DataField("corporealState")] public string CorporealState = "active"; [DataField("stunnedState")] public string StunnedState = "stunned"; [DataField("harvestingState")] public string HarvestingState = "harvesting"; #endregion [DataField] public EntityUid? Action; /// /// Offbrand - how much cold damage to deal on harvest /// [DataField] public Content.Shared.Damage.DamageSpecifier HarvestDamage = new() { DamageDict = new() { { "Cold", 200 }, } }; }