public static bool IsArea(this TargetTypes baseFlags)
 {
     return(baseFlags.Category() == TargetSelections.AREA || baseFlags.Category() == TargetSelections.CONE);
 }
    private void SelectEffectImplicitTargets(int effIndex, TargetTypes targetType, ref int processedEffectMask)
    {
        int effectMask = (1 << effIndex);

        // set the same target list for all effects
        // some spells appear to need this, however this requires more research
        switch (targetType.Category())
        {
        case TargetSelections.NEARBY:
        case TargetSelections.CONE:
        case TargetSelections.AREA:
            // targets for effect already selected
            if ((effectMask & processedEffectMask) > 0)
            {
                return;
            }

            var currentEffect = GetEffect(effIndex);
            if (currentEffect != null)
            {
                // choose which targets we can select at once
                foreach (var effect in SpellEffects)
                {
                    //for (uint32 j = effIndex + 1; j < MAX_SPELL_EFFECTS; ++j)
                    if (effect == null || effect.EffectIndex <= effIndex)
                    {
                        continue;
                    }

                    if (currentEffect.TargetA == effect.TargetA && currentEffect.TargetB == effect.TargetB &&
                        currentEffect.CalcRadius(Caster, this) == effect.CalcRadius(Caster, this))
                    {
                        effectMask |= 1 << effect.EffectIndex;
                    }
                }
            }
            processedEffectMask |= effectMask;
            break;

        default:
            break;
        }

        switch (targetType.Category())
        {
        case TargetSelections.CHANNEL:
            //SelectImplicitChannelTargets(effIndex, targetType);
            break;

        case TargetSelections.NEARBY:
            //SelectImplicitNearbyTargets(effIndex, targetType, effectMask);
            break;

        case TargetSelections.CONE:
            //SelectImplicitConeTargets(effIndex, targetType, effectMask);
            break;

        case TargetSelections.AREA:
            SelectImplicitAreaTargets(effIndex, targetType, effectMask);
            break;

        case TargetSelections.DEFAULT:
            #region Default Targets

            /*switch (targetType.GetObjectType())
             * {
             *  case TARGET_OBJECT_TYPE_SRC:
             *      switch (targetType.GetReferenceType())
             *      {
             *          case TARGET_REFERENCE_TYPE_CASTER:
             *              m_targets.SetSrc(* m_caster);
             *              break;
             *          default:
             *              ASSERT(false && "Spell::SelectEffectImplicitTargets: received not implemented select target reference type for TARGET_TYPE_OBJECT_SRC");
             *              break;
             *      }
             *      break;
             *  case TARGET_OBJECT_TYPE_DEST:
             *       switch (targetType.GetReferenceType())
             *       {
             *           case TARGET_REFERENCE_TYPE_CASTER:
             *               SelectImplicitCasterDestTargets(effIndex, targetType);
             *               break;
             *           case TARGET_REFERENCE_TYPE_TARGET:
             *               SelectImplicitTargetDestTargets(effIndex, targetType);
             *               break;
             *           case TARGET_REFERENCE_TYPE_DEST:
             *               SelectImplicitDestDestTargets(effIndex, targetType);
             *               break;
             *           default:
             *               ASSERT(false && "Spell::SelectEffectImplicitTargets: received not implemented select target reference type for TARGET_TYPE_OBJECT_DEST");
             *               break;
             *       }
             *       break;
             *  default:
             *      switch (targetType.GetReferenceType())
             *      {
             *          case TARGET_REFERENCE_TYPE_CASTER:
             *              SelectImplicitCasterObjectTargets(effIndex, targetType);
             *              break;
             *          case TARGET_REFERENCE_TYPE_TARGET:
             *              SelectImplicitTargetObjectTargets(effIndex, targetType);
             *              break;
             *          default:
             *              ASSERT(false && "Spell::SelectEffectImplicitTargets: received not implemented select target reference type for TARGET_TYPE_OBJECT");
             *              break;
             *      }
             *      break;
             * }*/
            #endregion
            break;

        case TargetSelections.NYI:
            Debug.LogErrorFormat("SPELL: Target type in spell #{0} is not implemented yet!", SpellInfo.Id);
            break;

        default:
            break;
        }
    }