move haunt Ai to a separate file

remove isComputer method
This commit is contained in:
Maxmtg
2013-12-25 08:21:25 +00:00
parent 69a9f0fe43
commit a81a666b81
9 changed files with 44 additions and 24 deletions

1
.gitattributes vendored
View File

@@ -14769,6 +14769,7 @@ forge-gui/src/main/java/forge/ai/ability/FlipACoinAi.java -text
forge-gui/src/main/java/forge/ai/ability/FogAi.java -text forge-gui/src/main/java/forge/ai/ability/FogAi.java -text
forge-gui/src/main/java/forge/ai/ability/GameLossAi.java -text forge-gui/src/main/java/forge/ai/ability/GameLossAi.java -text
forge-gui/src/main/java/forge/ai/ability/GameWinAi.java -text forge-gui/src/main/java/forge/ai/ability/GameWinAi.java -text
forge-gui/src/main/java/forge/ai/ability/HauntAi.java -text
forge-gui/src/main/java/forge/ai/ability/LegendaryRuleAi.java -text forge-gui/src/main/java/forge/ai/ability/LegendaryRuleAi.java -text
forge-gui/src/main/java/forge/ai/ability/LifeExchangeAi.java -text forge-gui/src/main/java/forge/ai/ability/LifeExchangeAi.java -text
forge-gui/src/main/java/forge/ai/ability/LifeGainAi.java -text forge-gui/src/main/java/forge/ai/ability/LifeGainAi.java -text

View File

@@ -253,7 +253,7 @@ public class ComputerUtilCard {
* a {@link forge.CardList} object. * a {@link forge.CardList} object.
* @return a {@link forge.game.card.Card} object. * @return a {@link forge.game.card.Card} object.
*/ */
public static Card getWorstCreatureAI(final List<Card> list) { public static Card getWorstCreatureAI(final Collection<Card> list) {
return Aggregates.itemWithMin(Iterables.filter(list, CardPredicates.Presets.CREATURES), ComputerUtilCard.fnEvaluateCreature); return Aggregates.itemWithMin(Iterables.filter(list, CardPredicates.Presets.CREATURES), ComputerUtilCard.fnEvaluateCreature);
} }

View File

@@ -0,0 +1,30 @@
package forge.ai.ability;
import java.util.Collection;
import java.util.List;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.card.Card;
import forge.game.card.CardLists;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
public class HauntAi extends SpellAbilityAi {
/* (non-Javadoc)
* @see forge.card.ability.SpellAbilityAi#canPlayAI(forge.game.player.Player, forge.card.spellability.SpellAbility)
*/
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
return false; // should not get here
}
@Override
public Card chooseSingleCard(Player ai, SpellAbility sa, Collection<Card> creats, boolean isOptional, Player targetedPlayer) {
final List<Card> oppCreats = CardLists.filterControlledBy(creats, ai.getOpponents());
return ComputerUtilCard.getWorstCreatureAI(oppCreats.isEmpty() ? creats : oppCreats);
}
}

View File

@@ -130,7 +130,8 @@ public enum ApiType {
InternalEtbReplacement(ETBReplacementEffect.class, CanPlayAsDrawbackAi.class), InternalEtbReplacement(ETBReplacementEffect.class, CanPlayAsDrawbackAi.class),
InternalLegendaryRule(CharmEffect.class, LegendaryRuleAi.class); // Charm has empty resolve blocks, may act as a dummy InternalLegendaryRule(CharmEffect.class, LegendaryRuleAi.class), // Charm has empty resolve blocks, may act as a dummy
InternalHaunt(CharmEffect.class, HauntAi.class);
private final Class<? extends SpellAbilityEffect> clsEffect; private final Class<? extends SpellAbilityEffect> clsEffect;
private final Class<? extends SpellAbilityAi> clsAi; private final Class<? extends SpellAbilityAi> clsAi;

View File

@@ -587,10 +587,10 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
if (decider == null) { if (decider == null) {
decider = player; decider = player;
} }
if (decider.isComputer()) { if (decider.isHuman()) {
ChangeZoneAi.hiddenOriginResolveAI(decider, sa, player);
} else {
changeHiddenOriginResolveHuman(decider, sa, player); changeHiddenOriginResolveHuman(decider, sa, player);
} else {
ChangeZoneAi.hiddenOriginResolveAI(decider, sa, player);
} }
} }
} }

View File

