Player.playSpellAbility moved to HumanPlayer since that method is used only for it.

Removed a restriction that made impossible to play abilities from opoonent's cards
This commit is contained in:
Maxmtg
2013-04-02 19:00:50 +00:00
parent bcc11d2391
commit 3e0cd0ad44
19 changed files with 66 additions and 46 deletions

2
.gitattributes vendored
View File

@@ -13761,11 +13761,11 @@ src/main/java/forge/card/spellability/AbilityManaPart.java svneol=native#text/pl
src/main/java/forge/card/spellability/AbilityStatic.java svneol=native#text/plain src/main/java/forge/card/spellability/AbilityStatic.java svneol=native#text/plain
src/main/java/forge/card/spellability/AbilitySub.java svneol=native#text/plain src/main/java/forge/card/spellability/AbilitySub.java svneol=native#text/plain
src/main/java/forge/card/spellability/AbilityTriggered.java svneol=native#text/plain src/main/java/forge/card/spellability/AbilityTriggered.java svneol=native#text/plain
src/main/java/forge/card/spellability/HumanPlaySpellAbility.java svneol=native#text/plain
src/main/java/forge/card/spellability/ISpellAbility.java -text src/main/java/forge/card/spellability/ISpellAbility.java -text
src/main/java/forge/card/spellability/Spell.java svneol=native#text/plain src/main/java/forge/card/spellability/Spell.java svneol=native#text/plain
src/main/java/forge/card/spellability/SpellAbility.java svneol=native#text/plain src/main/java/forge/card/spellability/SpellAbility.java svneol=native#text/plain
src/main/java/forge/card/spellability/SpellAbilityCondition.java svneol=native#text/plain src/main/java/forge/card/spellability/SpellAbilityCondition.java svneol=native#text/plain
src/main/java/forge/card/spellability/SpellAbilityRequirements.java svneol=native#text/plain
src/main/java/forge/card/spellability/SpellAbilityRestriction.java svneol=native#text/plain src/main/java/forge/card/spellability/SpellAbilityRestriction.java svneol=native#text/plain
src/main/java/forge/card/spellability/SpellAbilityStackInstance.java svneol=native#text/plain src/main/java/forge/card/spellability/SpellAbilityStackInstance.java svneol=native#text/plain
src/main/java/forge/card/spellability/SpellAbilityVariables.java svneol=native#text/plain src/main/java/forge/card/spellability/SpellAbilityVariables.java svneol=native#text/plain

View File

