mirror of
https://github.com/correl/mage.git
synced 2024-12-25 03:00:15 +00:00
* Goblin Welder - Fixed that second target of Goblin Welder was not handled by AI player.
This commit is contained in:
parent
c88eb2ead6
commit
ac93732b1a
2 changed files with 43 additions and 53 deletions
|
@ -91,14 +91,15 @@ import mage.cards.repository.ExpansionRepository;
|
||||||
* suitable for two player games and some multiplayer games
|
* suitable for two player games and some multiplayer games
|
||||||
*
|
*
|
||||||
* @author BetaSteward_at_googlemail.com
|
* @author BetaSteward_at_googlemail.com
|
||||||
|
* @param <T>
|
||||||
*/
|
*/
|
||||||
public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> implements Player {
|
public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> implements Player {
|
||||||
|
|
||||||
private transient final static Logger log = Logger.getLogger(ComputerPlayer.class);
|
private transient final static Logger log = Logger.getLogger(ComputerPlayer.class);
|
||||||
private transient Map<Mana, Card> unplayable = new TreeMap<Mana, Card>();
|
private transient Map<Mana, Card> unplayable = new TreeMap<>();
|
||||||
private transient List<Card> playableNonInstant = new ArrayList<Card>();
|
private transient List<Card> playableNonInstant = new ArrayList<>();
|
||||||
private transient List<Card> playableInstant = new ArrayList<Card>();
|
private transient List<Card> playableInstant = new ArrayList<>();
|
||||||
private transient List<ActivatedAbility> playableAbilities = new ArrayList<ActivatedAbility>();
|
private transient List<ActivatedAbility> playableAbilities = new ArrayList<>();
|
||||||
private transient List<PickedCard> pickedCards;
|
private transient List<PickedCard> pickedCards;
|
||||||
private transient List<ColoredManaSymbol> chosenColors;
|
private transient List<ColoredManaSymbol> chosenColors;
|
||||||
|
|
||||||
|
@ -106,12 +107,12 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
super(name, range);
|
super(name, range);
|
||||||
human = false;
|
human = false;
|
||||||
userData = new UserData(UserGroup.COMPUTER, 64, false);
|
userData = new UserData(UserGroup.COMPUTER, 64, false);
|
||||||
pickedCards = new ArrayList<PickedCard>();
|
pickedCards = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ComputerPlayer(UUID id) {
|
protected ComputerPlayer(UUID id) {
|
||||||
super(id);
|
super(id);
|
||||||
pickedCards = new ArrayList<PickedCard>();
|
pickedCards = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ComputerPlayer(final ComputerPlayer player) {
|
public ComputerPlayer(final ComputerPlayer player) {
|
||||||
|
@ -222,7 +223,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (target instanceof TargetCardInHand) {
|
if (target instanceof TargetCardInHand) {
|
||||||
List<Card> cards = new ArrayList<Card>();
|
List<Card> cards = new ArrayList<>();
|
||||||
cards.addAll(this.hand.getCards(game));
|
cards.addAll(this.hand.getCards(game));
|
||||||
while(!target.isChosen() && !cards.isEmpty()) {
|
while(!target.isChosen() && !cards.isEmpty()) {
|
||||||
Card pick = pickTarget(cards, outcome, target, null, game);
|
Card pick = pickTarget(cards, outcome, target, null, game);
|
||||||
|
@ -300,7 +301,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
throw new IllegalStateException("TargetPermanentOrPlayer wasn't handled. class:" + target.getClass().toString());
|
throw new IllegalStateException("TargetPermanentOrPlayer wasn't handled. class:" + target.getClass().toString());
|
||||||
}
|
}
|
||||||
if (target instanceof TargetCardInGraveyard) {
|
if (target instanceof TargetCardInGraveyard) {
|
||||||
List<Card> cards = new ArrayList<Card>();
|
List<Card> cards = new ArrayList<>();
|
||||||
for (Player player: game.getPlayers().values()) {
|
for (Player player: game.getPlayers().values()) {
|
||||||
for (Card card: player.getGraveyard().getCards(game)) {
|
for (Card card: player.getGraveyard().getCards(game)) {
|
||||||
if (target.canTarget(card.getId(), game)) {
|
if (target.canTarget(card.getId(), game)) {
|
||||||
|
@ -368,7 +369,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
}
|
}
|
||||||
if (target instanceof TargetDiscard || target instanceof TargetCardInHand) {
|
if (target instanceof TargetDiscard || target instanceof TargetCardInHand) {
|
||||||
if (outcome.isGood()) {
|
if (outcome.isGood()) {
|
||||||
ArrayList<Card> cardsInHand = new ArrayList<Card>(hand.getCards(game));
|
ArrayList<Card> cardsInHand = new ArrayList<>(hand.getCards(game));
|
||||||
while (!target.isChosen() && !cardsInHand.isEmpty() && target.getMaxNumberOfTargets() < target.getTargets().size()) {
|
while (!target.isChosen() && !cardsInHand.isEmpty() && target.getMaxNumberOfTargets() < target.getTargets().size()) {
|
||||||
Card card = pickBestCard(cardsInHand, null, target, source, game);
|
Card card = pickBestCard(cardsInHand, null, target, source, game);
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
|
@ -504,7 +505,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (target instanceof TargetCardInGraveyard) {
|
if (target instanceof TargetCardInGraveyard) {
|
||||||
List<Card> cards = new ArrayList<Card>();
|
List<Card> cards = new ArrayList<>();
|
||||||
for (Player player: game.getPlayers().values()) {
|
for (Player player: game.getPlayers().values()) {
|
||||||
cards.addAll(player.getGraveyard().getCards(game));
|
cards.addAll(player.getGraveyard().getCards(game));
|
||||||
}
|
}
|
||||||
|
@ -517,7 +518,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (target instanceof TargetCardInLibrary) {
|
if (target instanceof TargetCardInLibrary) {
|
||||||
List<Card> cards = new ArrayList<Card>(game.getPlayer(playerId).getLibrary().getCards(game));
|
List<Card> cards = new ArrayList<>(game.getPlayer(playerId).getLibrary().getCards(game));
|
||||||
Card card = pickTarget(cards, outcome, target, source, game);
|
Card card = pickTarget(cards, outcome, target, source, game);
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
target.addTarget(card.getId(), source, game);
|
target.addTarget(card.getId(), source, game);
|
||||||
|
@ -526,7 +527,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (target instanceof TargetCardInYourGraveyard) {
|
if (target instanceof TargetCardInYourGraveyard) {
|
||||||
List<Card> cards = new ArrayList<Card>(game.getPlayer(playerId).getGraveyard().getCards(game));
|
List<Card> cards = new ArrayList<>(game.getPlayer(playerId).getGraveyard().getCards(game));
|
||||||
while(!target.isChosen() && !cards.isEmpty()) {
|
while(!target.isChosen() && !cards.isEmpty()) {
|
||||||
Card card = pickTarget(cards, outcome, target, source, game);
|
Card card = pickTarget(cards, outcome, target, source, game);
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
|
@ -536,7 +537,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
return target.isChosen();
|
return target.isChosen();
|
||||||
}
|
}
|
||||||
if (target instanceof TargetCardInHand) {
|
if (target instanceof TargetCardInHand) {
|
||||||
List<Card> cards = new ArrayList<Card>();
|
List<Card> cards = new ArrayList<>();
|
||||||
cards.addAll(this.hand.getCards(game));
|
cards.addAll(this.hand.getCards(game));
|
||||||
while(!target.isChosen() && !cards.isEmpty()) {
|
while(!target.isChosen() && !cards.isEmpty()) {
|
||||||
Card pick = pickTarget(cards, outcome, target, source, game);
|
Card pick = pickTarget(cards, outcome, target, source, game);
|
||||||
|
@ -560,7 +561,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (target instanceof TargetCardInOpponentsGraveyard) {
|
if (target instanceof TargetCardInOpponentsGraveyard) {
|
||||||
List<Card> cards = new ArrayList<Card>();
|
List<Card> cards = new ArrayList<>();
|
||||||
for (UUID uuid: game.getOpponents(playerId)) {
|
for (UUID uuid: game.getOpponents(playerId)) {
|
||||||
Player player = game.getPlayer(uuid);
|
Player player = game.getPlayer(uuid);
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
|
@ -598,7 +599,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target instanceof TargetCardInASingleGraveyard) {
|
if (target instanceof TargetCardInASingleGraveyard) {
|
||||||
List<Card> cards = new ArrayList<Card>();
|
List<Card> cards = new ArrayList<>();
|
||||||
for (Player player: game.getPlayers().values()) {
|
for (Player player: game.getPlayers().values()) {
|
||||||
cards.addAll(player.getGraveyard().getCards(game));
|
cards.addAll(player.getGraveyard().getCards(game));
|
||||||
}
|
}
|
||||||
|
@ -1177,7 +1178,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ArrayList<Card> cardChoices = new ArrayList<Card>(cards.getCards(target.getFilter(), game));
|
ArrayList<Card> cardChoices = new ArrayList<>(cards.getCards(target.getFilter(), game));
|
||||||
while (!target.doneChosing()) {
|
while (!target.doneChosing()) {
|
||||||
Card card = pickTarget(cardChoices, outcome, target, null, game);
|
Card card = pickTarget(cardChoices, outcome, target, null, game);
|
||||||
if (card != null) {
|
if (card != null) {
|
||||||
|
@ -1206,7 +1207,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
UUID opponentId = game.getCombat().getDefenders().iterator().next();
|
UUID opponentId = game.getCombat().getDefenders().iterator().next();
|
||||||
Attackers attackers = getPotentialAttackers(game);
|
Attackers attackers = getPotentialAttackers(game);
|
||||||
List<Permanent> blockers = getOpponentBlockers(opponentId, game);
|
List<Permanent> blockers = getOpponentBlockers(opponentId, game);
|
||||||
List<Permanent> actualAttackers = new ArrayList<Permanent>();
|
List<Permanent> actualAttackers = new ArrayList<>();
|
||||||
if (blockers.isEmpty()) {
|
if (blockers.isEmpty()) {
|
||||||
actualAttackers = attackers.getAttackers();
|
actualAttackers = attackers.getAttackers();
|
||||||
}
|
}
|
||||||
|
@ -1258,7 +1259,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
if (object != null) {
|
if (object != null) {
|
||||||
LinkedHashMap<UUID, ActivatedAbility> useableAbilities = getSpellAbilities(object, game.getState().getZone(object.getId()), game);
|
LinkedHashMap<UUID, ActivatedAbility> useableAbilities = getSpellAbilities(object, game.getState().getZone(object.getId()), game);
|
||||||
if (useableAbilities != null && useableAbilities.size() > 0) {
|
if (useableAbilities != null && useableAbilities.size() > 0) {
|
||||||
game.fireGetChoiceEvent(playerId, name, object, new ArrayList<ActivatedAbility>(useableAbilities.values()));
|
game.fireGetChoiceEvent(playerId, name, object, new ArrayList<>(useableAbilities.values()));
|
||||||
// TODO: Improve this
|
// TODO: Improve this
|
||||||
return (SpellAbility) useableAbilities.values().iterator().next();
|
return (SpellAbility) useableAbilities.values().iterator().next();
|
||||||
}
|
}
|
||||||
|
@ -1338,7 +1339,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
|
|
||||||
private static void addBasicLands(Deck deck, String landName, int number) {
|
private static void addBasicLands(Deck deck, String landName, int number) {
|
||||||
Random random = new Random();
|
Random random = new Random();
|
||||||
Set<String> landSets = new HashSet<String>();
|
Set<String> landSets = new HashSet<>();
|
||||||
|
|
||||||
// decide from which sets basic lands are taken from
|
// decide from which sets basic lands are taken from
|
||||||
for (String setCode :deck.getExpansionSetCodes()) {
|
for (String setCode :deck.getExpansionSetCodes()) {
|
||||||
|
@ -1394,7 +1395,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
|
|
||||||
public static Deck buildDeck(List<Card> cardPool, final List<ColoredManaSymbol> colors) {
|
public static Deck buildDeck(List<Card> cardPool, final List<ColoredManaSymbol> colors) {
|
||||||
Deck deck = new Deck();
|
Deck deck = new Deck();
|
||||||
List<Card> sortedCards = new ArrayList<Card>(cardPool);
|
List<Card> sortedCards = new ArrayList<>(cardPool);
|
||||||
Collections.sort(sortedCards, new Comparator<Card>() {
|
Collections.sort(sortedCards, new Comparator<Card>() {
|
||||||
@Override
|
@Override
|
||||||
public int compare(Card o1, Card o2) {
|
public int compare(Card o1, Card o2) {
|
||||||
|
@ -1627,6 +1628,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
* 1. there should be at least 3 cards in card pool
|
* 1. there should be at least 3 cards in card pool
|
||||||
* 2. at least 2 cards should have different colors
|
* 2. at least 2 cards should have different colors
|
||||||
* 3. get card colors as chosen starting from most rated card
|
* 3. get card colors as chosen starting from most rated card
|
||||||
|
* @return
|
||||||
*/
|
*/
|
||||||
protected List<ColoredManaSymbol> chooseDeckColorsIfPossible() {
|
protected List<ColoredManaSymbol> chooseDeckColorsIfPossible() {
|
||||||
if (pickedCards.size() > 2) {
|
if (pickedCards.size() > 2) {
|
||||||
|
@ -1642,7 +1644,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
return o2.score.compareTo(o1.score);
|
return o2.score.compareTo(o1.score);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Set<String> chosenSymbols = new HashSet<String>();
|
Set<String> chosenSymbols = new HashSet<>();
|
||||||
for (PickedCard picked : pickedCards) {
|
for (PickedCard picked : pickedCards) {
|
||||||
int differentColorsInCost = RateCard.getDifferentColorManaCount(picked.card);
|
int differentColorsInCost = RateCard.getDifferentColorManaCount(picked.card);
|
||||||
// choose only color card, but only if they are not too gold
|
// choose only color card, but only if they are not too gold
|
||||||
|
@ -1659,7 +1661,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
}
|
}
|
||||||
// only two or three color decks are allowed
|
// only two or three color decks are allowed
|
||||||
if (chosenSymbols.size() > 1 && chosenSymbols.size() < 4) {
|
if (chosenSymbols.size() > 1 && chosenSymbols.size() < 4) {
|
||||||
List<ColoredManaSymbol> colorsChosen = new ArrayList<ColoredManaSymbol>();
|
List<ColoredManaSymbol> colorsChosen = new ArrayList<>();
|
||||||
for (String symbol : chosenSymbols) {
|
for (String symbol : chosenSymbols) {
|
||||||
ColoredManaSymbol manaSymbol = ColoredManaSymbol.lookup(symbol.charAt(0));
|
ColoredManaSymbol manaSymbol = ColoredManaSymbol.lookup(symbol.charAt(0));
|
||||||
if (manaSymbol != null) {
|
if (manaSymbol != null) {
|
||||||
|
@ -1694,7 +1696,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
if (potential > 0 && creature.getPower().getValue() > 0) {
|
if (potential > 0 && creature.getPower().getValue() > 0) {
|
||||||
List<Permanent> l = attackers.get(potential);
|
List<Permanent> l = attackers.get(potential);
|
||||||
if (l == null) {
|
if (l == null) {
|
||||||
attackers.put(potential, l = new ArrayList<Permanent>());
|
attackers.put(potential, l = new ArrayList<>());
|
||||||
}
|
}
|
||||||
l.add(creature);
|
l.add(creature);
|
||||||
}
|
}
|
||||||
|
@ -1734,7 +1736,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
while(binary.length() < attackersList.size()) {
|
while(binary.length() < attackersList.size()) {
|
||||||
binary = "0" + binary;
|
binary = "0" + binary;
|
||||||
}
|
}
|
||||||
List<Permanent> trialAttackers = new ArrayList<Permanent>();
|
List<Permanent> trialAttackers = new ArrayList<>();
|
||||||
for (int j = 0; j < attackersList.size(); j++) {
|
for (int j = 0; j < attackersList.size(); j++) {
|
||||||
if (binary.charAt(j) == '1') {
|
if (binary.charAt(j) == '1') {
|
||||||
trialAttackers.add(attackersList.get(j));
|
trialAttackers.add(attackersList.get(j));
|
||||||
|
@ -1759,7 +1761,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
|
|
||||||
TreeNode<CombatSimulator> simulations;
|
TreeNode<CombatSimulator> simulations;
|
||||||
|
|
||||||
simulations = new TreeNode<CombatSimulator>(combat);
|
simulations = new TreeNode<>(combat);
|
||||||
addBlockSimulations(blockers, simulations, game);
|
addBlockSimulations(blockers, simulations, game);
|
||||||
combat.simulate();
|
combat.simulate();
|
||||||
|
|
||||||
|
@ -1769,14 +1771,14 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
|
|
||||||
protected void addBlockSimulations(List<Permanent> blockers, TreeNode<CombatSimulator> node, Game game) {
|
protected void addBlockSimulations(List<Permanent> blockers, TreeNode<CombatSimulator> node, Game game) {
|
||||||
int numGroups = node.getData().groups.size();
|
int numGroups = node.getData().groups.size();
|
||||||
Copier<CombatSimulator> copier = new Copier<CombatSimulator>();
|
Copier<CombatSimulator> copier = new Copier<>();
|
||||||
for (Permanent blocker: blockers) {
|
for (Permanent blocker: blockers) {
|
||||||
List<Permanent> subList = remove(blockers, blocker);
|
List<Permanent> subList = remove(blockers, blocker);
|
||||||
for (int i = 0; i < numGroups; i++) {
|
for (int i = 0; i < numGroups; i++) {
|
||||||
if (node.getData().groups.get(i).canBlock(blocker, game)) {
|
if (node.getData().groups.get(i).canBlock(blocker, game)) {
|
||||||
CombatSimulator combat = copier.copy(node.getData());
|
CombatSimulator combat = copier.copy(node.getData());
|
||||||
combat.groups.get(i).blockers.add(new CreatureSimulator(blocker));
|
combat.groups.get(i).blockers.add(new CreatureSimulator(blocker));
|
||||||
TreeNode<CombatSimulator> child = new TreeNode<CombatSimulator>(combat);
|
TreeNode<CombatSimulator> child = new TreeNode<>(combat);
|
||||||
node.addChild(child);
|
node.addChild(child);
|
||||||
addBlockSimulations(subList, child, game);
|
addBlockSimulations(subList, child, game);
|
||||||
combat.simulate();
|
combat.simulate();
|
||||||
|
@ -1786,7 +1788,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<Permanent> remove(List<Permanent> source, Permanent element) {
|
protected List<Permanent> remove(List<Permanent> source, Permanent element) {
|
||||||
List<Permanent> newList = new ArrayList<Permanent>();
|
List<Permanent> newList = new ArrayList<>();
|
||||||
for (Permanent permanent: source) {
|
for (Permanent permanent: source) {
|
||||||
if (!permanent.equals(element)) {
|
if (!permanent.equals(element)) {
|
||||||
newList.add(permanent);
|
newList.add(permanent);
|
||||||
|
@ -1840,7 +1842,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
||||||
|
|
||||||
protected void logState(Game game) {
|
protected void logState(Game game) {
|
||||||
if (log.isTraceEnabled()) {
|
if (log.isTraceEnabled()) {
|
||||||
logList("Computer player " + name + " hand: ", new ArrayList(hand.getCards(game)));
|
logList(new StringBuilder("Computer player ").append(name).append(" hand: ").toString(), new ArrayList(hand.getCards(game)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,9 +46,8 @@ import mage.filter.common.FilterArtifactPermanent;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.TargetCard;
|
|
||||||
import mage.target.common.TargetArtifactPermanent;
|
import mage.target.common.TargetArtifactPermanent;
|
||||||
import mage.target.common.TargetCardInYourGraveyard;
|
import mage.target.common.TargetCardInGraveyard;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -82,8 +81,6 @@ public class GoblinWelder extends CardImpl<GoblinWelder> {
|
||||||
return new GoblinWelder(this);
|
return new GoblinWelder(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class GoblinWelderEffect extends OneShotEffect<GoblinWelderEffect> {
|
public class GoblinWelderEffect extends OneShotEffect<GoblinWelderEffect> {
|
||||||
|
|
||||||
public GoblinWelderEffect() {
|
public GoblinWelderEffect() {
|
||||||
|
@ -98,15 +95,13 @@ public class GoblinWelder extends CardImpl<GoblinWelder> {
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
Permanent artifact = game.getPermanent(source.getTargets().get(0).getFirstTarget());
|
Permanent artifact = game.getPermanent(source.getTargets().get(0).getFirstTarget());
|
||||||
Card card = game.getCard(source.getTargets().get(1).getFirstTarget());
|
Card card = game.getCard(source.getTargets().get(1).getFirstTarget());
|
||||||
|
Player controller = game.getPlayer(source.getControllerId());
|
||||||
if (artifact != null && card != null) {
|
if (artifact != null && card != null && controller != null) {
|
||||||
|
|
||||||
Zone currentZone = game.getState().getZone(card.getId());
|
Zone currentZone = game.getState().getZone(card.getId());
|
||||||
if(artifact.getCardType().contains(CardType.ARTIFACT) && card.getCardType().contains(CardType.ARTIFACT) && currentZone == Zone.GRAVEYARD && card.getOwnerId().equals(artifact.getControllerId()))
|
if(artifact.getCardType().contains(CardType.ARTIFACT) && card.getCardType().contains(CardType.ARTIFACT) && currentZone == Zone.GRAVEYARD && card.getOwnerId().equals(artifact.getControllerId()))
|
||||||
{
|
{
|
||||||
boolean sacrifice = artifact.sacrifice(source.getId(), game);
|
boolean sacrifice = artifact.sacrifice(source.getSourceId(), game);
|
||||||
boolean putOnBF = card.putOntoBattlefield(game, currentZone, source.getId(), card.getOwnerId());
|
boolean putOnBF = controller.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId());
|
||||||
|
|
||||||
if (sacrifice || putOnBF) {
|
if (sacrifice || putOnBF) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -126,10 +121,10 @@ public class GoblinWelder extends CardImpl<GoblinWelder> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class GoblinWelderTarget extends TargetCard<TargetCardInYourGraveyard> {
|
class GoblinWelderTarget extends TargetCardInGraveyard {
|
||||||
|
|
||||||
public GoblinWelderTarget() {
|
public GoblinWelderTarget() {
|
||||||
super(1, 1, Zone.GRAVEYARD, new FilterArtifactCard());
|
super(1, 1, new FilterArtifactCard());
|
||||||
targetName = "target artifact card in that player's graveyard";
|
targetName = "target artifact card in that player's graveyard";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,23 +134,16 @@ public class GoblinWelder extends CardImpl<GoblinWelder> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canTarget(UUID id, Ability source, Game game) {
|
public boolean canTarget(UUID id, Ability source, Game game) {
|
||||||
UUID firstTarget = source.getFirstTarget();
|
Permanent artifact = game.getPermanent(source.getFirstTarget());
|
||||||
Permanent artifact = game.getPermanent(firstTarget);
|
|
||||||
Player player = game.getPlayer(artifact.getControllerId());
|
Player player = game.getPlayer(artifact.getControllerId());
|
||||||
|
|
||||||
Card card = game.getCard(id);
|
Card card = game.getCard(id);
|
||||||
if (card != null && player != null && game.getState().getZone(card.getId()) == Zone.GRAVEYARD)
|
if (card != null && player != null && player.getGraveyard().contains(id)) {
|
||||||
{
|
return filter.match(card, game);
|
||||||
if (player.getGraveyard().contains(id))
|
|
||||||
{
|
|
||||||
return filter.match(card, game);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GoblinWelderTarget copy() {
|
public GoblinWelderTarget copy() {
|
||||||
return new GoblinWelderTarget(this);
|
return new GoblinWelderTarget(this);
|
||||||
|
|
Loading…
Reference in a new issue