changes to support multiplayer

This commit is contained in:
BetaSteward 2010-05-17 03:19:31 +00:00
parent f32b05eef1
commit 7d27c06329
2 changed files with 16 additions and 27 deletions

View file

@ -44,6 +44,7 @@ import java.util.UUID;
import java.util.logging.Logger; import java.util.logging.Logger;
import mage.Constants.CardType; import mage.Constants.CardType;
import mage.Constants.Outcome; import mage.Constants.Outcome;
import mage.Constants.RangeOfInfluence;
import mage.Constants.Zone; import mage.Constants.Zone;
import mage.Mana; import mage.Mana;
import mage.abilities.ActivatedAbility; import mage.abilities.ActivatedAbility;
@ -72,12 +73,10 @@ import mage.cards.Card;
import mage.cards.Cards; import mage.cards.Cards;
import mage.cards.decks.Deck; import mage.cards.decks.Deck;
import mage.choices.Choice; import mage.choices.Choice;
import mage.filter.common.FilterCreatureForAttack;
import mage.filter.common.FilterCreatureForCombat; import mage.filter.common.FilterCreatureForCombat;
import mage.filter.common.FilterLandCard; import mage.filter.common.FilterLandCard;
import mage.filter.common.FilterNonlandCard; import mage.filter.common.FilterNonlandCard;
import mage.game.Game; import mage.game.Game;
import mage.game.GameState;
import mage.game.combat.CombatGroup; import mage.game.combat.CombatGroup;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
@ -94,7 +93,7 @@ import mage.util.TreeNode;
/** /**
* *
* only suitable for two player games * suitable for two player games and some multiplayer games
* *
* @author BetaSteward_at_googlemail.com * @author BetaSteward_at_googlemail.com
*/ */
@ -107,8 +106,8 @@ public class ComputerPlayer extends PlayerImpl implements Player {
private transient List<Card> playableInstant = new ArrayList<Card>(); private transient List<Card> playableInstant = new ArrayList<Card>();
private transient List<ActivatedAbility> playableAbilities = new ArrayList<ActivatedAbility>(); private transient List<ActivatedAbility> playableAbilities = new ArrayList<ActivatedAbility>();
public ComputerPlayer(String name, Deck deck) { public ComputerPlayer(String name, Deck deck, RangeOfInfluence range) {
super(name, deck); super(name, deck, range);
human = false; human = false;
} }
@ -126,7 +125,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
@Override @Override
public boolean chooseTarget(Outcome outcome, Target target, Game game) { public boolean chooseTarget(Outcome outcome, Target target, Game game) {
logger.fine("chooseTarget: " + outcome.toString() + ":" + target.toString()); logger.fine("chooseTarget: " + outcome.toString() + ":" + target.toString());
UUID opponentId = game.getOpponents(playerId).get(0); UUID opponentId = game.getOpponents(playerId).iterator().next();
if (target instanceof TargetPlayer) { if (target instanceof TargetPlayer) {
if (outcome.isGood()) { if (outcome.isGood()) {
if (target.canTarget(playerId, game)) { if (target.canTarget(playerId, game)) {
@ -190,7 +189,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
@Override @Override
public void priority(Game game) { public void priority(Game game) {
logger.fine("priority"); logger.fine("priority");
UUID opponentId = game.getOpponents(playerId).get(0); UUID opponentId = game.getOpponents(playerId).iterator().next();
if (game.getActivePlayerId().equals(playerId)) { if (game.getActivePlayerId().equals(playerId)) {
if (game.isMainPhase() && game.getStack().isEmpty()) { if (game.isMainPhase() && game.getStack().isEmpty()) {
playLand(game); playLand(game);
@ -339,7 +338,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
} }
} }
} }
for (Permanent permanent: game.getBattlefield().getActivePermanents(playerId)) { for (Permanent permanent: game.getBattlefield().getAllActivePermanents(playerId)) {
for (ActivatedAbility ability: permanent.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD)) { for (ActivatedAbility ability: permanent.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD)) {
if (!(ability instanceof ManaAbility) && ability.canActivate(playerId, game)) { if (!(ability instanceof ManaAbility) && ability.canActivate(playerId, game)) {
ManaOptions abilityOptions = ability.getManaCosts().getOptions(); ManaOptions abilityOptions = ability.getManaCosts().getOptions();
@ -515,7 +514,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
@Override @Override
public void selectAttackers(Game game) { public void selectAttackers(Game game) {
logger.fine("selectAttackers"); logger.fine("selectAttackers");
UUID opponentId = game.getOpponents(playerId).get(0); 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<Permanent>();
@ -588,7 +587,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
protected List<Permanent> getAvailableManaProducers(Game game) { protected List<Permanent> getAvailableManaProducers(Game game) {
logger.fine("getAvailableManaProducers"); logger.fine("getAvailableManaProducers");
List<Permanent> result = new ArrayList<Permanent>(); List<Permanent> result = new ArrayList<Permanent>();
for (Permanent permanent: game.getBattlefield().getActivePermanents(playerId)) { for (Permanent permanent: game.getBattlefield().getAllActivePermanents(playerId)) {
for (ManaAbility ability: permanent.getAbilities().getManaAbilities(Zone.BATTLEFIELD)) { for (ManaAbility ability: permanent.getAbilities().getManaAbilities(Zone.BATTLEFIELD)) {
if (ability.canActivate(playerId, game)) { if (ability.canActivate(playerId, game)) {
result.add(permanent); result.add(permanent);
@ -605,7 +604,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
List<Permanent> creatures = super.getAvailableAttackers(game); List<Permanent> creatures = super.getAvailableAttackers(game);
for (Permanent creature: creatures) { for (Permanent creature: creatures) {
int potential = combatPotential(creature, game); int potential = combatPotential(creature, game);
if (potential > 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<Permanent>());
@ -631,16 +630,14 @@ public class ComputerPlayer extends PlayerImpl implements Player {
protected List<Permanent> getAvailableBlockers(Game game) { protected List<Permanent> getAvailableBlockers(Game game) {
logger.fine("getAvailableBlockers"); logger.fine("getAvailableBlockers");
FilterCreatureForCombat blockFilter = new FilterCreatureForCombat(); FilterCreatureForCombat blockFilter = new FilterCreatureForCombat();
blockFilter.getControllerId().add(playerId); List<Permanent> blockers = game.getBattlefield().getAllActivePermanents(blockFilter, playerId);
List<Permanent> blockers = game.getBattlefield().getActivePermanents(blockFilter);
return blockers; return blockers;
} }
protected List<Permanent> getOpponentBlockers(UUID opponentId, Game game) { protected List<Permanent> getOpponentBlockers(UUID opponentId, Game game) {
logger.fine("getOpponentBlockers"); logger.fine("getOpponentBlockers");
FilterCreatureForCombat blockFilter = new FilterCreatureForCombat(); FilterCreatureForCombat blockFilter = new FilterCreatureForCombat();
blockFilter.getControllerId().add(opponentId); List<Permanent> blockers = game.getBattlefield().getAllActivePermanents(blockFilter, opponentId);
List<Permanent> blockers = game.getBattlefield().getActivePermanents(blockFilter);
return blockers; return blockers;
} }
@ -743,15 +740,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
} }
protected List<Permanent> threats(UUID playerId, TargetPermanent target, Game game) { protected List<Permanent> threats(UUID playerId, TargetPermanent target, Game game) {
List<Permanent> threats = game.getBattlefield().getActivePermanents(target.getFilter()); List<Permanent> threats = game.getBattlefield().getAllActivePermanents(target.getFilter(), playerId);
Iterator<Permanent> it = threats.iterator();
while(it.hasNext()) {
Permanent permanent = it.next();
if (!permanent.getControllerId().equals(playerId)) {
it.remove();
}
}
Collections.sort(threats, new PermanentComparator(game)); Collections.sort(threats, new PermanentComparator(game));
return threats; return threats;
} }

View file

@ -60,7 +60,7 @@ public class ActionSimulator {
} }
public int evaluateState() { public int evaluateState() {
Player opponent = game.getPlayer(game.getOpponents(player.getId()).get(0)); Player opponent = game.getPlayer(game.getOpponents(player.getId()).iterator().next());
if (game.isGameOver()) { if (game.isGameOver()) {
if (player.hasLost() || opponent.hasWon()) if (player.hasLost() || opponent.hasWon())
return Integer.MIN_VALUE; return Integer.MIN_VALUE;
@ -70,10 +70,10 @@ public class ActionSimulator {
int value = player.getLife(); int value = player.getLife();
value -= opponent.getLife(); value -= opponent.getLife();
PermanentEvaluator evaluator = new PermanentEvaluator(); PermanentEvaluator evaluator = new PermanentEvaluator();
for (Permanent permanent: game.getBattlefield().getActivePermanents(player.getId())) { for (Permanent permanent: game.getBattlefield().getAllActivePermanents(player.getId())) {
value += evaluator.evaluate(permanent, game); value += evaluator.evaluate(permanent, game);
} }
for (Permanent permanent: game.getBattlefield().getActivePermanents(player.getId())) { for (Permanent permanent: game.getBattlefield().getAllActivePermanents(player.getId())) {
value -= evaluator.evaluate(permanent, game); value -= evaluator.evaluate(permanent, game);
} }
value += player.getHand().size(); value += player.getHand().size();