mirror of
https://github.com/correl/mage.git
synced 2024-12-24 11:50:45 +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
|
||||
*
|
||||
* @author BetaSteward_at_googlemail.com
|
||||
* @param <T>
|
||||
*/
|
||||
public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> implements Player {
|
||||
|
||||
private transient final static Logger log = Logger.getLogger(ComputerPlayer.class);
|
||||
private transient Map<Mana, Card> unplayable = new TreeMap<Mana, Card>();
|
||||
private transient List<Card> playableNonInstant = new ArrayList<Card>();
|
||||
private transient List<Card> playableInstant = new ArrayList<Card>();
|
||||
private transient List<ActivatedAbility> playableAbilities = new ArrayList<ActivatedAbility>();
|
||||
private transient Map<Mana, Card> unplayable = new TreeMap<>();
|
||||
private transient List<Card> playableNonInstant = new ArrayList<>();
|
||||
private transient List<Card> playableInstant = new ArrayList<>();
|
||||
private transient List<ActivatedAbility> playableAbilities = new ArrayList<>();
|
||||
private transient List<PickedCard> pickedCards;
|
||||
private transient List<ColoredManaSymbol> chosenColors;
|
||||
|
||||
|
@ -106,12 +107,12 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
|||
super(name, range);
|
||||
human = false;
|
||||
userData = new UserData(UserGroup.COMPUTER, 64, false);
|
||||
pickedCards = new ArrayList<PickedCard>();
|
||||
pickedCards = new ArrayList<>();
|
||||
}
|
||||
|
||||
protected ComputerPlayer(UUID id) {
|
||||
super(id);
|
||||
pickedCards = new ArrayList<PickedCard>();
|
||||
pickedCards = new ArrayList<>();
|
||||
}
|
||||
|
||||
public ComputerPlayer(final ComputerPlayer player) {
|
||||
|
@ -222,7 +223,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
|||
return false;
|
||||
}
|
||||
if (target instanceof TargetCardInHand) {
|
||||
List<Card> cards = new ArrayList<Card>();
|
||||
List<Card> cards = new ArrayList<>();
|
||||
cards.addAll(this.hand.getCards(game));
|
||||
while(!target.isChosen() && !cards.isEmpty()) {
|
||||
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());
|
||||
}
|
||||
if (target instanceof TargetCardInGraveyard) {
|
||||
List<Card> cards = new ArrayList<Card>();
|
||||
List<Card> cards = new ArrayList<>();
|
||||
for (Player player: game.getPlayers().values()) {
|
||||
for (Card card: player.getGraveyard().getCards(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 (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()) {
|
||||
Card card = pickBestCard(cardsInHand, null, target, source, game);
|
||||
if (card != null) {
|
||||
|
@ -504,7 +505,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
|||
return false;
|
||||
}
|
||||
if (target instanceof TargetCardInGraveyard) {
|
||||
List<Card> cards = new ArrayList<Card>();
|
||||
List<Card> cards = new ArrayList<>();
|
||||
for (Player player: game.getPlayers().values()) {
|
||||
cards.addAll(player.getGraveyard().getCards(game));
|
||||
}
|
||||
|
@ -517,7 +518,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
|||
return false;
|
||||
}
|
||||
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);
|
||||
if (card != null) {
|
||||
target.addTarget(card.getId(), source, game);
|
||||
|
@ -526,7 +527,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
|||
return false;
|
||||
}
|
||||
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()) {
|
||||
Card card = pickTarget(cards, outcome, target, source, game);
|
||||
if (card != null) {
|
||||
|
@ -536,7 +537,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
|||
return target.isChosen();
|
||||
}
|
||||
if (target instanceof TargetCardInHand) {
|
||||
List<Card> cards = new ArrayList<Card>();
|
||||
List<Card> cards = new ArrayList<>();
|
||||
cards.addAll(this.hand.getCards(game));
|
||||
while(!target.isChosen() && !cards.isEmpty()) {
|
||||
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;
|
||||
}
|
||||
if (target instanceof TargetCardInOpponentsGraveyard) {
|
||||
List<Card> cards = new ArrayList<Card>();
|
||||
List<Card> cards = new ArrayList<>();
|
||||
for (UUID uuid: game.getOpponents(playerId)) {
|
||||
Player player = game.getPlayer(uuid);
|
||||
if (player != null) {
|
||||
|
@ -598,7 +599,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
|||
}
|
||||
|
||||
if (target instanceof TargetCardInASingleGraveyard) {
|
||||
List<Card> cards = new ArrayList<Card>();
|
||||
List<Card> cards = new ArrayList<>();
|
||||
for (Player player: game.getPlayers().values()) {
|
||||
cards.addAll(player.getGraveyard().getCards(game));
|
||||
}
|
||||
|
@ -1177,7 +1178,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
|||
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()) {
|
||||
Card card = pickTarget(cardChoices, outcome, target, null, game);
|
||||
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();
|
||||
Attackers attackers = getPotentialAttackers(game);
|
||||
List<Permanent> blockers = getOpponentBlockers(opponentId, game);
|
||||
List<Permanent> actualAttackers = new ArrayList<Permanent>();
|
||||
List<Permanent> actualAttackers = new ArrayList<>();
|
||||
if (blockers.isEmpty()) {
|
||||
actualAttackers = attackers.getAttackers();
|
||||
}
|
||||
|
@ -1258,7 +1259,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
|||
if (object != null) {
|
||||
LinkedHashMap<UUID, ActivatedAbility> useableAbilities = getSpellAbilities(object, game.getState().getZone(object.getId()), game);
|
||||
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
|
||||
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) {
|
||||
Random random = new Random();
|
||||
Set<String> landSets = new HashSet<String>();
|
||||
Set<String> landSets = new HashSet<>();
|
||||
|
||||
// decide from which sets basic lands are taken from
|
||||
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) {
|
||||
Deck deck = new Deck();
|
||||
List<Card> sortedCards = new ArrayList<Card>(cardPool);
|
||||
List<Card> sortedCards = new ArrayList<>(cardPool);
|
||||
Collections.sort(sortedCards, new Comparator<Card>() {
|
||||
@Override
|
||||
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
|
||||
* 2. at least 2 cards should have different colors
|
||||
* 3. get card colors as chosen starting from most rated card
|
||||
* @return
|
||||
*/
|
||||
protected List<ColoredManaSymbol> chooseDeckColorsIfPossible() {
|
||||
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);
|
||||
}
|
||||
});
|
||||
Set<String> chosenSymbols = new HashSet<String>();
|
||||
Set<String> chosenSymbols = new HashSet<>();
|
||||
for (PickedCard picked : pickedCards) {
|
||||
int differentColorsInCost = RateCard.getDifferentColorManaCount(picked.card);
|
||||
// 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
|
||||
if (chosenSymbols.size() > 1 && chosenSymbols.size() < 4) {
|
||||
List<ColoredManaSymbol> colorsChosen = new ArrayList<ColoredManaSymbol>();
|
||||
List<ColoredManaSymbol> colorsChosen = new ArrayList<>();
|
||||
for (String symbol : chosenSymbols) {
|
||||
ColoredManaSymbol manaSymbol = ColoredManaSymbol.lookup(symbol.charAt(0));
|
||||
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) {
|
||||
List<Permanent> l = attackers.get(potential);
|
||||
if (l == null) {
|
||||
attackers.put(potential, l = new ArrayList<Permanent>());
|
||||
attackers.put(potential, l = new ArrayList<>());
|
||||
}
|
||||
l.add(creature);
|
||||
}
|
||||
|
@ -1734,7 +1736,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
|||
while(binary.length() < attackersList.size()) {
|
||||
binary = "0" + binary;
|
||||
}
|
||||
List<Permanent> trialAttackers = new ArrayList<Permanent>();
|
||||
List<Permanent> trialAttackers = new ArrayList<>();
|
||||
for (int j = 0; j < attackersList.size(); j++) {
|
||||
if (binary.charAt(j) == '1') {
|
||||
trialAttackers.add(attackersList.get(j));
|
||||
|
@ -1759,7 +1761,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
|||
|
||||
TreeNode<CombatSimulator> simulations;
|
||||
|
||||
simulations = new TreeNode<CombatSimulator>(combat);
|
||||
simulations = new TreeNode<>(combat);
|
||||
addBlockSimulations(blockers, simulations, game);
|
||||
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) {
|
||||
int numGroups = node.getData().groups.size();
|
||||
Copier<CombatSimulator> copier = new Copier<CombatSimulator>();
|
||||
Copier<CombatSimulator> copier = new Copier<>();
|
||||
for (Permanent blocker: blockers) {
|
||||
List<Permanent> subList = remove(blockers, blocker);
|
||||
for (int i = 0; i < numGroups; i++) {
|
||||
if (node.getData().groups.get(i).canBlock(blocker, game)) {
|
||||
CombatSimulator combat = copier.copy(node.getData());
|
||||
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);
|
||||
addBlockSimulations(subList, child, game);
|
||||
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) {
|
||||
List<Permanent> newList = new ArrayList<Permanent>();
|
||||
List<Permanent> newList = new ArrayList<>();
|
||||
for (Permanent permanent: source) {
|
||||
if (!permanent.equals(element)) {
|
||||
newList.add(permanent);
|
||||
|
@ -1840,7 +1842,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
|
|||
|
||||
protected void logState(Game game) {
|
||||
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.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetCard;
|
||||
import mage.target.common.TargetArtifactPermanent;
|
||||
import mage.target.common.TargetCardInYourGraveyard;
|
||||
import mage.target.common.TargetCardInGraveyard;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -81,9 +80,7 @@ public class GoblinWelder extends CardImpl<GoblinWelder> {
|
|||
public GoblinWelder copy() {
|
||||
return new GoblinWelder(this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public class GoblinWelderEffect extends OneShotEffect<GoblinWelderEffect> {
|
||||
|
||||
public GoblinWelderEffect() {
|
||||
|
@ -98,15 +95,13 @@ public class GoblinWelder extends CardImpl<GoblinWelder> {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
Permanent artifact = game.getPermanent(source.getTargets().get(0).getFirstTarget());
|
||||
Card card = game.getCard(source.getTargets().get(1).getFirstTarget());
|
||||
|
||||
if (artifact != null && card != null) {
|
||||
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
if (artifact != null && card != null && controller != null) {
|
||||
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()))
|
||||
{
|
||||
boolean sacrifice = artifact.sacrifice(source.getId(), game);
|
||||
boolean putOnBF = card.putOntoBattlefield(game, currentZone, source.getId(), card.getOwnerId());
|
||||
|
||||
boolean sacrifice = artifact.sacrifice(source.getSourceId(), game);
|
||||
boolean putOnBF = controller.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId());
|
||||
if (sacrifice || putOnBF) {
|
||||
return true;
|
||||
}
|
||||
|
@ -126,10 +121,10 @@ public class GoblinWelder extends CardImpl<GoblinWelder> {
|
|||
}
|
||||
}
|
||||
|
||||
class GoblinWelderTarget extends TargetCard<TargetCardInYourGraveyard> {
|
||||
class GoblinWelderTarget extends TargetCardInGraveyard {
|
||||
|
||||
public GoblinWelderTarget() {
|
||||
super(1, 1, Zone.GRAVEYARD, new FilterArtifactCard());
|
||||
super(1, 1, new FilterArtifactCard());
|
||||
targetName = "target artifact card in that player's graveyard";
|
||||
}
|
||||
|
||||
|
@ -139,22 +134,15 @@ public class GoblinWelder extends CardImpl<GoblinWelder> {
|
|||
|
||||
@Override
|
||||
public boolean canTarget(UUID id, Ability source, Game game) {
|
||||
UUID firstTarget = source.getFirstTarget();
|
||||
Permanent artifact = game.getPermanent(firstTarget);
|
||||
Permanent artifact = game.getPermanent(source.getFirstTarget());
|
||||
Player player = game.getPlayer(artifact.getControllerId());
|
||||
|
||||
Card card = game.getCard(id);
|
||||
if (card != null && player != null && game.getState().getZone(card.getId()) == Zone.GRAVEYARD)
|
||||
{
|
||||
if (player.getGraveyard().contains(id))
|
||||
{
|
||||
return filter.match(card, game);
|
||||
}
|
||||
if (card != null && player != null && player.getGraveyard().contains(id)) {
|
||||
return filter.match(card, game);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public GoblinWelderTarget copy() {
|
||||
|
|
Loading…
Reference in a new issue