using System; namespace GAS.Runtime { public class InstantGameplayEffectData : IGameplayEffectData { private string Name { get; } public GameplayEffectSnapshotPolicy SnapshotPolicy { get; set; } = GameplayEffectSnapshotPolicy.Specified; public GameplayTag[] ApplicationRequiredTags { get; set; } = Array.Empty(); public GameplayTag[] ApplicationImmunityTags { get; set; } = Array.Empty(); public GameplayTag[] RemoveGameplayEffectsWithTags { get; set; } = Array.Empty(); public GameplayCueInstant[] CueOnExecute { get; set; } = Array.Empty(); public GameplayEffectModifier[] Modifiers { get; set; } = Array.Empty(); public GameplayEffectSpecifiedSnapshotConfig[] SpecifiedSnapshotConfigs { get; set; } = Array.Empty(); public InstantGameplayEffectData(string name) => Name = name; public string GetDisplayName() => Name; public virtual EffectsDurationPolicy GetDurationPolicy() => EffectsDurationPolicy.Instant; public virtual float GetDuration() => -1; public virtual float GetPeriod() => 0; public virtual IGameplayEffectData GetPeriodExecution() => null; public GameplayEffectSnapshotPolicy GetSnapshotPolicy() => SnapshotPolicy; public GameplayEffectSpecifiedSnapshotConfig[] GetSpecifiedSnapshotConfigs() => SpecifiedSnapshotConfigs; public virtual GameplayTag[] GetAssetTags() => Array.Empty(); public virtual GameplayTag[] GetGrantedTags() => Array.Empty(); public GameplayTag[] GetRemoveGameplayEffectsWithTags() => RemoveGameplayEffectsWithTags; public GameplayTag[] GetApplicationRequiredTags() => ApplicationRequiredTags; public GameplayTag[] GetApplicationImmunityTags() => ApplicationImmunityTags; public virtual GameplayTag[] GetOngoingRequiredTags() => Array.Empty(); public GameplayCueInstant[] GetCueOnExecute() => CueOnExecute; public virtual GameplayCueInstant[] GetCueOnRemove() => Array.Empty(); public virtual GameplayCueInstant[] GetCueOnAdd() => Array.Empty(); public virtual GameplayCueInstant[] GetCueOnActivate() => Array.Empty(); public virtual GameplayCueInstant[] GetCueOnDeactivate() => Array.Empty(); public virtual GameplayCueDurational[] GetCueDurational() => Array.Empty(); public GameplayEffectModifier[] GetModifiers() => Modifiers; public virtual ExecutionCalculation[] GetExecutions() => Array.Empty(); public virtual GrantedAbilityConfig[] GetGrantedAbilities() => Array.Empty(); public virtual GameplayEffectStacking GetStacking() => GameplayEffectStacking.None; } public class InfiniteGameplayEffectData : InstantGameplayEffectData { public float Period { get; } public IGameplayEffectData PeriodExecution { get; set; } = null; public GameplayTag[] AssetTags { get; set; } = Array.Empty(); public GameplayTag[] GrantedTags { get; set; } = Array.Empty(); public GameplayTag[] OngoingRequiredTags { get; set; } = Array.Empty(); public GameplayCueInstant[] CueOnRemove { get; set; } = Array.Empty(); public GameplayCueInstant[] CueOnAdd { get; set; } = Array.Empty(); public GameplayCueInstant[] CueOnActivate { get; set; } = Array.Empty(); public GameplayCueInstant[] CueOnDeactivate { get; set; } = Array.Empty(); public GameplayCueDurational[] CueDurational { get; set; } = Array.Empty(); public ExecutionCalculation[] Executions { get; set; } = Array.Empty(); public GrantedAbilityConfig[] GrantedAbilities { get; set; } = Array.Empty(); public GameplayEffectStacking Stacking { get; set; } = GameplayEffectStacking.None; public InfiniteGameplayEffectData(string name, float period) : base(name) => Period = period; public override EffectsDurationPolicy GetDurationPolicy() => EffectsDurationPolicy.Infinite; public override float GetPeriod() => Period; public override IGameplayEffectData GetPeriodExecution() => PeriodExecution; public override GameplayTag[] GetAssetTags() => AssetTags; public override GameplayTag[] GetGrantedTags() => GrantedTags; public override GameplayTag[] GetOngoingRequiredTags() => OngoingRequiredTags; public override GameplayCueInstant[] GetCueOnRemove() => CueOnRemove; public override GameplayCueInstant[] GetCueOnAdd() => CueOnAdd; public override GameplayCueInstant[] GetCueOnActivate() => CueOnActivate; public override GameplayCueInstant[] GetCueOnDeactivate() => CueOnDeactivate; public override GameplayCueDurational[] GetCueDurational() => CueDurational; public override ExecutionCalculation[] GetExecutions() => Executions; public override GrantedAbilityConfig[] GetGrantedAbilities() => GrantedAbilities; public override GameplayEffectStacking GetStacking() => Stacking; } public class DurationalGameplayEffectData : InfiniteGameplayEffectData { public float Duration { get; } public DurationalGameplayEffectData(string name, float period, float duration) : base(name, period) => Duration = duration; public override EffectsDurationPolicy GetDurationPolicy() => EffectsDurationPolicy.Duration; public override float GetDuration() => Duration; } }