From 3e0cd0ad44fa661b31345f8c5834fa42911e5f11 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Tue, 2 Apr 2013 19:00:50 +0000 Subject: [PATCH] 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 --- .gitattributes | 2 +- .../forge/card/ability/effects/PlayEffect.java | 3 ++- .../forge/card/cardfactory/CardFactoryUtil.java | 3 ++- .../card/replacement/ReplacementHandler.java | 3 ++- ...uirements.java => HumanPlaySpellAbility.java} | 4 ++-- .../java/forge/card/trigger/TriggerHandler.java | 3 ++- .../java/forge/card/trigger/WrappedAbility.java | 3 ++- .../java/forge/control/input/InputMulligan.java | 3 ++- .../forge/control/input/InputPassPriority.java | 2 +- src/main/java/forge/game/GameActionPlay.java | 15 ++++++++------- src/main/java/forge/game/GameNew.java | 11 ++++++++++- src/main/java/forge/game/MatchController.java | 3 ++- src/main/java/forge/game/player/HumanPlayer.java | 14 ++++++++++++++ src/main/java/forge/game/player/Player.java | 14 -------------- .../forge/game/player/PlayerControllerHuman.java | 4 ++-- src/main/java/forge/game/zone/MagicStack.java | 3 ++- src/main/java/forge/gui/match/CMatchUI.java | 3 ++- .../forge/gui/match/nonsingleton/CField.java | 16 ++++++++-------- .../forge/gui/match/nonsingleton/VField.java | 3 ++- 19 files changed, 66 insertions(+), 46 deletions(-) rename src/main/java/forge/card/spellability/{SpellAbilityRequirements.java => HumanPlaySpellAbility.java} (98%) diff --git a/.gitattributes b/.gitattributes index c98d3efad4c..161b4226c87 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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/AbilitySub.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/Spell.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/SpellAbilityRequirements.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/SpellAbilityVariables.java svneol=native#text/plain diff --git a/src/main/java/forge/card/ability/effects/PlayEffect.java b/src/main/java/forge/card/ability/effects/PlayEffect.java index 9c392278a10..e7fa53acdf4 100644 --- a/src/main/java/forge/card/ability/effects/PlayEffect.java +++ b/src/main/java/forge/card/ability/effects/PlayEffect.java @@ -20,6 +20,7 @@ import forge.game.GameState; import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCard; import forge.game.player.AIPlayer; +import forge.game.player.HumanPlayer; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; @@ -202,7 +203,7 @@ public class PlayEffect extends SpellAbilityEffect { boolean noManaCost = sa.hasParam("WithoutManaCost"); if (controller.isHuman()) { SpellAbility newSA = noManaCost ? tgtSA.copyWithNoManaCost() : tgtSA; - game.getActionPlay().playSpellAbility(newSA, activator); + game.getActionPlay().playSpellAbility(newSA, (HumanPlayer)activator); } else { if (tgtSA instanceof Spell) { // Isn't it ALWAYS a spell? Spell spell = (Spell) tgtSA; diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index e3dffb594cd..b73396e34a9 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -72,6 +72,7 @@ import forge.game.ai.ComputerUtilCost; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.AIPlayer; +import forge.game.player.HumanPlayer; import forge.game.player.Player; import forge.game.zone.PlayerZone; import forge.game.zone.Zone; @@ -2913,7 +2914,7 @@ public class CardFactoryUtil { } if (card.getController().isHuman()) { - game.getActionPlay().playSpellAbilityNoStack(card.getController(), origSA); + game.getActionPlay().playSpellAbilityNoStack((HumanPlayer)card.getController(), origSA); } else { ComputerUtil.playNoStack((AIPlayer) card.getController(), origSA, game); } diff --git a/src/main/java/forge/card/replacement/ReplacementHandler.java b/src/main/java/forge/card/replacement/ReplacementHandler.java index 7da37539dbc..2de3a967b87 100644 --- a/src/main/java/forge/card/replacement/ReplacementHandler.java +++ b/src/main/java/forge/card/replacement/ReplacementHandler.java @@ -31,6 +31,7 @@ import forge.card.spellability.SpellAbility; import forge.game.GameState; import forge.game.ai.ComputerUtil; import forge.game.player.AIPlayer; +import forge.game.player.HumanPlayer; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; @@ -239,7 +240,7 @@ public class ReplacementHandler { Player player = replacementEffect.getHostCard().getController(); //player.getController().playNoStack() if (player.isHuman()) { - game.getActionPlay().playSpellAbilityNoStack(player, effectSA); + game.getActionPlay().playSpellAbilityNoStack((HumanPlayer)player, effectSA); } else { ComputerUtil.playNoStack((AIPlayer) player, effectSA, game); } diff --git a/src/main/java/forge/card/spellability/SpellAbilityRequirements.java b/src/main/java/forge/card/spellability/HumanPlaySpellAbility.java similarity index 98% rename from src/main/java/forge/card/spellability/SpellAbilityRequirements.java rename to src/main/java/forge/card/spellability/HumanPlaySpellAbility.java index 114297c078e..171ce0d12ce 100644 --- a/src/main/java/forge/card/spellability/SpellAbilityRequirements.java +++ b/src/main/java/forge/card/spellability/HumanPlaySpellAbility.java @@ -37,11 +37,11 @@ import forge.game.zone.Zone; * @author Forge * @version $Id$ */ -public class SpellAbilityRequirements { +public class HumanPlaySpellAbility { private final SpellAbility ability; private final CostPayment payment; - public SpellAbilityRequirements(final SpellAbility sa, final CostPayment cp) { + public HumanPlaySpellAbility(final SpellAbility sa, final CostPayment cp) { this.ability = sa; this.payment = cp; } diff --git a/src/main/java/forge/card/trigger/TriggerHandler.java b/src/main/java/forge/card/trigger/TriggerHandler.java index ed81f1b4009..6905be17009 100644 --- a/src/main/java/forge/card/trigger/TriggerHandler.java +++ b/src/main/java/forge/card/trigger/TriggerHandler.java @@ -39,6 +39,7 @@ import forge.game.GlobalRuleChange; import forge.game.ai.ComputerUtil; import forge.game.phase.PhaseType; import forge.game.player.AIPlayer; +import forge.game.player.HumanPlayer; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -419,7 +420,7 @@ public class TriggerHandler { if (regtrig.isStatic()) { if (wrapperAbility.getActivatingPlayer().isHuman()) { - game.getActionPlay().playSpellAbilityNoStack(wrapperAbility.getActivatingPlayer(), wrapperAbility); + game.getActionPlay().playSpellAbilityNoStack((HumanPlayer)wrapperAbility.getActivatingPlayer(), wrapperAbility); } else { wrapperAbility.doTrigger(isMandatory, (AIPlayer)wrapperAbility.getActivatingPlayer()); ComputerUtil.playNoStack((AIPlayer)wrapperAbility.getActivatingPlayer(), wrapperAbility, game); diff --git a/src/main/java/forge/card/trigger/WrappedAbility.java b/src/main/java/forge/card/trigger/WrappedAbility.java index e98286e78a7..9bd4e7dcc77 100644 --- a/src/main/java/forge/card/trigger/WrappedAbility.java +++ b/src/main/java/forge/card/trigger/WrappedAbility.java @@ -19,6 +19,7 @@ import forge.card.spellability.Target; import forge.game.GameState; import forge.game.ai.ComputerUtil; import forge.game.player.AIPlayer; +import forge.game.player.HumanPlayer; import forge.game.player.Player; import forge.gui.GuiDialog; @@ -414,7 +415,7 @@ public class WrappedAbility extends Ability implements ISpellAbility { } if (getActivatingPlayer().isHuman()) { - game.getActionPlay().playSpellAbilityNoStack(getActivatingPlayer(), sa, true); + game.getActionPlay().playSpellAbilityNoStack((HumanPlayer)getActivatingPlayer(), sa, true); } else { // commented out because i don't think this should be called // again here diff --git a/src/main/java/forge/control/input/InputMulligan.java b/src/main/java/forge/control/input/InputMulligan.java index 45be101462c..5a740107af0 100644 --- a/src/main/java/forge/control/input/InputMulligan.java +++ b/src/main/java/forge/control/input/InputMulligan.java @@ -33,6 +33,7 @@ import forge.game.GameType; import forge.game.MatchController; import forge.game.ai.ComputerUtil; import forge.game.player.AIPlayer; +import forge.game.player.HumanPlayer; import forge.game.player.Player; import forge.game.zone.Zone; import forge.game.zone.ZoneType; @@ -130,7 +131,7 @@ public class InputMulligan extends InputBase { if (GuiDialog.confirm(c, "Use " + c +"'s ability?")) { // If we ever let the AI memorize cards in the players // hand, this would be a place to do so. - game.getActionPlay().playSpellAbilityNoStack(p, effect); + game.getActionPlay().playSpellAbilityNoStack((HumanPlayer)p, effect); } } } diff --git a/src/main/java/forge/control/input/InputPassPriority.java b/src/main/java/forge/control/input/InputPassPriority.java index 2523deecadd..cb70b4fd519 100644 --- a/src/main/java/forge/control/input/InputPassPriority.java +++ b/src/main/java/forge/control/input/InputPassPriority.java @@ -86,7 +86,7 @@ public class InputPassPriority extends InputBase { Runnable execAbility = new Runnable() { @Override public void run() { - player.playSpellAbility(card, ab); + ((HumanPlayer)player).playSpellAbility(card, ab); } }; diff --git a/src/main/java/forge/game/GameActionPlay.java b/src/main/java/forge/game/GameActionPlay.java index b5d0950368c..cacc8b2ffe7 100644 --- a/src/main/java/forge/game/GameActionPlay.java +++ b/src/main/java/forge/game/GameActionPlay.java @@ -19,11 +19,12 @@ import forge.card.cost.CostPayment; import forge.card.mana.ManaCostBeingPaid; import forge.card.mana.ManaCostShard; import forge.card.spellability.SpellAbility; -import forge.card.spellability.SpellAbilityRequirements; +import forge.card.spellability.HumanPlaySpellAbility; import forge.card.spellability.Target; import forge.card.staticability.StaticAbility; import forge.control.input.InputPayManaSimple; import forge.game.ai.ComputerUtilCard; +import forge.game.player.HumanPlayer; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; @@ -76,7 +77,7 @@ public class GameActionPlay { } 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); } else { if (sa.isSpell()) { @@ -351,7 +352,7 @@ public class GameActionPlay { * @param sa * 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); sa.setActivatingPlayer(activator); @@ -389,7 +390,7 @@ public class GameActionPlay { 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); } else { ManaCostBeingPaid manaCost = new ManaCostBeingPaid(sa.getManaCost()); @@ -424,10 +425,10 @@ public class GameActionPlay { * @param skipTargeting * 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); } - 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); if (sa.getPayCosts() != null) { @@ -437,7 +438,7 @@ public class GameActionPlay { payment.changeCost(); } - final SpellAbilityRequirements req = new SpellAbilityRequirements(sa, payment); + final HumanPlaySpellAbility req = new HumanPlaySpellAbility(sa, payment); req.fillRequirements(useOldTargets, false, true); } else { diff --git a/src/main/java/forge/game/GameNew.java b/src/main/java/forge/game/GameNew.java index eaa8c82c76e..c10f43516cf 100644 --- a/src/main/java/forge/game/GameNew.java +++ b/src/main/java/forge/game/GameNew.java @@ -11,6 +11,8 @@ import java.util.Set; import javax.swing.JOptionPane; +import org.apache.commons.lang.time.StopWatch; + import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; @@ -19,6 +21,7 @@ import com.google.common.collect.Lists; import forge.Card; import forge.CardLists; import forge.CardPredicates; +import forge.FThreads; import forge.Singletons; import forge.card.trigger.TriggerHandler; import forge.card.trigger.TriggerType; @@ -117,7 +120,13 @@ public class GameNew { boolean canSideBoard = !isFirstGame && gameType.isSideboardingAllowed() && hasSideboard; 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 { psc.restoreOriginalDeck(); } diff --git a/src/main/java/forge/game/MatchController.java b/src/main/java/forge/game/MatchController.java index 1119eb528d6..0688f3345aa 100644 --- a/src/main/java/forge/game/MatchController.java +++ b/src/main/java/forge/game/MatchController.java @@ -16,6 +16,7 @@ import forge.error.BugReporter; import forge.game.ai.AiProfileUtil; import forge.game.event.DuelOutcomeEvent; import forge.game.player.AIPlayer; +import forge.game.player.HumanPlayer; import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.player.PlayerStatistics; @@ -156,7 +157,7 @@ public class MatchController { 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); CMatchUI.SINGLETON_INSTANCE.initMatch(currentGame.getRegisteredPlayers(), localHuman); CDock.SINGLETON_INSTANCE.onGameStarts(currentGame, localHuman); diff --git a/src/main/java/forge/game/player/HumanPlayer.java b/src/main/java/forge/game/player/HumanPlayer.java index 26722254817..a8c14d7ab0d 100644 --- a/src/main/java/forge/game/player/HumanPlayer.java +++ b/src/main/java/forge/game/player/HumanPlayer.java @@ -21,6 +21,7 @@ import java.util.List; import forge.Card; import forge.FThreads; +import forge.card.spellability.Ability; import forge.card.spellability.SpellAbility; import forge.control.input.InputSelectCards; import forge.control.input.InputSelectCardsFromList; @@ -57,6 +58,19 @@ public class HumanPlayer extends Player { c.getController().discard(c, sa); } // 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 public PlayerType getType() { diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index 4f0f30a702a..29b0cbef43b 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -2890,20 +2890,6 @@ public abstract class Player extends GameEntity implements Comparable { 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. diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index 97a735e5b0b..dc52d39ab0c 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -364,14 +364,14 @@ public class PlayerControllerHuman extends PlayerController { @Override public void playMiracle(SpellAbility miracle, Card card) { if (GuiDialog.confirm(card, card + " - Drawn. Play for Miracle Cost?")) { - game.getActionPlay().playSpellAbility(miracle, getPlayer()); + game.getActionPlay().playSpellAbility(miracle, player); } } @Override public void playMadness(SpellAbility madness) { if (GuiDialog.confirm(madness.getSourceCard(), madness.getSourceCard() + " - Discarded. Pay Madness Cost?")) { - game.getActionPlay().playSpellAbility(madness, getPlayer()); + game.getActionPlay().playSpellAbility(madness, player); } } } diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java index 9253d8a6824..349d1f8d1b6 100644 --- a/src/main/java/forge/game/zone/MagicStack.java +++ b/src/main/java/forge/game/zone/MagicStack.java @@ -57,6 +57,7 @@ import forge.game.ai.ComputerUtilCost; import forge.game.event.SpellResolvedEvent; import forge.game.phase.PhaseType; import forge.game.player.AIPlayer; +import forge.game.player.HumanPlayer; import forge.game.player.Player; import forge.gui.GuiChoose; import forge.gui.framework.EDocID; @@ -1124,7 +1125,7 @@ public class MagicStack extends MyObservable { for (int i = size - 1; i >= 0; i--) { SpellAbility next = orderedSAs.get(i); if (next.isTrigger()) { - game.getActionPlay().playSpellAbility(next, activePlayer); + game.getActionPlay().playSpellAbility(next, (HumanPlayer)activePlayer); } else { this.add(next); } diff --git a/src/main/java/forge/gui/match/CMatchUI.java b/src/main/java/forge/gui/match/CMatchUI.java index 505a8deac99..618f34c5897 100644 --- a/src/main/java/forge/gui/match/CMatchUI.java +++ b/src/main/java/forge/gui/match/CMatchUI.java @@ -29,6 +29,7 @@ import forge.GameEntity; import forge.ImageCache; import forge.Singletons; import forge.game.phase.PhaseType; +import forge.game.player.HumanPlayer; import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.gui.framework.EDocID; @@ -77,7 +78,7 @@ public enum CMatchUI { * @param numFieldPanels int * @param numHandPanels int */ - public void initMatch(final List players, Player localPlayer) { + public void initMatch(final List players, HumanPlayer localPlayer) { // TODO fix for use with multiplayer final String[] indices = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(","); diff --git a/src/main/java/forge/gui/match/nonsingleton/CField.java b/src/main/java/forge/gui/match/nonsingleton/CField.java index 51e5f29125a..46411578830 100644 --- a/src/main/java/forge/gui/match/nonsingleton/CField.java +++ b/src/main/java/forge/gui/match/nonsingleton/CField.java @@ -43,7 +43,9 @@ import forge.control.input.Input; import forge.control.input.InputAttack; import forge.control.input.InputBlock; import forge.control.input.InputPayManaBase; +import forge.game.GameState; import forge.game.phase.CombatUtil; +import forge.game.player.HumanPlayer; import forge.game.player.Player; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; @@ -63,7 +65,7 @@ public class CField implements ICDoc { // The one who owns cards on this side of table private final Player player; // Tho one who looks at screen and 'performs actions' - private final Player playerViewer; + private final HumanPlayer playerViewer; private final VField view; private boolean initializedAlready = false; @@ -155,9 +157,9 @@ public class CField implements ICDoc { * @param v0   {@link forge.gui.match.nonsingleton.VField} * @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.playerViewer = playerViewer;; + this.playerViewer = playerViewer; this.view = v0; } @@ -341,13 +343,11 @@ public class CField implements ICDoc { @Override protected void doAction(final Card c) { - if ( CField.this.player != CField.this.playerViewer ) - return; - - final SpellAbility ab = player.getController().getAbilityToPlay(player.getGame().getAbilitesOfCard(c, player)); + final GameState game = player.getGame(); + final SpellAbility ab = CField.this.playerViewer.getController().getAbilityToPlay(game.getAbilitesOfCard(c, CField.this.playerViewer)); if ( null != ab) { FThreads.invokeInNewThread(new Runnable(){ @Override public void run(){ - player.playSpellAbility(c, ab); + CField.this.playerViewer.playSpellAbility(c, ab); }}); } } diff --git a/src/main/java/forge/gui/match/nonsingleton/VField.java b/src/main/java/forge/gui/match/nonsingleton/VField.java index 1efc4e95d9f..c414639ec33 100644 --- a/src/main/java/forge/gui/match/nonsingleton/VField.java +++ b/src/main/java/forge/gui/match/nonsingleton/VField.java @@ -36,6 +36,7 @@ import net.miginfocom.swing.MigLayout; import forge.card.cardfactory.CardFactoryUtil; import forge.card.mana.ManaPool; import forge.game.phase.PhaseType; +import forge.game.player.HumanPlayer; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.framework.DragCell; @@ -111,7 +112,7 @@ public class VField implements IVDoc { * @param playerOnwer   {@link forge.game.player.Player} * @param id0   {@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; id0.setDoc(this);