mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
Radiate fix (#1688)
This commit is contained in:
@@ -1275,7 +1275,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
|
|||||||
// TODO: ideally the AI should consider at this point which targets exactly to pick (e.g. one card in the first player's graveyard
|
// TODO: ideally the AI should consider at this point which targets exactly to pick (e.g. one card in the first player's graveyard
|
||||||
// vs. two cards in the second player's graveyard, which cards are more relevant to be targeted, etc.). Consider improving.
|
// vs. two cards in the second player's graveyard, which cards are more relevant to be targeted, etc.). Consider improving.
|
||||||
if (sa.getTargetRestrictions().isSingleZone()) {
|
if (sa.getTargetRestrictions().isSingleZone()) {
|
||||||
Card firstTgt = sa.getTargets().getFirstTargetedCard();
|
Card firstTgt = sa.getTargetCard();
|
||||||
CardCollection toRemove = new CardCollection();
|
CardCollection toRemove = new CardCollection();
|
||||||
if (firstTgt != null) {
|
if (firstTgt != null) {
|
||||||
for (Card t : sa.getTargets().getTargetCards()) {
|
for (Card t : sa.getTargets().getTargetCards()) {
|
||||||
@@ -1283,9 +1283,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
|
|||||||
toRemove.add(t);
|
toRemove.add(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (Card dontTarget : toRemove) {
|
sa.getTargets().removeAll(toRemove);
|
||||||
sa.getTargets().remove(dontTarget);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ public class CloneAi extends SpellAbilityAi {
|
|||||||
if (sa.hasParam("AILogic") && (!sa.usesTargeting() || sa.isTargetNumberValid())) {
|
if (sa.hasParam("AILogic") && (!sa.usesTargeting() || sa.isTargetNumberValid())) {
|
||||||
// Had a special logic for it and managed to target, so confirm if viable
|
// Had a special logic for it and managed to target, so confirm if viable
|
||||||
if ("CloneBestCreature".equals(sa.getParam("AILogic"))) {
|
if ("CloneBestCreature".equals(sa.getParam("AILogic"))) {
|
||||||
return ComputerUtilCard.evaluateCreature(sa.getTargets().getFirstTargetedCard()) > ComputerUtilCard.evaluateCreature(sa.getHostCard());
|
return ComputerUtilCard.evaluateCreature(sa.getTargetCard()) > ComputerUtilCard.evaluateCreature(sa.getHostCard());
|
||||||
} else if ("IfDefinedCreatureIsBetter".equals(sa.getParam("AILogic"))) {
|
} else if ("IfDefinedCreatureIsBetter".equals(sa.getParam("AILogic"))) {
|
||||||
List<Card> defined = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa);
|
List<Card> defined = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa);
|
||||||
Card bestDefined = ComputerUtilCard.getBestCreatureAI(defined);
|
Card bestDefined = ComputerUtilCard.getBestCreatureAI(defined);
|
||||||
@@ -229,7 +229,7 @@ public class CloneAi extends SpellAbilityAi {
|
|||||||
tgtCard = cloneTargets.get(0);
|
tgtCard = cloneTargets.get(0);
|
||||||
}
|
}
|
||||||
} else if (sa.hasParam("Choices") && sa.usesTargeting()) {
|
} else if (sa.hasParam("Choices") && sa.usesTargeting()) {
|
||||||
tgtCard = sa.getTargets().getFirstTargetedCard();
|
tgtCard = sa.getTargetCard();
|
||||||
}
|
}
|
||||||
|
|
||||||
return tgtCard;
|
return tgtCard;
|
||||||
|
|||||||
@@ -460,12 +460,12 @@ public class CountersPutAi extends CountersAi {
|
|||||||
// only evaluates case where all tokens are placed on a single target
|
// only evaluates case where all tokens are placed on a single target
|
||||||
if (sa.usesTargeting() && sa.getMinTargets() < 2) {
|
if (sa.usesTargeting() && sa.getMinTargets() < 2) {
|
||||||
if (ComputerUtilCard.canPumpAgainstRemoval(ai, sa)) {
|
if (ComputerUtilCard.canPumpAgainstRemoval(ai, sa)) {
|
||||||
Card c = sa.getTargets().getFirstTargetedCard();
|
Card c = sa.getTargetCard();
|
||||||
if (sa.getTargets().size() > 1) {
|
if (sa.getTargets().size() > 1) {
|
||||||
sa.resetTargets();
|
sa.resetTargets();
|
||||||
sa.getTargets().add(c);
|
sa.getTargets().add(c);
|
||||||
}
|
}
|
||||||
sa.addDividedAllocation(sa.getTargetCard(), amount);
|
sa.addDividedAllocation(c, amount);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -210,7 +210,7 @@ public class DamageDealAi extends DamageAiBase {
|
|||||||
if (ai.getGame().getPhaseHandler().is(PhaseType.END_OF_TURN)) {
|
if (ai.getGame().getPhaseHandler().is(PhaseType.END_OF_TURN)) {
|
||||||
boolean doTarget = damageTargetAI(ai, sa, dmg, true);
|
boolean doTarget = damageTargetAI(ai, sa, dmg, true);
|
||||||
if (doTarget) {
|
if (doTarget) {
|
||||||
Card tgt = sa.getTargets().getFirstTargetedCard();
|
Card tgt = sa.getTargetCard();
|
||||||
if (tgt != null) {
|
if (tgt != null) {
|
||||||
return ai.getGame().getPhaseHandler().getPlayerTurn() == tgt.getController();
|
return ai.getGame().getPhaseHandler().getPlayerTurn() == tgt.getController();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ public class CloneEffect extends SpellAbilityEffect {
|
|||||||
cardToCopy = cloneSources.get(0);
|
cardToCopy = cloneSources.get(0);
|
||||||
}
|
}
|
||||||
} else if (sa.usesTargeting()) {
|
} else if (sa.usesTargeting()) {
|
||||||
cardToCopy = sa.getTargets().getFirstTargetedCard();
|
cardToCopy = sa.getTargetCard();
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Card> cloneTargets = AbilityUtils.getDefinedCards(host, sa.getParam("CloneTarget"), sa);
|
List<Card> cloneTargets = AbilityUtils.getDefinedCards(host, sa.getParam("CloneTarget"), sa);
|
||||||
@@ -98,7 +98,7 @@ public class CloneEffect extends SpellAbilityEffect {
|
|||||||
cardToCopy = cloneSources.get(0);
|
cardToCopy = cloneSources.get(0);
|
||||||
}
|
}
|
||||||
} else if (sa.usesTargeting()) {
|
} else if (sa.usesTargeting()) {
|
||||||
cardToCopy = sa.getTargets().getFirstTargetedCard();
|
cardToCopy = sa.getTargetCard();
|
||||||
} else if (sa.hasParam("CopyFromChosenName")) {
|
} else if (sa.hasParam("CopyFromChosenName")) {
|
||||||
String name = host.getChosenName();
|
String name = host.getChosenName();
|
||||||
cardToCopy = Card.fromPaperCard(StaticData.instance().getCommonCards().getUniqueByName(name), activator);
|
cardToCopy = Card.fromPaperCard(StaticData.instance().getCommonCards().getUniqueByName(name), activator);
|
||||||
@@ -122,7 +122,7 @@ public class CloneEffect extends SpellAbilityEffect {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (sa.hasParam("Choices") && sa.usesTargeting()) {
|
} else if (sa.hasParam("Choices") && sa.usesTargeting()) {
|
||||||
tgtCard = sa.getTargets().getFirstTargetedCard();
|
tgtCard = sa.getTargetCard();
|
||||||
game.getTriggerHandler().clearActiveTriggers(tgtCard, null);
|
game.getTriggerHandler().clearActiveTriggers(tgtCard, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public class HauntEffect extends SpellAbilityEffect {
|
|||||||
} else if (sa.usesTargeting() && !card.isToken() && host.equalsWithTimestamp(card)) {
|
} else if (sa.usesTargeting() && !card.isToken() && host.equalsWithTimestamp(card)) {
|
||||||
// haunt target but only if card is no token and still in grave
|
// haunt target but only if card is no token and still in grave
|
||||||
final Card copy = game.getAction().exile(card, sa);
|
final Card copy = game.getAction().exile(card, sa);
|
||||||
sa.getTargets().getFirstTargetedCard().addHauntedBy(copy);
|
sa.getTargetCard().addHauntedBy(copy);
|
||||||
} else if (!sa.usesTargeting() && card.getHaunting() != null) {
|
} else if (!sa.usesTargeting() && card.getHaunting() != null) {
|
||||||
// unhaunt
|
// unhaunt
|
||||||
card.getHaunting().removeHauntedBy(card);
|
card.getHaunting().removeHauntedBy(card);
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ public class TargetSelection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<GameEntity> candidates = tgt.getAllCandidates(this.ability, true);
|
List<GameEntity> candidates = tgt.getAllCandidates(this.ability, true);
|
||||||
final boolean hasEnoughCandidates = candidates.size() >= minTargets;
|
final boolean hasEnoughCandidates = candidates.size() >= minTargets || tgt.getZone().contains(ZoneType.Stack);
|
||||||
if (!hasEnoughCandidates && !hasEnoughTargets) {
|
if (!hasEnoughCandidates && !hasEnoughTargets) {
|
||||||
// Cancel ability if there aren't any valid Candidates
|
// Cancel ability if there aren't any valid Candidates
|
||||||
return false;
|
return false;
|
||||||
@@ -151,7 +151,7 @@ public class TargetSelection {
|
|||||||
// single zone
|
// single zone
|
||||||
if (isSingleZone) {
|
if (isSingleZone) {
|
||||||
final List<Card> removeCandidates = new ArrayList<>();
|
final List<Card> removeCandidates = new ArrayList<>();
|
||||||
final Card firstTgt = ability.getTargets().getFirstTargetedCard();
|
final Card firstTgt = ability.getTargetCard();
|
||||||
if (firstTgt != null) {
|
if (firstTgt != null) {
|
||||||
for (Card t : validTargets) {
|
for (Card t : validTargets) {
|
||||||
if (!t.getController().equals(firstTgt.getController())) {
|
if (!t.getController().equals(firstTgt.getController())) {
|
||||||
|
|||||||
Reference in New Issue
Block a user