refactor: removed useless getNumberOfTargets from Target (replaced with getMinNumberOfTargets)

This commit is contained in:
Oleg Agafonov 2025-05-06 23:05:39 +04:00
parent 264eb58644
commit 00dc6f4742
20 changed files with 55 additions and 63 deletions

View file

@ -164,7 +164,7 @@ public class ComputerPlayer extends PlayerImpl {
boolean required = target.isRequired(sourceId, game); boolean required = target.isRequired(sourceId, game);
Set<UUID> possibleTargets = target.possibleTargets(abilityControllerId, source, game); Set<UUID> possibleTargets = target.possibleTargets(abilityControllerId, source, game);
if (possibleTargets.isEmpty() || target.getTargets().size() >= target.getNumberOfTargets()) { if (possibleTargets.isEmpty() || target.getTargets().size() >= target.getMinNumberOfTargets()) {
required = false; required = false;
} }
@ -251,7 +251,7 @@ public class ComputerPlayer extends PlayerImpl {
for (Permanent permanent : targets) { for (Permanent permanent : targets) {
if (target.canTarget(abilityControllerId, permanent.getId(), source, game) && !target.getTargets().contains(permanent.getId())) { if (target.canTarget(abilityControllerId, permanent.getId(), source, game) && !target.getTargets().contains(permanent.getId())) {
// stop to add targets if not needed and outcome is no advantage for AI player // stop to add targets if not needed and outcome is no advantage for AI player
if (target.getNumberOfTargets() == target.getTargets().size()) { if (target.getMinNumberOfTargets() == target.getTargets().size()) {
if (outcome.isGood() && hasOpponent(permanent.getControllerId(), game)) { if (outcome.isGood() && hasOpponent(permanent.getControllerId(), game)) {
return true; return true;
} }
@ -348,7 +348,7 @@ public class ComputerPlayer extends PlayerImpl {
target.add(randomOpponentId, game); target.add(randomOpponentId, game);
return true; return true;
} }
if (!target.isRequired(sourceId, game) || target.getNumberOfTargets() == 0) { if (!target.isRequired(sourceId, game) || target.getMinNumberOfTargets() == 0) {
return false; return false;
} }
if (target.canTarget(abilityControllerId, randomOpponentId, source, game)) { if (target.canTarget(abilityControllerId, randomOpponentId, source, game)) {
@ -548,7 +548,7 @@ public class ComputerPlayer extends PlayerImpl {
boolean required = target.isRequired(sourceId, game); boolean required = target.isRequired(sourceId, game);
Set<UUID> possibleTargets = target.possibleTargets(abilityControllerId, source, game); Set<UUID> possibleTargets = target.possibleTargets(abilityControllerId, source, game);
if (possibleTargets.isEmpty() || target.getTargets().size() >= target.getNumberOfTargets()) { if (possibleTargets.isEmpty() || target.getTargets().size() >= target.getMinNumberOfTargets()) {
required = false; required = false;
} }
@ -672,7 +672,7 @@ public class ComputerPlayer extends PlayerImpl {
for (Permanent permanent : targets) { for (Permanent permanent : targets) {
if (target.canTarget(abilityControllerId, permanent.getId(), source, game)) { if (target.canTarget(abilityControllerId, permanent.getId(), source, game)) {
target.addTarget(permanent.getId(), source, game); target.addTarget(permanent.getId(), source, game);
if (target.getNumberOfTargets() <= target.getTargets().size() && (!outcome.isGood() || target.getMaxNumberOfTargets() <= target.getTargets().size())) { if (target.getMinNumberOfTargets() <= target.getTargets().size() && (!outcome.isGood() || target.getMaxNumberOfTargets() <= target.getTargets().size())) {
return true; return true;
} }
} }
@ -2051,9 +2051,9 @@ public class ComputerPlayer extends PlayerImpl {
cardChoices.remove(card); cardChoices.remove(card);
} else { } else {
// We don't have any valid target to choose so stop choosing // We don't have any valid target to choose so stop choosing
return target.getTargets().size() >= target.getNumberOfTargets(); return target.getTargets().size() >= target.getMinNumberOfTargets();
} }
if (outcome == Outcome.Neutral && target.getTargets().size() > target.getNumberOfTargets() + (target.getMaxNumberOfTargets() - target.getNumberOfTargets()) / 2) { if (outcome == Outcome.Neutral && target.getTargets().size() > target.getMinNumberOfTargets() + (target.getMaxNumberOfTargets() - target.getMinNumberOfTargets()) / 2) {
return true; return true;
} }
} }
@ -2082,9 +2082,9 @@ public class ComputerPlayer extends PlayerImpl {
cardChoices.remove(card); // selectCard don't remove cards (only on second+ tries) cardChoices.remove(card); // selectCard don't remove cards (only on second+ tries)
} else { } else {
// We don't have any valid target to choose so stop choosing // We don't have any valid target to choose so stop choosing
return target.getTargets().size() >= target.getNumberOfTargets(); return target.getTargets().size() >= target.getMinNumberOfTargets();
} }
if (outcome == Outcome.Neutral && target.getTargets().size() > target.getNumberOfTargets() + (target.getMaxNumberOfTargets() - target.getNumberOfTargets()) / 2) { if (outcome == Outcome.Neutral && target.getTargets().size() > target.getMinNumberOfTargets() + (target.getMaxNumberOfTargets() - target.getMinNumberOfTargets()) / 2) {
return true; return true;
} }
} }

View file

@ -699,11 +699,11 @@ public class HumanPlayer extends PlayerImpl {
while (canRespond()) { while (canRespond()) {
Set<UUID> possibleTargetIds = target.possibleTargets(abilityControllerId, source, game); Set<UUID> possibleTargetIds = target.possibleTargets(abilityControllerId, source, game);
if (possibleTargetIds == null || possibleTargetIds.isEmpty()) { if (possibleTargetIds == null || possibleTargetIds.isEmpty()) {
return target.getTargets().size() >= target.getNumberOfTargets(); return target.getTargets().size() >= target.getMinNumberOfTargets();
} }
boolean required = target.isRequired(source != null ? source.getSourceId() : null, game); boolean required = target.isRequired(source != null ? source.getSourceId() : null, game);
if (target.getTargets().size() >= target.getNumberOfTargets()) { if (target.getTargets().size() >= target.getMinNumberOfTargets()) {
required = false; required = false;
} }
@ -770,7 +770,7 @@ public class HumanPlayer extends PlayerImpl {
// send other command like cancel or done (??sends other commands like concede??) // send other command like cancel or done (??sends other commands like concede??)
// auto-complete on all selected // auto-complete on all selected
if (target.getTargets().size() >= target.getNumberOfTargets()) { if (target.getTargets().size() >= target.getMinNumberOfTargets()) {
return true; return true;
} }
@ -802,7 +802,7 @@ public class HumanPlayer extends PlayerImpl {
Set<UUID> possibleTargetIds = target.possibleTargets(abilityControllerId, source, game); Set<UUID> possibleTargetIds = target.possibleTargets(abilityControllerId, source, game);
boolean required = target.isRequired(source != null ? source.getSourceId() : null, game); boolean required = target.isRequired(source != null ? source.getSourceId() : null, game);
if (possibleTargetIds.isEmpty() if (possibleTargetIds.isEmpty()
|| target.getTargets().size() >= target.getNumberOfTargets()) { || target.getTargets().size() >= target.getMinNumberOfTargets()) {
required = false; required = false;
} }
@ -840,7 +840,7 @@ public class HumanPlayer extends PlayerImpl {
} }
} }
} else { } else {
if (target.getTargets().size() >= target.getNumberOfTargets()) { if (target.getTargets().size() >= target.getMinNumberOfTargets()) {
return true; return true;
} }
if (!required) { if (!required) {
@ -856,7 +856,7 @@ public class HumanPlayer extends PlayerImpl {
if (options == null) { if (options == null) {
options = new HashMap<>(); options = new HashMap<>();
} }
if (target.getTargets().size() >= target.getNumberOfTargets() if (target.getTargets().size() >= target.getMinNumberOfTargets()
&& !options.containsKey("UI.right.btn.text")) { && !options.containsKey("UI.right.btn.text")) {
options.put("UI.right.btn.text", "Done"); options.put("UI.right.btn.text", "Done");
} }
@ -887,7 +887,7 @@ public class HumanPlayer extends PlayerImpl {
boolean required = target.isRequired(source != null ? source.getSourceId() : null, game); boolean required = target.isRequired(source != null ? source.getSourceId() : null, game);
int count = cards.count(target.getFilter(), abilityControllerId, source, game); int count = cards.count(target.getFilter(), abilityControllerId, source, game);
if (count == 0 if (count == 0
|| target.getTargets().size() >= target.getNumberOfTargets()) { || target.getTargets().size() >= target.getMinNumberOfTargets()) {
required = false; required = false;
} }
@ -933,7 +933,7 @@ public class HumanPlayer extends PlayerImpl {
} }
} }
} else { } else {
if (target.getTargets().size() >= target.getNumberOfTargets()) { if (target.getTargets().size() >= target.getMinNumberOfTargets()) {
return true; return true;
} }
if (!required) { if (!required) {
@ -968,7 +968,7 @@ public class HumanPlayer extends PlayerImpl {
boolean required = target.isRequiredExplicitlySet() ? target.isRequired() : target.isRequired(source); boolean required = target.isRequiredExplicitlySet() ? target.isRequired() : target.isRequired(source);
int count = cards.count(target.getFilter(), abilityControllerId, source, game); int count = cards.count(target.getFilter(), abilityControllerId, source, game);
if (count == 0 if (count == 0
|| target.getTargets().size() >= target.getNumberOfTargets()) { || target.getTargets().size() >= target.getMinNumberOfTargets()) {
required = false; required = false;
} }
@ -1013,7 +1013,7 @@ public class HumanPlayer extends PlayerImpl {
} }
} }
} else { } else {
if (target.getTargets().size() >= target.getNumberOfTargets()) { if (target.getTargets().size() >= target.getMinNumberOfTargets()) {
return true; return true;
} }
if (!required) { if (!required) {
@ -1061,7 +1061,7 @@ public class HumanPlayer extends PlayerImpl {
Set<UUID> possibleTargetIds = target.possibleTargets(abilityControllerId, source, game); Set<UUID> possibleTargetIds = target.possibleTargets(abilityControllerId, source, game);
boolean required = target.isRequired(source.getSourceId(), game); boolean required = target.isRequired(source.getSourceId(), game);
if (possibleTargetIds.isEmpty() if (possibleTargetIds.isEmpty()
|| target.getSize() >= target.getNumberOfTargets()) { || target.getSize() >= target.getMinNumberOfTargets()) {
required = false; required = false;
} }

View file

@ -137,7 +137,7 @@ class ArchdruidsCharmMode1Effect extends SearchEffect {
private void setText() { private void setText() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("Search your library for "); sb.append("Search your library for ");
if (target.getNumberOfTargets() == 0 && target.getMaxNumberOfTargets() > 0) { if (target.getMinNumberOfTargets() == 0 && target.getMaxNumberOfTargets() > 0) {
sb.append("up to ").append(CardUtil.numberToText(target.getMaxNumberOfTargets())).append(' '); sb.append("up to ").append(CardUtil.numberToText(target.getMaxNumberOfTargets())).append(' ');
sb.append(target.getTargetName()).append(revealCards ? " and reveal them." : "."); sb.append(target.getTargetName()).append(revealCards ? " and reveal them." : ".");
} else { } else {

View file

@ -539,7 +539,7 @@ public class TestPlayer implements Player {
} }
// found, can use as target // found, can use as target
if (currentTarget.getNumberOfTargets() == 1) { if (currentTarget.getMinNumberOfTargets() == 1) {
currentTarget.clearChosen(); currentTarget.clearChosen();
} }
if (currentTarget.getOriginalTarget() instanceof TargetCreaturePermanentAmount) { if (currentTarget.getOriginalTarget() instanceof TargetCreaturePermanentAmount) {

View file

@ -47,7 +47,7 @@ public class DiscardTargetCost extends CostImpl {
if (player == null) { if (player == null) {
return false; return false;
} }
int amount = this.getTargets().get(0).getNumberOfTargets(); int amount = this.getTargets().get(0).getMinNumberOfTargets();
if (randomDiscard) { if (randomDiscard) {
this.cards.addAll(player.discard(amount, true, true, source, game).getCards(game)); this.cards.addAll(player.discard(amount, true, true, source, game).getCards(game));
} else if (this.getTargets().choose(Outcome.Discard, controllerId, source.getSourceId(), source, game)) { } else if (this.getTargets().choose(Outcome.Discard, controllerId, source.getSourceId(), source, game)) {

View file

@ -33,9 +33,9 @@ public class ExileFromGraveCost extends CostImpl {
this.addTarget(target); this.addTarget(target);
if (target.getMaxNumberOfTargets() > 1) { if (target.getMaxNumberOfTargets() > 1) {
this.text = "exile " this.text = "exile "
+ (target.getNumberOfTargets() == 1 + (target.getMinNumberOfTargets() == 1
&& target.getMaxNumberOfTargets() == Integer.MAX_VALUE ? "one or more" && target.getMaxNumberOfTargets() == Integer.MAX_VALUE ? "one or more"
: ((target.getNumberOfTargets() < target.getMaxNumberOfTargets() ? "up to " : "")) : ((target.getMinNumberOfTargets() < target.getMaxNumberOfTargets() ? "up to " : ""))
+ CardUtil.numberToText(target.getMaxNumberOfTargets())) + CardUtil.numberToText(target.getMaxNumberOfTargets()))
+ ' ' + target.getTargetName(); + ' ' + target.getTargetName();
} else { } else {

View file

@ -25,7 +25,7 @@ public class ReturnToHandChosenControlledPermanentCost extends CostImpl {
public ReturnToHandChosenControlledPermanentCost(TargetControlledPermanent target) { public ReturnToHandChosenControlledPermanentCost(TargetControlledPermanent target) {
target.withNotTarget(true); target.withNotTarget(true);
this.addTarget(target); this.addTarget(target);
if (target.getMaxNumberOfTargets() > 1 && target.getMaxNumberOfTargets() == target.getNumberOfTargets()) { if (target.getMaxNumberOfTargets() > 1 && target.getMaxNumberOfTargets() == target.getMinNumberOfTargets()) {
this.text = "return " + CardUtil.numberToText(target.getMaxNumberOfTargets()) + ' ' this.text = "return " + CardUtil.numberToText(target.getMaxNumberOfTargets()) + ' '
+ target.getTargetName() + target.getTargetName()
+ (target.getTargetName().endsWith(" you control") ? "" : " you control") + (target.getTargetName().endsWith(" you control") ? "" : " you control")

View file

@ -29,7 +29,7 @@ public class RevealTargetFromHandCost extends CostImpl {
public RevealTargetFromHandCost(TargetCardInHand target) { public RevealTargetFromHandCost(TargetCardInHand target) {
this.addTarget(target); this.addTarget(target);
this.allowNoReveal = target.getNumberOfTargets() == 0; this.allowNoReveal = target.getMinNumberOfTargets() == 0;
this.text = "reveal " + target.getDescription(); this.text = "reveal " + target.getDescription();
this.revealedCards = new ArrayList<>(); this.revealedCards = new ArrayList<>();
} }
@ -62,7 +62,7 @@ public class RevealTargetFromHandCost extends CostImpl {
MageObject baseObject = game.getBaseObject(source.getSourceId()); MageObject baseObject = game.getBaseObject(source.getSourceId());
player.revealCards(baseObject == null ? "card cost" : baseObject.getIdName(), cards, game); player.revealCards(baseObject == null ? "card cost" : baseObject.getIdName(), cards, game);
} }
if (this.getTargets().get(0).getNumberOfTargets() <= numberCardsRevealed) { if (this.getTargets().get(0).getMinNumberOfTargets() <= numberCardsRevealed) {
paid = true; // e.g. for optional additional costs. example: Dragonlord's Prerogative also true if 0 cards shown paid = true; // e.g. for optional additional costs. example: Dragonlord's Prerogative also true if 0 cards shown
return paid; return paid;
} }

View file

@ -67,7 +67,7 @@ public class SacrificeTargetCost extends CostImpl implements SacrificeCost {
addSacrificeTarget(game, permanent); addSacrificeTarget(game, permanent);
paid |= permanent.sacrifice(source, game); paid |= permanent.sacrifice(source, game);
} }
if (!paid && this.getTargets().get(0).getNumberOfTargets() == 0) { if (!paid && this.getTargets().get(0).getMinNumberOfTargets() == 0) {
paid = true; // e.g. for Devouring Rage paid = true; // e.g. for Devouring Rage
} }
} }
@ -88,7 +88,7 @@ public class SacrificeTargetCost extends CostImpl implements SacrificeCost {
return false; return false;
} }
int validTargets = 0; int validTargets = 0;
int neededTargets = this.getTargets().get(0).getNumberOfTargets(); int neededTargets = this.getTargets().get(0).getMinNumberOfTargets();
for (Permanent permanent : game.getBattlefield().getActivePermanents(((TargetPermanent) this.getTargets().get(0)).getFilter(), controllerId, source, game)) { for (Permanent permanent : game.getBattlefield().getActivePermanents(((TargetPermanent) this.getTargets().get(0)).getFilter(), controllerId, source, game)) {
if (controller.canPaySacrificeCost(permanent, source, controllerId, game)) { if (controller.canPaySacrificeCost(permanent, source, controllerId, game)) {
validTargets++; validTargets++;
@ -114,11 +114,11 @@ public class SacrificeTargetCost extends CostImpl implements SacrificeCost {
if (target.getMinNumberOfTargets() != target.getMaxNumberOfTargets()) { if (target.getMinNumberOfTargets() != target.getMaxNumberOfTargets()) {
return target.getTargetName(); return target.getTargetName();
} }
if (target.getNumberOfTargets() == 1 if (target.getMinNumberOfTargets() == 1
|| target.getTargetName().startsWith("a ") || target.getTargetName().startsWith("a ")
|| target.getTargetName().startsWith("an ")) { || target.getTargetName().startsWith("an ")) {
return CardUtil.addArticle(target.getTargetName()); return CardUtil.addArticle(target.getTargetName());
} }
return CardUtil.numberToText(target.getNumberOfTargets()) + ' ' + target.getTargetName(); return CardUtil.numberToText(target.getMinNumberOfTargets()) + ' ' + target.getTargetName();
} }
} }

View file

@ -24,7 +24,7 @@ public class TapTargetCost extends CostImpl {
this.target = target; this.target = target;
this.target.withNotTarget(true); // costs are never targeted this.target.withNotTarget(true); // costs are never targeted
this.target.setRequired(false); // can be cancel by user this.target.setRequired(false); // can be cancel by user
this.text = "tap " + (target.getNumberOfTargets() > 1 this.text = "tap " + (target.getMinNumberOfTargets() > 1
? CardUtil.numberToText(target.getMaxNumberOfTargets()) + ' ' + target.getTargetName() ? CardUtil.numberToText(target.getMaxNumberOfTargets()) + ' ' + target.getTargetName()
: CardUtil.addArticle(target.getTargetName())); : CardUtil.addArticle(target.getTargetName()));
} }
@ -47,7 +47,7 @@ public class TapTargetCost extends CostImpl {
permanents.add(permanent); permanents.add(permanent);
} }
} }
if (target.getNumberOfTargets() == 0) { if (target.getMinNumberOfTargets() == 0) {
paid = true; // e.g. Aryel with X = 0 paid = true; // e.g. Aryel with X = 0
} }
source.getEffects().setValue("tappedPermanents", permanents); source.getEffects().setValue("tappedPermanents", permanents);

View file

@ -132,8 +132,8 @@ public class PutOnLibraryTargetEffect extends OneShotEffect {
sb.append("put "); sb.append("put ");
if (target.getMaxNumberOfTargets() == 0 || target.getMaxNumberOfTargets() == Integer.MAX_VALUE) { if (target.getMaxNumberOfTargets() == 0 || target.getMaxNumberOfTargets() == Integer.MAX_VALUE) {
sb.append("any number of "); sb.append("any number of ");
} else if (target.getMaxNumberOfTargets() != 1 || target.getNumberOfTargets() != 1) { } else if (target.getMaxNumberOfTargets() != 1 || target.getMinNumberOfTargets() != 1) {
if (target.getMaxNumberOfTargets() > target.getNumberOfTargets()) { if (target.getMaxNumberOfTargets() > target.getMinNumberOfTargets()) {
sb.append("up to "); sb.append("up to ");
} }
sb.append(CardUtil.numberToText(target.getMaxNumberOfTargets())).append(' '); sb.append(CardUtil.numberToText(target.getMaxNumberOfTargets())).append(' ');

View file

@ -89,7 +89,7 @@ public class ReturnFromGraveyardToBattlefieldTargetEffect extends OneShotEffect
if (target.getMaxNumberOfTargets() == Integer.MAX_VALUE if (target.getMaxNumberOfTargets() == Integer.MAX_VALUE
&& target.getMinNumberOfTargets() == 0) { && target.getMinNumberOfTargets() == 0) {
sb.append("any number of "); sb.append("any number of ");
} else if (target.getMaxNumberOfTargets() != target.getNumberOfTargets()) { } else if (target.getMaxNumberOfTargets() != target.getMinNumberOfTargets()) {
sb.append("up to "); sb.append("up to ");
sb.append(CardUtil.numberToText(target.getMaxNumberOfTargets())); sb.append(CardUtil.numberToText(target.getMaxNumberOfTargets()));
sb.append(' '); sb.append(' ');

View file

@ -87,7 +87,7 @@ public class SearchLibraryPutInHandOrOnBattlefieldEffect extends SearchEffect {
private void setText() { private void setText() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("search your library for "); sb.append("search your library for ");
if (target.getNumberOfTargets() == 0 && target.getMaxNumberOfTargets() > 0) { if (target.getMinNumberOfTargets() == 0 && target.getMaxNumberOfTargets() > 0) {
sb.append("up to ").append(CardUtil.numberToText(target.getMaxNumberOfTargets())).append(' '); sb.append("up to ").append(CardUtil.numberToText(target.getMaxNumberOfTargets())).append(' ');
sb.append(target.getTargetName()).append(revealCards ? ", reveal them," : "").append(" and put them into your hand"); sb.append(target.getTargetName()).append(revealCards ? ", reveal them," : "").append(" and put them into your hand");
} else { } else {

View file

@ -4014,7 +4014,6 @@ public abstract class GameImpl implements Game {
playerObject.resetStoredBookmark(this); playerObject.resetStoredBookmark(this);
playerObject.resetPlayerPassedActions(); playerObject.resetPlayerPassedActions();
playerObject.abort(); playerObject.abort();
} }
} }
fireUpdatePlayersEvent(); fireUpdatePlayersEvent();

View file

@ -2932,7 +2932,7 @@ public abstract class PlayerImpl implements Player, Serializable {
count = Math.min(searchingLibrary.count(target.getFilter(), game), librarySearchLimit); count = Math.min(searchingLibrary.count(target.getFilter(), game), librarySearchLimit);
} }
if (count < target.getNumberOfTargets()) { if (count < target.getMinNumberOfTargets()) {
newTarget.setMinNumberOfTargets(count); newTarget.setMinNumberOfTargets(count);
} }

View file

@ -129,8 +129,6 @@ public interface Target extends Serializable {
int getTargetAmount(UUID targetId); int getTargetAmount(UUID targetId);
int getNumberOfTargets();
int getMinNumberOfTargets(); int getMinNumberOfTargets();
int getMaxNumberOfTargets(); int getMaxNumberOfTargets();

View file

@ -63,7 +63,7 @@ public class TargetCard extends TargetObject {
public boolean canChoose(UUID sourceControllerId, Ability source, Game game) { public boolean canChoose(UUID sourceControllerId, Ability source, Game game) {
UUID sourceId = source != null ? source.getSourceId() : null; UUID sourceId = source != null ? source.getSourceId() : null;
int possibleTargets = 0; int possibleTargets = 0;
if (getNumberOfTargets() == 0) { // if 0 target is valid, the canChoose is always true if (getMinNumberOfTargets() == 0) { // if 0 target is valid, the canChoose is always true
return true; return true;
} }
for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) { for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) {

View file

@ -72,11 +72,6 @@ public abstract class TargetImpl implements Target {
this.shouldReportEvents = target.shouldReportEvents; this.shouldReportEvents = target.shouldReportEvents;
} }
@Override
public int getNumberOfTargets() {
return this.minNumberOfTargets;
}
@Override @Override
public int getMinNumberOfTargets() { public int getMinNumberOfTargets() {
return this.minNumberOfTargets; return this.minNumberOfTargets;
@ -234,7 +229,7 @@ public abstract class TargetImpl implements Target {
@Override @Override
public boolean isChosen(Game game) { public boolean isChosen(Game game) {
if (getMaxNumberOfTargets() == 0 && getNumberOfTargets() == 0) { if (getMaxNumberOfTargets() == 0 && getMinNumberOfTargets() == 0) {
return true; return true;
} }
return getMaxNumberOfTargets() != 0 && targets.size() == getMaxNumberOfTargets() || chosen; return getMaxNumberOfTargets() != 0 && targets.size() == getMaxNumberOfTargets() || chosen;
@ -258,7 +253,7 @@ public abstract class TargetImpl implements Target {
if (!targets.containsKey(id)) { if (!targets.containsKey(id)) {
targets.put(id, 0); targets.put(id, 0);
rememberZoneChangeCounter(id, game); rememberZoneChangeCounter(id, game);
chosen = targets.size() >= getNumberOfTargets(); chosen = targets.size() >= getMinNumberOfTargets();
} }
} }
} }
@ -285,7 +280,7 @@ public abstract class TargetImpl implements Target {
if (!game.replaceEvent(new TargetEvent(id, source))) { if (!game.replaceEvent(new TargetEvent(id, source))) {
targets.put(id, 0); targets.put(id, 0);
rememberZoneChangeCounter(id, game); rememberZoneChangeCounter(id, game);
chosen = targets.size() >= getNumberOfTargets(); chosen = targets.size() >= getMinNumberOfTargets();
if (!skipEvent && shouldReportEvents) { if (!skipEvent && shouldReportEvents) {
game.addSimultaneousEvent(GameEvent.getEvent(GameEvent.EventType.TARGETED, id, source, source.getControllerId())); game.addSimultaneousEvent(GameEvent.getEvent(GameEvent.EventType.TARGETED, id, source, source.getControllerId()));
} }
@ -323,7 +318,7 @@ public abstract class TargetImpl implements Target {
if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TARGET, id, source, source.getControllerId()))) { if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TARGET, id, source, source.getControllerId()))) {
targets.put(id, amount); targets.put(id, amount);
rememberZoneChangeCounter(id, game); rememberZoneChangeCounter(id, game);
chosen = targets.size() >= getNumberOfTargets(); chosen = targets.size() >= getMinNumberOfTargets();
if (!skipEvent && shouldReportEvents) { if (!skipEvent && shouldReportEvents) {
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.TARGETED, id, source, source.getControllerId())); game.fireEvent(GameEvent.getEvent(GameEvent.EventType.TARGETED, id, source, source.getControllerId()));
} }
@ -341,7 +336,7 @@ public abstract class TargetImpl implements Target {
return false; return false;
} }
chosen = targets.size() >= getNumberOfTargets(); chosen = targets.size() >= getMinNumberOfTargets();
do { do {
if (!targetController.canRespond()) { if (!targetController.canRespond()) {
return chosen; return chosen;
@ -349,7 +344,7 @@ public abstract class TargetImpl implements Target {
if (!targetController.choose(outcome, this, source, game)) { if (!targetController.choose(outcome, this, source, game)) {
return chosen; return chosen;
} }
chosen = targets.size() >= getNumberOfTargets(); chosen = targets.size() >= getMinNumberOfTargets();
} while (!isChosen(game) && !doneChoosing(game)); } while (!isChosen(game) && !doneChoosing(game));
return chosen; return chosen;
} }
@ -363,7 +358,7 @@ public abstract class TargetImpl implements Target {
List<UUID> possibleTargets = new ArrayList<>(possibleTargets(playerId, source, game)); List<UUID> possibleTargets = new ArrayList<>(possibleTargets(playerId, source, game));
chosen = targets.size() >= getNumberOfTargets(); chosen = targets.size() >= getMinNumberOfTargets();
do { do {
if (!targetController.canRespond()) { if (!targetController.canRespond()) {
return chosen; return chosen;
@ -392,7 +387,7 @@ public abstract class TargetImpl implements Target {
return chosen; return chosen;
} }
} }
chosen = targets.size() >= getNumberOfTargets(); chosen = targets.size() >= getMinNumberOfTargets();
} while (!isChosen(game) && !doneChoosing(game)); } while (!isChosen(game) && !doneChoosing(game));
return chosen; return chosen;
@ -438,7 +433,7 @@ public abstract class TargetImpl implements Target {
return false; return false;
} }
// if no targets have to be set and no targets are set, that's legal // if no targets have to be set and no targets are set, that's legal
if (getNumberOfTargets() == 0) { if (getMinNumberOfTargets() == 0) {
return true; return true;
} }
} }
@ -457,7 +452,7 @@ public abstract class TargetImpl implements Target {
// e.g. for {'A','B','C','D'} => N = 4 // e.g. for {'A','B','C','D'} => N = 4
int N = possibleTargets.size(); int N = possibleTargets.size();
// not enough targets, return no option // not enough targets, return no option
if (N < getNumberOfTargets()) { if (N < getMinNumberOfTargets()) {
return options; return options;
} }
// not target but that's allowed, return one empty option // not target but that's allowed, return one empty option
@ -479,8 +474,8 @@ public abstract class TargetImpl implements Target {
if (N < maxK) { // less possible targets than the maximum allowed so reduce the max if (N < maxK) { // less possible targets than the maximum allowed so reduce the max
maxK = N; maxK = N;
} }
int minK = getNumberOfTargets(); int minK = getMinNumberOfTargets();
if (getNumberOfTargets() == 0) { // add option without targets if possible if (getMinNumberOfTargets() == 0) { // add option without targets if possible
TargetImpl target = this.copy(); TargetImpl target = this.copy();
options.add(target); options.add(target);
minK = 1; minK = 1;
@ -688,7 +683,7 @@ public abstract class TargetImpl implements Target {
String abilityText = source.getRule(true).toLowerCase(); String abilityText = source.getRule(true).toLowerCase();
boolean strictModeEnabled = player.getStrictChooseMode(); boolean strictModeEnabled = player.getStrictChooseMode();
boolean canAutoChoose = this.getMinNumberOfTargets() == this.getMaxNumberOfTargets() // Targets must be picked boolean canAutoChoose = this.getMinNumberOfTargets() == this.getMaxNumberOfTargets() // Targets must be picked
&& possibleTargets.size() == this.getNumberOfTargets() - this.getSize() // Available targets are equal to the number that must be picked && possibleTargets.size() == this.getMinNumberOfTargets() - this.getSize() // Available targets are equal to the number that must be picked
&& !strictModeEnabled // Test AI is not set to strictChooseMode(true) && !strictModeEnabled // Test AI is not set to strictChooseMode(true)
&& playerAutoTargetLevel > 0 // Human player has enabled auto-choose in settings && playerAutoTargetLevel > 0 // Human player has enabled auto-choose in settings
&& !abilityText.contains("search"); // Do not autochoose for any effects which involve searching && !abilityText.contains("search"); // Do not autochoose for any effects which involve searching

View file

@ -132,7 +132,7 @@ public class TargetPlayer extends TargetImpl {
@Override @Override
public boolean isLegal(Ability source, Game game) { public boolean isLegal(Ability source, Game game) {
//20101001 - 608.2b //20101001 - 608.2b
if (getNumberOfTargets() == 0 && targets.isEmpty()) { if (getMinNumberOfTargets() == 0 && targets.isEmpty()) {
return true; // 0 targets selected is valid return true; // 0 targets selected is valid
} }
return targets.keySet().stream().anyMatch(playerId -> canTarget(playerId, source, game)); return targets.keySet().stream().anyMatch(playerId -> canTarget(playerId, source, game));

View file

@ -86,7 +86,7 @@ public class TargetCardInOpponentsGraveyard extends TargetCard {
@Override @Override
public boolean canChoose(UUID sourceControllerId, Ability source, Game game) { public boolean canChoose(UUID sourceControllerId, Ability source, Game game) {
int possibleTargets = 0; int possibleTargets = 0;
if (getNumberOfTargets() == 0) { // if 0 target is valid, the canChoose is always true if (getMinNumberOfTargets() == 0) { // if 0 target is valid, the canChoose is always true
return true; return true;
} }
Player sourceController = game.getPlayer(sourceControllerId); Player sourceController = game.getPlayer(sourceControllerId);