public static Composite WitchDoctorCombat()
 {
     return(new PrioritySelector(CtxChanger,
                                 new Decorator(
                                     ctx =>
                                     ctx is CombatContext &&
                                     ((CombatContext)ctx).CurrentTarget != null,
                                     new PrioritySelector(
                                         Common.CreateUsePotion(),
                                         Common.CreateWaitWhileFearedStunnedFrozenOrBlind(),
                                         Common.CreateGetHealthGlobe(),
                                         Common.CreateUseHealthWell(),
                                         Common.CreateWaitForAttack(),
                                         Kiting.CreateKitingBehavior(),
                                         // Make sure we are within range/line of sight of the unit.
                                         Movement.MoveTo(ctx => ((CombatContext)ctx).TargetPosition,
                                                         BelphegorSettings.Instance.WitchDoctor.MaximumRange),
                                         new SelfCast(SNOPower.Witchdoctor_SpiritWalk,
                                                      extra =>
                                                      ((CombatContext)extra).CurrentHealthPercentage <=
                                                      BelphegorSettings.Instance.WitchDoctor.SpiritWalkHp),
                                         new SelfCast(SNOPower.Witchdoctor_Sacrifice,
                                                      ctx => Minion.PetCount(((CombatContext)ctx), Pet.ZombieDogs) > 1 &&
                                                      ((CombatContext)ctx).CurrentHealthPercentage <=
                                                      BelphegorSettings.Instance.WitchDoctor.SacrificeHp),
                                         new SelfCast(SNOPower.Witchdoctor_Hex),
                                         new SelfCast(SNOPower.Witchdoctor_SoulHarvest,
                                                      ctx =>
                                                      Clusters.GetClusterCount(ZetaDia.Me, ((CombatContext)ctx), 16f) >=
                                                      BelphegorSettings.Instance.WitchDoctor.SoulHarvestAoECount ||
                                                      (((CombatContext)ctx).CurrentTargetIsElite &&
                                                       ((CombatContext)ctx).TargetDistance < 16f)),
                                         new CastAtLocation(SNOPower.Witchdoctor_Piranhas, ctx => ((CombatContext)ctx).TargetPosition,
                                                            ctx =>
                                                            ((CombatContext)ctx).CurrentTargetIsElite ||
                                                            Clusters.GetClusterCount(((CombatContext)ctx).CurrentTarget, ((CombatContext)ctx), 10f) >=
                                                            BelphegorSettings.Instance.WitchDoctor.PiranhasAoECount),
                                         new SelfCast(SNOPower.Witchdoctor_BigBadVoodoo,
                                                      ctx =>
                                                      Clusters.GetClusterCount(
                                                          ((CombatContext)ctx).CurrentTarget,
                                                          ((CombatContext)ctx), 40f) >=
                                                      BelphegorSettings.Instance.WitchDoctor.BigBadVoodooAoECount ||
                                                      ((CombatContext)ctx).CurrentTargetIsElite),
                                         new SelfCast(SNOPower.Witchdoctor_FetishArmy,
                                                      ctx =>
                                                      Clusters.GetClusterCount(
                                                          ((CombatContext)ctx).CurrentTarget,
                                                          ((CombatContext)ctx), 40f) >=
                                                      BelphegorSettings.Instance.WitchDoctor.FetishArmyAoECount ||
                                                      ((CombatContext)ctx).CurrentTargetIsElite),
                                         new SelfCast(SNOPower.Witchdoctor_Horrify,
                                                      extra =>
                                                      Clusters.GetClusterCount(
                                                          ((CombatContext)extra).CurrentTarget,
                                                          ((CombatContext)extra), 40f) >=
                                                      BelphegorSettings.Instance.WitchDoctor.HorrifyAoECount),
                                         new CastOnUnit(SNOPower.Witchdoctor_MassConfusion,
                                                        ctx => ((CombatContext)ctx).TargetGuid,
                                                        extra =>
                                                        Clusters.GetClusterCount(
                                                            ((CombatContext)extra).CurrentTarget,
                                                            ((CombatContext)extra), 40f) >=
                                                        BelphegorSettings.Instance.WitchDoctor.
                                                        MassConfusionAoECount),
                                         new CastOnUnit(SNOPower.Witchdoctor_GraspOfTheDead,
                                                        ctx => ((CombatContext)ctx).TargetGuid),
                                         new CastAtLocation(SNOPower.Witchdoctor_AcidCloud,
                                                            ctx => ((CombatContext)ctx).TargetPosition,
                                                            ctx =>
                                                            AcidTimer.IsFinished &&
                                                            Clusters.GetClusterCount(
                                                                ((CombatContext)ctx).CurrentTarget,
                                                                ((CombatContext)ctx), 18f) >=
                                                            BelphegorSettings.Instance.WitchDoctor.
                                                            AcidCloudAoECount,
                                                            s => AcidTimer.Reset()),
                                         new CastAtLocation(SNOPower.Witchdoctor_Firebats,
                                                            ctx => ((CombatContext)ctx).TargetPosition,
                                                            extra =>
                                                            Clusters.GetClusterCount(
                                                                ((CombatContext)extra).CurrentTarget,
                                                                ((CombatContext)extra), 40f) >=
                                                            BelphegorSettings.Instance.WitchDoctor.
                                                            FirebatsAoECount),
                                         new CastAtLocation(SNOPower.Witchdoctor_WallOfZombies,
                                                            ctx => ((CombatContext)ctx).TargetPosition,
                                                            extra =>
                                                            Clusters.GetClusterCount(
                                                                ((CombatContext)extra).CurrentTarget,
                                                                ((CombatContext)extra), 40f) >=
                                                            BelphegorSettings.Instance.WitchDoctor.
                                                            WallOfZombiesAoECount),
                                         new CastOnUnit(SNOPower.Witchdoctor_Locust_Swarm,
                                                        ctx => ((CombatContext)ctx).TargetGuid,
                                                        ctx =>
                                                        LocustSwarmTimer.IsFinished &&
                                                        ((CombatContext)ctx).TargetDistance < 16 &&
                                                        ((CombatContext)ctx).CurrentTargetIsElite ||
                                                        Clusters.GetClusterCount(
                                                            ((CombatContext)ctx).CurrentTarget,
                                                            ((CombatContext)ctx), 20) >=
                                                        BelphegorSettings.Instance.WitchDoctor.
                                                        LocustSwarmAoECount,
                                                        s => LocustSwarmTimer.Reset()),
                                         new CastOnUnit(SNOPower.Witchdoctor_Haunt,
                                                        ctx => ((CombatContext)ctx).TargetGuid,
                                                        extra => HauntTimer.IsFinished, s => HauntTimer.Reset()),
                                         //Other spells
                                         new CastOnUnit(SNOPower.Witchdoctor_SpiritBarrage,
                                                        ctx => ((CombatContext)ctx).TargetGuid),
                                         new CastOnUnit(SNOPower.Witchdoctor_ZombieCharger,
                                                        ctx => ((CombatContext)ctx).TargetGuid),
                                         //Primary
                                         new CastAtLocation(SNOPower.Witchdoctor_PlagueOfToads,
                                                            ctx => ((CombatContext)ctx).TargetPosition),
                                         new CastAtLocation(SNOPower.Witchdoctor_CorpseSpider,
                                                            ctx => ((CombatContext)ctx).TargetPosition),
                                         new CastOnUnit(SNOPower.Witchdoctor_Firebomb,
                                                        ctx => ((CombatContext)ctx).TargetGuid),
                                         new CastOnUnit(SNOPower.Witchdoctor_PoisonDart,
                                                        ctx => ((CombatContext)ctx).TargetGuid)
                                         )
                                     ),
                                 new Action(ret => RunStatus.Success)
                                 ));
 }