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);
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;
}
@ -251,7 +251,7 @@ public class ComputerPlayer extends PlayerImpl {
for (Permanent permanent : targets) {
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
if (target.getNumberOfTargets() == target.getTargets().size()) {
if (target.getMinNumberOfTargets() == target.getTargets().size()) {
if (outcome.isGood() && hasOpponent(permanent.getControllerId(), game)) {
return true;
}
@ -348,7 +348,7 @@ public class ComputerPlayer extends PlayerImpl {
target.add(randomOpponentId, game);
return true;
}
if (!target.isRequired(sourceId, game) || target.getNumberOfTargets() == 0) {
if (!target.isRequired(sourceId, game) || target.getMinNumberOfTargets() == 0) {
return false;
}
if (target.canTarget(abilityControllerId, randomOpponentId, source, game)) {
@ -548,7 +548,7 @@ public class ComputerPlayer extends PlayerImpl {
boolean required = target.isRequired(sourceId, 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;
}
@ -672,7 +672,7 @@ public class ComputerPlayer extends PlayerImpl {
for (Permanent permanent : targets) {
if (target.canTarget(abilityControllerId, 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;
}
}
@ -2051,9 +2051,9 @@ public class ComputerPlayer extends PlayerImpl {
cardChoices.remove(card);
} else {
// 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;
}
}
@ -2082,9 +2082,9 @@ public class ComputerPlayer extends PlayerImpl {
cardChoices.remove(card); // selectCard don't remove cards (only on second+ tries)
} else {
// 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;
}
}

View file

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

View file

@ -137,7 +137,7 @@ class ArchdruidsCharmMode1Effect extends SearchEffect {
private void setText() {
StringBuilder sb = new StringBuilder();
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(target.getTargetName()).append(revealCards ? " and reveal them." : ".");
} else {

View file

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

View file

@ -47,7 +47,7 @@ public class DiscardTargetCost extends CostImpl {
if (player == null) {
return false;
}
int amount = this.getTargets().get(0).getNumberOfTargets();
int amount = this.getTargets().get(0).getMinNumberOfTargets();
if (randomDiscard) {
this.cards.addAll(player.discard(amount, true, true, source, game).getCards(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);
if (target.getMaxNumberOfTargets() > 1) {
this.text = "exile "
+ (target.getNumberOfTargets() == 1
+ (target.getMinNumberOfTargets() == 1
&& target.getMaxNumberOfTargets() == Integer.MAX_VALUE ? "one or more"
: ((target.getNumberOfTargets() < target.getMaxNumberOfTargets() ? "up to " : ""))
: ((target.getMinNumberOfTargets() < target.getMaxNumberOfTargets() ? "up to " : ""))
+ CardUtil.numberToText(target.getMaxNumberOfTargets()))
+ ' ' + target.getTargetName();
} else {

View file

@ -25,7 +25,7 @@ public class ReturnToHandChosenControlledPermanentCost extends CostImpl {
public ReturnToHandChosenControlledPermanentCost(TargetControlledPermanent target) {
target.withNotTarget(true);
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()) + ' '
+ target.getTargetName()
+ (target.getTargetName().endsWith(" you control") ? "" : " you control")

View file

@ -29,7 +29,7 @@ public class RevealTargetFromHandCost extends CostImpl {
public RevealTargetFromHandCost(TargetCardInHand target) {
this.addTarget(target);
this.allowNoReveal = target.getNumberOfTargets() == 0;
this.allowNoReveal = target.getMinNumberOfTargets() == 0;
this.text = "reveal " + target.getDescription();
this.revealedCards = new ArrayList<>();
}
@ -62,7 +62,7 @@ public class RevealTargetFromHandCost extends CostImpl {
MageObject baseObject = game.getBaseObject(source.getSourceId());
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
return paid;
}

View file

@ -67,7 +67,7 @@ public class SacrificeTargetCost extends CostImpl implements SacrificeCost {
addSacrificeTarget(game, permanent);
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
}
}
@ -88,7 +88,7 @@ public class SacrificeTargetCost extends CostImpl implements SacrificeCost {
return false;
}
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)) {
if (controller.canPaySacrificeCost(permanent, source, controllerId, game)) {
validTargets++;
@ -114,11 +114,11 @@ public class SacrificeTargetCost extends CostImpl implements SacrificeCost {
if (target.getMinNumberOfTargets() != target.getMaxNumberOfTargets()) {
return target.getTargetName();
}
if (target.getNumberOfTargets() == 1
if (target.getMinNumberOfTargets() == 1
|| target.getTargetName().startsWith("a ")
|| target.getTargetName().startsWith("an ")) {
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.withNotTarget(true); // costs are never targeted
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.addArticle(target.getTargetName()));
}
@ -47,7 +47,7 @@ public class TapTargetCost extends CostImpl {
permanents.add(permanent);
}
}
if (target.getNumberOfTargets() == 0) {
if (target.getMinNumberOfTargets() == 0) {
paid = true; // e.g. Aryel with X = 0
}
source.getEffects().setValue("tappedPermanents", permanents);

View file

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

View file

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

View file

@ -87,7 +87,7 @@ public class SearchLibraryPutInHandOrOnBattlefieldEffect extends SearchEffect {
private void setText() {
StringBuilder sb = new StringBuilder();
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(target.getTargetName()).append(revealCards ? ", reveal them," : "").append(" and put them into your hand");
} else {

View file

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

View file

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

View file

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

View file

@ -63,7 +63,7 @@ public class TargetCard extends TargetObject {
public boolean canChoose(UUID sourceControllerId, Ability source, Game game) {
UUID sourceId = source != null ? source.getSourceId() : null;
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;
}
for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) {

View file

@ -72,11 +72,6 @@ public abstract class TargetImpl implements Target {
this.shouldReportEvents = target.shouldReportEvents;
}
@Override
public int getNumberOfTargets() {
return this.minNumberOfTargets;
}
@Override
public int getMinNumberOfTargets() {
return this.minNumberOfTargets;
@ -234,7 +229,7 @@ public abstract class TargetImpl implements Target {
@Override
public boolean isChosen(Game game) {
if (getMaxNumberOfTargets() == 0 && getNumberOfTargets() == 0) {
if (getMaxNumberOfTargets() == 0 && getMinNumberOfTargets() == 0) {
return true;
}
return getMaxNumberOfTargets() != 0 && targets.size() == getMaxNumberOfTargets() || chosen;
@ -258,7 +253,7 @@ public abstract class TargetImpl implements Target {
if (!targets.containsKey(id)) {
targets.put(id, 0);
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))) {
targets.put(id, 0);
rememberZoneChangeCounter(id, game);
chosen = targets.size() >= getNumberOfTargets();
chosen = targets.size() >= getMinNumberOfTargets();
if (!skipEvent && shouldReportEvents) {
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()))) {
targets.put(id, amount);
rememberZoneChangeCounter(id, game);
chosen = targets.size() >= getNumberOfTargets();
chosen = targets.size() >= getMinNumberOfTargets();
if (!skipEvent && shouldReportEvents) {
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.TARGETED, id, source, source.getControllerId()));
}
@ -341,7 +336,7 @@ public abstract class TargetImpl implements Target {
return false;
}
chosen = targets.size() >= getNumberOfTargets();
chosen = targets.size() >= getMinNumberOfTargets();
do {
if (!targetController.canRespond()) {
return chosen;
@ -349,7 +344,7 @@ public abstract class TargetImpl implements Target {
if (!targetController.choose(outcome, this, source, game)) {
return chosen;
}
chosen = targets.size() >= getNumberOfTargets();
chosen = targets.size() >= getMinNumberOfTargets();
} while (!isChosen(game) && !doneChoosing(game));
return chosen;
}
@ -363,7 +358,7 @@ public abstract class TargetImpl implements Target {
List<UUID> possibleTargets = new ArrayList<>(possibleTargets(playerId, source, game));
chosen = targets.size() >= getNumberOfTargets();
chosen = targets.size() >= getMinNumberOfTargets();
do {
if (!targetController.canRespond()) {
return chosen;
@ -392,7 +387,7 @@ public abstract class TargetImpl implements Target {
return chosen;
}
}
chosen = targets.size() >= getNumberOfTargets();
chosen = targets.size() >= getMinNumberOfTargets();
} while (!isChosen(game) && !doneChoosing(game));
return chosen;
@ -438,7 +433,7 @@ public abstract class TargetImpl implements Target {
return false;
}
// if no targets have to be set and no targets are set, that's legal
if (getNumberOfTargets() == 0) {
if (getMinNumberOfTargets() == 0) {
return true;
}
}
@ -457,7 +452,7 @@ public abstract class TargetImpl implements Target {
// e.g. for {'A','B','C','D'} => N = 4
int N = possibleTargets.size();
// not enough targets, return no option
if (N < getNumberOfTargets()) {
if (N < getMinNumberOfTargets()) {
return options;
}
// 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
maxK = N;
}
int minK = getNumberOfTargets();
if (getNumberOfTargets() == 0) { // add option without targets if possible
int minK = getMinNumberOfTargets();
if (getMinNumberOfTargets() == 0) { // add option without targets if possible
TargetImpl target = this.copy();
options.add(target);
minK = 1;
@ -688,7 +683,7 @@ public abstract class TargetImpl implements Target {
String abilityText = source.getRule(true).toLowerCase();
boolean strictModeEnabled = player.getStrictChooseMode();
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)
&& playerAutoTargetLevel > 0 // Human player has enabled auto-choose in settings
&& !abilityText.contains("search"); // Do not autochoose for any effects which involve searching

View file

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

View file

@ -86,7 +86,7 @@ public class TargetCardInOpponentsGraveyard extends TargetCard {
@Override
public boolean canChoose(UUID sourceControllerId, Ability source, Game game) {
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;
}
Player sourceController = game.getPlayer(sourceControllerId);