mirror of
https://github.com/magefree/mage.git
synced 2025-12-20 02:30:08 -08:00
refactor: removed useless getNumberOfTargets from Target (replaced with getMinNumberOfTargets)
This commit is contained in:
parent
264eb58644
commit
00dc6f4742
20 changed files with 55 additions and 63 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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)) {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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(' ');
|
||||||
|
|
|
||||||
|
|
@ -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(' ');
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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)) {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue