private void RemoveStatesWithLowerSeverity(AnimatableCharacterState state)
 {
     if (state.StateName == HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.UNCONSCIOUS)
     {
         RemoveStateFromActiveStates(HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.STUNNED);
     }
     else if (state.StateName == HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.DYING)
     {
         RemoveStateFromActiveStates(HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.STUNNED);
         RemoveStateFromActiveStates(HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.UNCONSCIOUS);
     }
     else if (state.StateName == HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.DEAD)
     {
         RemoveStateFromActiveStates(HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.STUNNED);
         RemoveStateFromActiveStates(HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.UNCONSCIOUS);
         RemoveStateFromActiveStates(HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.DYING);
     }
     else if (state.StateName == HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.KNOCKEDBACK)
     {
         RemoveStateFromActiveStates(HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.STUNNED);
         RemoveStateFromActiveStates(HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.UNCONSCIOUS);
         RemoveStateFromActiveStates(HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.DYING);
         RemoveStateFromActiveStates(HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.DEAD);
     }
 }
 public void AddState(AnimatableCharacterState state, bool playImmediately = true)
 {
     if (!ActiveStates.Any(s => s.StateName == state.StateName))
     {
         ActiveStates.Add(state);
     }
     if (playImmediately && state.AbilityAlreadyPlayed == false)
     {
         state.Ability.Play(this);
         state.AbilityAlreadyPlayed = true;
     }
     NotifyOfPropertyChange(() => ActiveStates.Count);
 }
        public void RemoveState(AnimatableCharacterState state, bool playImmediately = true)
        {
            ActiveStates.Remove(state);
            state.Ability?.Stop(this);
            state.AbilityAlreadyPlayed = false;
            bool canPlayStopAbility = checkIfStopAbilityShouldBePlayedForAttackImpacts(state);
            var  stopAbility        = state.Ability.StopAbility;

            if (canPlayStopAbility && playImmediately)
            {
                stopAbility?.Play(this);
            }
            RemoveStatesWithLowerSeverity(state);
            NotifyOfPropertyChange(() => ActiveStates.Count);
        }
        private bool checkIfStopAbilityShouldBePlayedForAttackImpacts(AnimatableCharacterState state)
        {
            switch (state.StateName)
            {
            case HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.DYING:
                return(!this.ActiveStates.Any(s => s.StateName == HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.DEAD));

            case HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.UNCONSCIOUS:
                return(!this.ActiveStates.Any(s => s.StateName == HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.DEAD || s.StateName == HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.DYING));

            case HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.STUNNED:
                return(!this.ActiveStates.Any(s => s.StateName == HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.DEAD || s.StateName == HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.DYING || s.StateName == HeroVirtualTabletop.AnimatedAbility.DefaultAbilities.UNCONSCIOUS));

            default:
                return(true);
            }
        }