@@ -20,6 +20,7 @@ import forge.game.GameState;
import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCard;
import forge.game.player.AIPlayer; import forge.game.player.AIPlayer;
import forge.game.player.HumanPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;
@@ -202,7 +203,7 @@ public class PlayEffect extends SpellAbilityEffect {
boolean noManaCost = sa.hasParam("WithoutManaCost"); boolean noManaCost = sa.hasParam("WithoutManaCost");
if (controller.isHuman()) { if (controller.isHuman()) {
SpellAbility newSA = noManaCost ? tgtSA.copyWithNoManaCost() : tgtSA; SpellAbility newSA = noManaCost ? tgtSA.copyWithNoManaCost() : tgtSA;
game.getActionPlay().playSpellAbility(newSA, activator); game.getActionPlay().playSpellAbility(newSA, (HumanPlayer)activator);
} else { } else {
if (tgtSA instanceof Spell) { // Isn't it ALWAYS a spell? if (tgtSA instanceof Spell) { // Isn't it ALWAYS a spell?
Spell spell = (Spell) tgtSA; Spell spell = (Spell) tgtSA;

View File

@@ -72,6 +72,7 @@ import forge.game.ai.ComputerUtilCost;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.AIPlayer; import forge.game.player.AIPlayer;
import forge.game.player.HumanPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.PlayerZone; import forge.game.zone.PlayerZone;
import forge.game.zone.Zone; import forge.game.zone.Zone;
@@ -2913,7 +2914,7 @@ public class CardFactoryUtil {
} }
if (card.getController().isHuman()) { if (card.getController().isHuman()) {
game.getActionPlay().playSpellAbilityNoStack(card.getController(), origSA); game.getActionPlay().playSpellAbilityNoStack((HumanPlayer)card.getController(), origSA);
} else { } else {
ComputerUtil.playNoStack((AIPlayer) card.getController(), origSA, game); ComputerUtil.playNoStack((AIPlayer) card.getController(), origSA, game);
} }

View File

@@ -31,6 +31,7 @@ import forge.card.spellability.SpellAbility;
import forge.game.GameState; import forge.game.GameState;
import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.AIPlayer; import forge.game.player.AIPlayer;
import forge.game.player.HumanPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;
@@ -239,7 +240,7 @@ public class ReplacementHandler {
Player player = replacementEffect.getHostCard().getController(); Player player = replacementEffect.getHostCard().getController();
//player.getController().playNoStack() //player.getController().playNoStack()
if (player.isHuman()) { if (player.isHuman()) {
game.getActionPlay().playSpellAbilityNoStack(player, effectSA); game.getActionPlay().playSpellAbilityNoStack((HumanPlayer)player, effectSA);
} else { } else {
ComputerUtil.playNoStack((AIPlayer) player, effectSA, game); ComputerUtil.playNoStack((AIPlayer) player, effectSA, game);
} }

View File

@@ -37,11 +37,11 @@ import forge.game.zone.Zone;
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
public class SpellAbilityRequirements { public class HumanPlaySpellAbility {
private final SpellAbility ability; private final SpellAbility ability;
private final CostPayment payment; private final CostPayment payment;
public SpellAbilityRequirements(final SpellAbility sa, final CostPayment cp) { public HumanPlaySpellAbility(final SpellAbility sa, final CostPayment cp) {
this.ability = sa; this.ability = sa;
this.payment = cp; this.payment = cp;
} }

View File

@@ -39,6 +39,7 @@ import forge.game.GlobalRuleChange;
import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.AIPlayer; import forge.game.player.AIPlayer;
import forge.game.player.HumanPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
@@ -419,7 +420,7 @@ public class TriggerHandler {
if (regtrig.isStatic()) { if (regtrig.isStatic()) {
if (wrapperAbility.getActivatingPlayer().isHuman()) { if (wrapperAbility.getActivatingPlayer().isHuman()) {
game.getActionPlay().playSpellAbilityNoStack(wrapperAbility.getActivatingPlayer(), wrapperAbility); game.getActionPlay().playSpellAbilityNoStack((HumanPlayer)wrapperAbility.getActivatingPlayer(), wrapperAbility);
} else { } else {
wrapperAbility.doTrigger(isMandatory, (AIPlayer)wrapperAbility.getActivatingPlayer()); wrapperAbility.doTrigger(isMandatory, (AIPlayer)wrapperAbility.getActivatingPlayer());
ComputerUtil.playNoStack((AIPlayer)wrapperAbility.getActivatingPlayer(), wrapperAbility, game); ComputerUtil.playNoStack((AIPlayer)wrapperAbility.getActivatingPlayer(), wrapperAbility, game);

View File

@@ -19,6 +19,7 @@ import forge.card.spellability.Target;
import forge.game.GameState; import forge.game.GameState;
import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.AIPlayer; import forge.game.player.AIPlayer;
import forge.game.player.HumanPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.gui.GuiDialog; import forge.gui.GuiDialog;
@@ -414,7 +415,7 @@ public class WrappedAbility extends Ability implements ISpellAbility {
} }
if (getActivatingPlayer().isHuman()) { if (getActivatingPlayer().isHuman()) {
game.getActionPlay().playSpellAbilityNoStack(getActivatingPlayer(), sa, true); game.getActionPlay().playSpellAbilityNoStack((HumanPlayer)getActivatingPlayer(), sa, true);
} else { } else {
// commented out because i don't think this should be called // commented out because i don't think this should be called
// again here // again here

View File

@@ -33,6 +33,7 @@ import forge.game.GameType;
import forge.game.MatchController; import forge.game.MatchController;
import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.AIPlayer; import forge.game.player.AIPlayer;
import forge.game.player.HumanPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.Zone; import forge.game.zone.Zone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
@@ -130,7 +131,7 @@ public class InputMulligan extends InputBase {
if (GuiDialog.confirm(c, "Use " + c +"'s ability?")) { if (GuiDialog.confirm(c, "Use " + c +"'s ability?")) {
// If we ever let the AI memorize cards in the players // If we ever let the AI memorize cards in the players
// hand, this would be a place to do so. // hand, this would be a place to do so.
game.getActionPlay().playSpellAbilityNoStack(p, effect); game.getActionPlay().playSpellAbilityNoStack((HumanPlayer)p, effect);
} }
} }
} }

View File

@@ -86,7 +86,7 @@ public class InputPassPriority extends InputBase {
Runnable execAbility = new Runnable() { Runnable execAbility = new Runnable() {
@Override @Override
public void run() { public void run() {
player.playSpellAbility(card, ab); ((HumanPlayer)player).playSpellAbility(card, ab);
} }
}; };

View File

@@ -19,11 +19,12 @@ import forge.card.cost.CostPayment;
import forge.card.mana.ManaCostBeingPaid; import forge.card.mana.ManaCostBeingPaid;
import forge.card.mana.ManaCostShard; import forge.card.mana.ManaCostShard;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityRequirements; import forge.card.spellability.HumanPlaySpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.card.staticability.StaticAbility; import forge.card.staticability.StaticAbility;
import forge.control.input.InputPayManaSimple; import forge.control.input.InputPayManaSimple;
import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCard;
import forge.game.player.HumanPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;
@@ -76,7 +77,7 @@ public class GameActionPlay {
} }
final CostPayment payment = new CostPayment(sa.getPayCosts(), sa); final CostPayment payment = new CostPayment(sa.getPayCosts(), sa);
final SpellAbilityRequirements req = new SpellAbilityRequirements(sa, payment); final HumanPlaySpellAbility req = new HumanPlaySpellAbility(sa, payment);
req.fillRequirements(false, true, false); req.fillRequirements(false, true, false);
} else { } else {
if (sa.isSpell()) { if (sa.isSpell()) {
@@ -351,7 +352,7 @@ public class GameActionPlay {
* @param sa * @param sa
* a {@link forge.card.spellability.SpellAbility} object. * a {@link forge.card.spellability.SpellAbility} object.
*/ */
public final void playSpellAbility(SpellAbility sa, Player activator) { public final void playSpellAbility(SpellAbility sa, HumanPlayer activator) {
FThreads.checkEDT("Player.playSpellAbility", false); FThreads.checkEDT("Player.playSpellAbility", false);
sa.setActivatingPlayer(activator); sa.setActivatingPlayer(activator);
@@ -389,7 +390,7 @@ public class GameActionPlay {
payment = new CostPayment(sa.getPayCosts(), sa); payment = new CostPayment(sa.getPayCosts(), sa);
} }
final SpellAbilityRequirements req = new SpellAbilityRequirements(sa, payment); final HumanPlaySpellAbility req = new HumanPlaySpellAbility(sa, payment);
req.fillRequirements(false, false, false); req.fillRequirements(false, false, false);
} else { } else {
ManaCostBeingPaid manaCost = new ManaCostBeingPaid(sa.getManaCost()); ManaCostBeingPaid manaCost = new ManaCostBeingPaid(sa.getManaCost());
@@ -424,10 +425,10 @@ public class GameActionPlay {
* @param skipTargeting * @param skipTargeting
* a boolean. * a boolean.
*/ */
public final void playSpellAbilityNoStack(final Player human, final SpellAbility sa) { public final void playSpellAbilityNoStack(final HumanPlayer human, final SpellAbility sa) {
playSpellAbilityNoStack(human, sa, false); playSpellAbilityNoStack(human, sa, false);
} }
public final void playSpellAbilityNoStack(final Player human, final SpellAbility sa, boolean useOldTargets) { public final void playSpellAbilityNoStack(final HumanPlayer human, final SpellAbility sa, boolean useOldTargets) {
sa.setActivatingPlayer(human); sa.setActivatingPlayer(human);
if (sa.getPayCosts() != null) { if (sa.getPayCosts() != null) {
@@ -437,7 +438,7 @@ public class GameActionPlay {
payment.changeCost(); payment.changeCost();
} }
final SpellAbilityRequirements req = new SpellAbilityRequirements(sa, payment); final HumanPlaySpellAbility req = new HumanPlaySpellAbility(sa, payment);
req.fillRequirements(useOldTargets, false, true); req.fillRequirements(useOldTargets, false, true);
} else { } else {

View File

@@ -11,6 +11,8 @@ import java.util.Set;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import org.apache.commons.lang.time.StopWatch;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
@@ -19,6 +21,7 @@ import com.google.common.collect.Lists;
import forge.Card; import forge.Card;
import forge.CardLists; import forge.CardLists;
import forge.CardPredicates; import forge.CardPredicates;
import forge.FThreads;
import forge.Singletons; import forge.Singletons;
import forge.card.trigger.TriggerHandler; import forge.card.trigger.TriggerHandler;
import forge.card.trigger.TriggerType; import forge.card.trigger.TriggerType;
@@ -117,7 +120,13 @@ public class GameNew {
boolean canSideBoard = !isFirstGame && gameType.isSideboardingAllowed() && hasSideboard; boolean canSideBoard = !isFirstGame && gameType.isSideboardingAllowed() && hasSideboard;
if (canSideBoard) { if (canSideBoard) {
psc.setCurrentDeck(player.getController().sideboard(psc.getCurrentDeck(), gameType)); StopWatch sw = new StopWatch();
sw.start();
System.out.println(FThreads.debugGetCurrThreadId() + " > " + "entering sideboard routine");
Deck sideboarded = player.getController().sideboard(psc.getCurrentDeck(), gameType);
sw.stop();
System.out.println(FThreads.debugGetCurrThreadId() + " > " + "sideboard routine returned after " + sw.getTime() + " ms");
psc.setCurrentDeck(sideboarded);
} else { } else {
psc.restoreOriginalDeck(); psc.restoreOriginalDeck();
} }

View File

@@ -16,6 +16,7 @@ import forge.error.BugReporter;
import forge.game.ai.AiProfileUtil; import forge.game.ai.AiProfileUtil;
import forge.game.event.DuelOutcomeEvent; import forge.game.event.DuelOutcomeEvent;
import forge.game.player.AIPlayer; import forge.game.player.AIPlayer;
import forge.game.player.HumanPlayer;
import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerStatistics; import forge.game.player.PlayerStatistics;
@@ -156,7 +157,7 @@ public class MatchController {
try { try {
Player localHuman = Aggregates.firstFieldEquals(currentGame.getPlayers(), Player.Accessors.FN_GET_TYPE, PlayerType.HUMAN); HumanPlayer localHuman = (HumanPlayer) Aggregates.firstFieldEquals(currentGame.getPlayers(), Player.Accessors.FN_GET_TYPE, PlayerType.HUMAN);
FControl.SINGLETON_INSTANCE.setPlayer(localHuman); FControl.SINGLETON_INSTANCE.setPlayer(localHuman);
CMatchUI.SINGLETON_INSTANCE.initMatch(currentGame.getRegisteredPlayers(), localHuman); CMatchUI.SINGLETON_INSTANCE.initMatch(currentGame.getRegisteredPlayers(), localHuman);
CDock.SINGLETON_INSTANCE.onGameStarts(currentGame, localHuman); CDock.SINGLETON_INSTANCE.onGameStarts(currentGame, localHuman);

View File

@@ -21,6 +21,7 @@ import java.util.List;
import forge.Card; import forge.Card;
import forge.FThreads; import forge.FThreads;
import forge.card.spellability.Ability;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.control.input.InputSelectCards; import forge.control.input.InputSelectCards;
import forge.control.input.InputSelectCardsFromList; import forge.control.input.InputSelectCardsFromList;
@@ -57,6 +58,19 @@ public class HumanPlayer extends Player {
c.getController().discard(c, sa); c.getController().discard(c, sa);
} // input_discardNumUnless } // input_discardNumUnless
/**
* TODO: Write javadoc for this method.
* @param card
* @param ab
*/
public void playSpellAbility(Card c, SpellAbility ab) {
if (ab == Ability.PLAY_LAND_SURROGATE)
this.playLand(c);
else {
game.getActionPlay().playSpellAbility(ab, this);
}
game.getPhaseHandler().setPriority(this);
}
@Override @Override
public PlayerType getType() { public PlayerType getType() {

View File

@@ -2890,20 +2890,6 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
this.startingHandSize = shs; this.startingHandSize = shs;
} }
/**
* TODO: Write javadoc for this method.
* @param card
* @param ab
*/
public void playSpellAbility(Card c, SpellAbility ab) {
if (ab == Ability.PLAY_LAND_SURROGATE)
this.playLand(c);
else {
game.getActionPlay().playSpellAbility(ab, this);
}
game.getPhaseHandler().setPriority(this);
}
/** /**
* *
* Takes the top plane of the planar deck and put it face up in the command zone. * Takes the top plane of the planar deck and put it face up in the command zone.

View File

@@ -364,14 +364,14 @@ public class PlayerControllerHuman extends PlayerController {
@Override @Override
public void playMiracle(SpellAbility miracle, Card card) { public void playMiracle(SpellAbility miracle, Card card) {
if (GuiDialog.confirm(card, card + " - Drawn. Play for Miracle Cost?")) { if (GuiDialog.confirm(card, card + " - Drawn. Play for Miracle Cost?")) {
game.getActionPlay().playSpellAbility(miracle, getPlayer()); game.getActionPlay().playSpellAbility(miracle, player);
} }
} }
@Override @Override
public void playMadness(SpellAbility madness) { public void playMadness(SpellAbility madness) {
if (GuiDialog.confirm(madness.getSourceCard(), madness.getSourceCard() + " - Discarded. Pay Madness Cost?")) { if (GuiDialog.confirm(madness.getSourceCard(), madness.getSourceCard() + " - Discarded. Pay Madness Cost?")) {
game.getActionPlay().playSpellAbility(madness, getPlayer()); game.getActionPlay().playSpellAbility(madness, player);
} }
} }
} }

View File

@@ -57,6 +57,7 @@ import forge.game.ai.ComputerUtilCost;
import forge.game.event.SpellResolvedEvent; import forge.game.event.SpellResolvedEvent;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.AIPlayer; import forge.game.player.AIPlayer;
import forge.game.player.HumanPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;
import forge.gui.framework.EDocID; import forge.gui.framework.EDocID;
@@ -1124,7 +1125,7 @@ public class MagicStack extends MyObservable {
for (int i = size - 1; i >= 0; i--) { for (int i = size - 1; i >= 0; i--) {
SpellAbility next = orderedSAs.get(i); SpellAbility next = orderedSAs.get(i);
if (next.isTrigger()) { if (next.isTrigger()) {
game.getActionPlay().playSpellAbility(next, activePlayer); game.getActionPlay().playSpellAbility(next, (HumanPlayer)activePlayer);
} else { } else {
this.add(next); this.add(next);
} }

View File

@@ -29,6 +29,7 @@ import forge.GameEntity;
import forge.ImageCache; import forge.ImageCache;
import forge.Singletons; import forge.Singletons;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.HumanPlayer;
import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.gui.framework.EDocID; import forge.gui.framework.EDocID;
@@ -77,7 +78,7 @@ public enum CMatchUI {
* @param numFieldPanels int * @param numFieldPanels int
* @param numHandPanels int * @param numHandPanels int
*/ */
public void initMatch(final List<Player> players, Player localPlayer) { public void initMatch(final List<Player> players, HumanPlayer localPlayer) {
// TODO fix for use with multiplayer // TODO fix for use with multiplayer
final String[] indices = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(","); final String[] indices = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(",");

View File

@@ -43,7 +43,9 @@ import forge.control.input.Input;
import forge.control.input.InputAttack; import forge.control.input.InputAttack;
import forge.control.input.InputBlock; import forge.control.input.InputBlock;
import forge.control.input.InputPayManaBase; import forge.control.input.InputPayManaBase;
import forge.game.GameState;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.player.HumanPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.PlayerZone; import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
@@ -63,7 +65,7 @@ public class CField implements ICDoc {
// The one who owns cards on this side of table // The one who owns cards on this side of table
private final Player player; private final Player player;
// Tho one who looks at screen and 'performs actions' // Tho one who looks at screen and 'performs actions'
private final Player playerViewer; private final HumanPlayer playerViewer;
private final VField view; private final VField view;
private boolean initializedAlready = false; private boolean initializedAlready = false;
@@ -155,9 +157,9 @@ public class CField implements ICDoc {
* @param v0 &emsp; {@link forge.gui.match.nonsingleton.VField} * @param v0 &emsp; {@link forge.gui.match.nonsingleton.VField}
* @param playerViewer * @param playerViewer
*/ */
public CField(final Player p0, final VField v0, Player playerViewer) { public CField(final Player p0, final VField v0, HumanPlayer playerViewer) {
this.player = p0; this.player = p0;
this.playerViewer = playerViewer;; this.playerViewer = playerViewer;
this.view = v0; this.view = v0;
} }
@@ -341,13 +343,11 @@ public class CField implements ICDoc {
@Override @Override
protected void doAction(final Card c) { protected void doAction(final Card c) {
if ( CField.this.player != CField.this.playerViewer ) final GameState game = player.getGame();
return; final SpellAbility ab = CField.this.playerViewer.getController().getAbilityToPlay(game.getAbilitesOfCard(c, CField.this.playerViewer));
final SpellAbility ab = player.getController().getAbilityToPlay(player.getGame().getAbilitesOfCard(c, player));
if ( null != ab) { if ( null != ab) {
FThreads.invokeInNewThread(new Runnable(){ @Override public void run(){ FThreads.invokeInNewThread(new Runnable(){ @Override public void run(){
player.playSpellAbility(c, ab); CField.this.playerViewer.playSpellAbility(c, ab);
}}); }});
} }
} }

View File

@@ -36,6 +36,7 @@ import net.miginfocom.swing.MigLayout;
import forge.card.cardfactory.CardFactoryUtil; import forge.card.cardfactory.CardFactoryUtil;
import forge.card.mana.ManaPool; import forge.card.mana.ManaPool;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.HumanPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.framework.DragCell; import forge.gui.framework.DragCell;
@@ -111,7 +112,7 @@ public class VField implements IVDoc<CField> {
* @param playerOnwer &emsp; {@link forge.game.player.Player} * @param playerOnwer &emsp; {@link forge.game.player.Player}
* @param id0 &emsp; {@link forge.gui.framework.EDocID} * @param id0 &emsp; {@link forge.gui.framework.EDocID}
*/ */
public VField(final EDocID id0, final Player playerOnwer, Player playerViewer) { public VField(final EDocID id0, final Player playerOnwer, HumanPlayer playerViewer) {
this.docID = id0; this.docID = id0;
id0.setDoc(this); id0.setDoc(this);