@@ -19,8 +19,6 @@ public abstract class LobbyPlayer implements IHasIcon {
@Deprecated @Deprecated
public boolean isHuman() { return getType() == PlayerType.HUMAN; } public boolean isHuman() { return getType() == PlayerType.HUMAN; }
@Deprecated
public boolean isComputer() { return getType() == PlayerType.COMPUTER; }
protected final String name; protected final String name;
protected String imageKey; protected String imageKey;

View File

@@ -247,8 +247,6 @@ public class Player extends GameEntity implements Comparable<Player> {
@Deprecated @Deprecated
public boolean isHuman() { return getLobbyPlayer().isHuman(); } public boolean isHuman() { return getLobbyPlayer().isHuman(); }
@Deprecated
public boolean isComputer() { return getLobbyPlayer().isComputer(); }
public boolean isArchenemy() { public boolean isArchenemy() {
@@ -1368,7 +1366,7 @@ public class Player extends GameEntity implements Comparable<Player> {
c = game.getAction().moveToHand(c); c = game.getAction().moveToHand(c);
drawn.add(c); drawn.add(c);
if ((this.numDrawnThisTurn == 0) && this.isComputer()) { if (this.numDrawnThisTurn == 0) {
boolean reveal = false; boolean reveal = false;
final List<Card> cards = this.getCardsIn(ZoneType.Battlefield); final List<Card> cards = this.getCardsIn(ZoneType.Battlefield);
for (final Card card : cards) { for (final Card card : cards) {
@@ -1378,7 +1376,7 @@ public class Player extends GameEntity implements Comparable<Player> {
} }
} }
if (reveal) { if (reveal) {
game.getAction().reveal("Revealing the first card drawn", drawn, this, false); game.getAction().reveal("Revealing the first card drawn", drawn, this, true);
} }
} }

View File

@@ -56,6 +56,8 @@ import forge.util.TextUtil;
public abstract class SpellAbility extends GameObject implements ISpellAbility { public abstract class SpellAbility extends GameObject implements ISpellAbility {
public static class EmptySa extends SpellAbility { public static class EmptySa extends SpellAbility {
public EmptySa(Card sourceCard) { super(sourceCard, Cost.Zero); setActivatingPlayer(sourceCard.getController());}
public EmptySa(ApiType api, Card sourceCard) { super(sourceCard, Cost.Zero); setActivatingPlayer(sourceCard.getController()); this.api = api;}
public EmptySa(Card sourceCard, Player activator) { super(sourceCard, Cost.Zero); setActivatingPlayer(activator);} public EmptySa(Card sourceCard, Player activator) { super(sourceCard, Cost.Zero); setActivatingPlayer(activator);}
public EmptySa(ApiType api, Card sourceCard, Player activator) { super(sourceCard, Cost.Zero); setActivatingPlayer(activator); this.api = api;} public EmptySa(ApiType api, Card sourceCard, Player activator) { super(sourceCard, Cost.Zero); setActivatingPlayer(activator); this.api = api;}
@Override public void resolve() {} @Override public void resolve() {}

View File

@@ -31,13 +31,13 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.FThreads; import forge.FThreads;
import forge.ai.ComputerUtilCard;
import forge.card.mana.ManaCost; import forge.card.mana.ManaCost;
import forge.game.Game; import forge.game.Game;
import forge.game.GameLogEntryType; import forge.game.GameLogEntryType;
import forge.game.GameObject; import forge.game.GameObject;
import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardFactory; import forge.game.card.CardFactory;
import forge.game.card.CardFactoryUtil; import forge.game.card.CardFactoryUtil;
@@ -65,7 +65,7 @@ import forge.game.spellability.TargetChoices;
import forge.game.spellability.TargetRestrictions; import forge.game.spellability.TargetRestrictions;
import forge.game.trigger.Trigger; import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
import forge.gui.input.InputSelectCardsFromList;
/** /**
* <p> * <p>
@@ -623,17 +623,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
if (!creats.isEmpty()) { if (!creats.isEmpty()) {
haunterDiesWork.setDescription(""); haunterDiesWork.setDescription("");
haunterDiesWork.setTargetRestrictions(new TargetRestrictions("", "Creature".split(" "), "1", "1")); haunterDiesWork.setTargetRestrictions(new TargetRestrictions("", "Creature".split(" "), "1", "1"));
final Card targetCard; final Card targetCard = source.getController().getController().chooseSingleEntityForEffect(creats, new SpellAbility.EmptySa(ApiType.InternalHaunt, source), "Choose target creature to haunt.");
if (source.getController().isHuman()) {
final InputSelectCardsFromList targetHaunted = new InputSelectCardsFromList(1,1, creats);
targetHaunted.setMessage("Choose target creature to haunt.");
targetHaunted.showAndWait();
targetCard = targetHaunted.getFirstSelected();
} else {
// AI choosing what to haunt
final List<Card> oppCreats = CardLists.filterControlledBy(creats, source.getController().getOpponents());
targetCard = ComputerUtilCard.getWorstCreatureAI(oppCreats.isEmpty() ? creats : oppCreats);
}
haunterDiesWork.setTargetCard(targetCard); haunterDiesWork.setTargetCard(targetCard);
this.add(haunterDiesWork); this.add(haunterDiesWork);
} }