public boolean chooseTargets() {
        // if not enough targets chosen, reset and cancel Ability
        if (bCancel || (bDoneTarget && !target.isMinTargetsChosen(card, ability))) {
            bCancel = true;
            req.finishedTargeting();
            return false;
        } else if (!doesTarget() || bDoneTarget && target.isMinTargetsChosen(card, ability) || target.isMaxTargetsChosen(card, ability)) {
            Ability_Sub abSub = ability.getSubAbility();

            if (abSub == null) {
                // if no more SubAbilities finish targeting
                req.finishedTargeting();
                return true;
            } else {
                // Has Sub Ability
                Target_Selection ts = new Target_Selection(abSub.getTarget(), abSub);
                ts.setRequirements(req);
                ts.resetTargets();
                return ts.chooseTargets();
            }
        }

        chooseValidInput();

        return false;
    }