InputControl is invariant of player type

This commit is contained in:
Maxmtg
2013-01-24 22:20:28 +00:00
parent 57078eeb42
commit d409d5749c
15 changed files with 124 additions and 93 deletions

1
.gitattributes vendored
View File

@@ -13679,6 +13679,7 @@ src/main/java/forge/game/player/AIPlayer.java svneol=native#text/plain
src/main/java/forge/game/player/Computer.java svneol=native#text/plain src/main/java/forge/game/player/Computer.java svneol=native#text/plain
src/main/java/forge/game/player/ComputerAIGeneral.java svneol=native#text/plain src/main/java/forge/game/player/ComputerAIGeneral.java svneol=native#text/plain
src/main/java/forge/game/player/ComputerAIInput.java svneol=native#text/plain src/main/java/forge/game/player/ComputerAIInput.java svneol=native#text/plain
src/main/java/forge/game/player/ComputerAiInputBlock.java -text
src/main/java/forge/game/player/ComputerUtil.java svneol=native#text/plain src/main/java/forge/game/player/ComputerUtil.java svneol=native#text/plain
src/main/java/forge/game/player/ComputerUtilAttack.java svneol=native#text/plain src/main/java/forge/game/player/ComputerUtilAttack.java svneol=native#text/plain
src/main/java/forge/game/player/ComputerUtilBlock.java svneol=native#text/plain src/main/java/forge/game/player/ComputerUtilBlock.java svneol=native#text/plain

View File

@@ -88,7 +88,7 @@ public class InputAttack extends Input {
Singletons.getModel().getGame().getPhaseHandler().repeatPhase(); Singletons.getModel().getGame().getPhaseHandler().repeatPhase();
} }
Singletons.getModel().getGame().getPhaseHandler().setPlayerMayHavePriority(false); Singletons.getModel().getGame().getPhaseHandler().setPlayersPriorityPermission(false);
Singletons.getModel().getMatch().getInput().resetInput(); Singletons.getModel().getMatch().getInput().resetInput();
} }

View File

@@ -24,6 +24,7 @@ import java.util.List;
import forge.Card; import forge.Card;
import forge.Singletons; import forge.Singletons;
import forge.game.GameState;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.Zone; import forge.game.zone.Zone;
@@ -96,12 +97,13 @@ public class InputBlock extends Input {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void selectButtonOK() { public final void selectButtonOK() {
if (CombatUtil.finishedMandatoryBlocks(Singletons.getModel().getGame().getCombat(), defender)) { final GameState game = Singletons.getModel().getGame();
if (CombatUtil.finishedMandatoryBlocks(game.getCombat(), defender)) {
// Done blocking // Done blocking
ButtonUtil.reset(); ButtonUtil.reset();
CombatUtil.orderMultipleCombatants(Singletons.getModel().getGame().getCombat()); CombatUtil.orderMultipleCombatants(game.getCombat());
Singletons.getModel().getGame().getPhaseHandler().passPriority(); game.getPhaseHandler().passPriority();
} }
} }

View File

@@ -23,6 +23,7 @@ import forge.game.GameState;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerController;
import forge.game.zone.MagicStack; import forge.game.zone.MagicStack;
import forge.util.MyObservable; import forge.util.MyObservable;
@@ -189,7 +190,7 @@ public class InputControl extends MyObservable implements java.io.Serializable {
// If the Phase we're in doesn't allow for Priority, return null to move // If the Phase we're in doesn't allow for Priority, return null to move
// to next phase // to next phase
if (!handler.mayPlayerHavePriority()) { if (!handler.isPlayerPriorityAllowed()) {
return null; return null;
} }
@@ -205,18 +206,13 @@ public class InputControl extends MyObservable implements java.io.Serializable {
case COMBAT_DECLARE_BLOCKERS: case COMBAT_DECLARE_BLOCKERS:
stack.freezeStack(); stack.freezeStack();
boolean isUnderAttack = game.getCombat().isPlayerAttacked(priority);
if (!isUnderAttack) { // noone attacks you if (game.getCombat().isPlayerAttacked(priority)) {
handler.passPriority(); return priority.getController().getBlockInput();
return null;
} }
if (priority.isHuman()) { // noone attacks you
return new InputBlock(priority); handler.passPriority();
}
// ai is under attack
priority.getController().getAiInput().getComputer().declareBlockers();
return null; return null;
case CLEANUP: case CLEANUP:
@@ -234,20 +230,19 @@ public class InputControl extends MyObservable implements java.io.Serializable {
// ********************* // *********************
// Special phases handled above, everything else is handled simply by // Special phases handled above, everything else is handled simply by
// priority // priority
if (priority == null) { if (priority == null)
return null; return null;
} else if (priority.isHuman()) {
boolean prioritySkip = priority.getController().mayAutoPass(phase) PlayerController pc = priority.getController();
|| priority.getController().isUiSetToSkipPhase(playerTurn, phase);
if (this.game.getStack().isEmpty() && prioritySkip) { boolean prioritySkip = pc.mayAutoPass(phase) || pc.isUiSetToSkipPhase(playerTurn, phase);
handler.passPriority(); if (this.game.getStack().isEmpty() && prioritySkip) {
return null; handler.passPriority();
} else { return null;
priority.getController().autoPassCancel(); // probably cancel, since something has happened } else
return new InputPassPriority(); pc.autoPassCancel(); // probably cancel, since something has happened
}
} else // if (playerTurn.isComputer()) { return pc.getDefaultInput();
return priority.getController().getAiInput();
} // getInput() } // getInput()
} // InputControl } // InputControl

View File

@@ -258,7 +258,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
for (Player p : game.getPlayers()) { for (Player p : game.getPlayers()) {
p.clearSlowtripList(); p.clearSlowtripList();
} }
this.setPlayerMayHavePriority(false); this.setPlayersPriorityPermission(false);
} else { } else {
game.getUpkeep().executeUntil(this.getPlayerTurn()); game.getUpkeep().executeUntil(this.getPlayerTurn());
game.getUpkeep().executeAt(); game.getUpkeep().executeAt();
@@ -267,7 +267,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
case DRAW: case DRAW:
if (getTurn() == 1 || PhaseUtil.skipDraw(this.getPlayerTurn())) { if (getTurn() == 1 || PhaseUtil.skipDraw(this.getPlayerTurn())) {
this.setPlayerMayHavePriority(false); this.setPlayersPriorityPermission(false);
} else { } else {
this.getPlayerTurn().drawCards(1, true); this.getPlayerTurn().drawCards(1, true);
} }
@@ -282,13 +282,13 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
case COMBAT_BEGIN: case COMBAT_BEGIN:
//PhaseUtil.verifyCombat(); //PhaseUtil.verifyCombat();
if (playerTurn.isSkippingCombat()) { if (playerTurn.isSkippingCombat()) {
this.setPlayerMayHavePriority(false); this.setPlayersPriorityPermission(false);
} }
break; break;
case COMBAT_DECLARE_ATTACKERS: case COMBAT_DECLARE_ATTACKERS:
if (playerTurn.isSkippingCombat()) { if (playerTurn.isSkippingCombat()) {
this.setPlayerMayHavePriority(false); this.setPlayersPriorityPermission(false);
playerTurn.removeKeyword("Skip your next combat phase."); playerTurn.removeKeyword("Skip your next combat phase.");
} }
break; break;
@@ -298,7 +298,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
PhaseUtil.handleDeclareAttackers(game.getCombat()); PhaseUtil.handleDeclareAttackers(game.getCombat());
CombatUtil.showCombat(); CombatUtil.showCombat();
} else { } else {
this.setPlayerMayHavePriority(false); this.setPlayersPriorityPermission(false);
} }
break; break;
// we can skip AfterBlockers and AfterAttackers if necessary // we can skip AfterBlockers and AfterAttackers if necessary
@@ -307,7 +307,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
game.getCombat().verifyCreaturesInPlay(); game.getCombat().verifyCreaturesInPlay();
CombatUtil.showCombat(); CombatUtil.showCombat();
} else { } else {
this.setPlayerMayHavePriority(false); this.setPlayersPriorityPermission(false);
} }
break; break;
@@ -318,19 +318,19 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
PhaseUtil.handleDeclareBlockers(game); PhaseUtil.handleDeclareBlockers(game);
CombatUtil.showCombat(); CombatUtil.showCombat();
} else { } else {
this.setPlayerMayHavePriority(false); this.setPlayersPriorityPermission(false);
} }
break; break;
case COMBAT_FIRST_STRIKE_DAMAGE: case COMBAT_FIRST_STRIKE_DAMAGE:
if (!this.inCombat()) { if (!this.inCombat()) {
this.setPlayerMayHavePriority(false); this.setPlayersPriorityPermission(false);
} else { } else {
game.getCombat().verifyCreaturesInPlay(); game.getCombat().verifyCreaturesInPlay();
// no first strikers, skip this step // no first strikers, skip this step
if (!game.getCombat().assignCombatDamage(true)) { if (!game.getCombat().assignCombatDamage(true)) {
this.setPlayerMayHavePriority(false); this.setPlayersPriorityPermission(false);
} else { } else {
game.getCombat().dealAssignedDamage(); game.getCombat().dealAssignedDamage();
game.getAction().checkStateEffects(); game.getAction().checkStateEffects();
@@ -341,12 +341,12 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
case COMBAT_DAMAGE: case COMBAT_DAMAGE:
if (!this.inCombat()) { if (!this.inCombat()) {
this.setPlayerMayHavePriority(false); this.setPlayersPriorityPermission(false);
} else { } else {
game.getCombat().verifyCreaturesInPlay(); game.getCombat().verifyCreaturesInPlay();
if (!game.getCombat().assignCombatDamage(false)) { if (!game.getCombat().assignCombatDamage(false)) {
this.setPlayerMayHavePriority(false); this.setPlayersPriorityPermission(false);
} else { } else {
game.getCombat().dealAssignedDamage(); game.getCombat().dealAssignedDamage();
game.getAction().checkStateEffects(); game.getAction().checkStateEffects();
@@ -392,7 +392,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
break; break;
} }
if (this.mayPlayerHavePriority()) { if (this.isPlayerPriorityAllowed()) {
// Run triggers if phase isn't being skipped // Run triggers if phase isn't being skipped
final HashMap<String, Object> runParams = new HashMap<String, Object>(); final HashMap<String, Object> runParams = new HashMap<String, Object>();
runParams.put("Phase", this.getPhase().Name); runParams.put("Phase", this.getPhase().Name);
@@ -427,7 +427,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
*/ */
public final void nextPhase() { public final void nextPhase() {
this.setPlayerMayHavePriority(true); // PlayerPriorityAllowed = false; this.setPlayersPriorityPermission(true); // PlayerPriorityAllowed = false;
// If the Stack isn't empty why is nextPhase being called? // If the Stack isn't empty why is nextPhase being called?
if (game.getStack().size() != 0) { if (game.getStack().size() != 0) {
@@ -787,7 +787,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
if (game.getStack().isEmpty()) { if (game.getStack().isEmpty()) {
this.setPriority(this.getPlayerTurn()); // this needs to be set early as we exit the phase this.setPriority(this.getPlayerTurn()); // this needs to be set early as we exit the phase
// end phase // end phase
setPlayerMayHavePriority(true); setPlayersPriorityPermission(true);
nextPhase(); nextPhase();
return; return;
} else if (!game.getStack().hasSimultaneousStackEntries()) { } else if (!game.getStack().hasSimultaneousStackEntries()) {
@@ -810,7 +810,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
* @param needToNextPhase * @param needToNextPhase
* a boolean. * a boolean.
*/ */
public final void setPlayerMayHavePriority(final boolean mayHavePriority) { public final void setPlayersPriorityPermission(final boolean mayHavePriority) {
this.isPlayerPriorityAllowed = mayHavePriority; this.isPlayerPriorityAllowed = mayHavePriority;
} }
@@ -821,7 +821,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
* *
* @return a boolean. * @return a boolean.
*/ */
public final boolean mayPlayerHavePriority() { public final boolean isPlayerPriorityAllowed() {
return this.isPlayerPriorityAllowed; return this.isPlayerPriorityAllowed;
} }

View File

@@ -101,7 +101,7 @@ public class PhaseUtil {
// phase is skipped // phase is skipped
if (PhaseUtil.skipUntap(turn)) { if (PhaseUtil.skipUntap(turn)) {
game.getPhaseHandler().setPlayerMayHavePriority(false); game.getPhaseHandler().setPlayersPriorityPermission(false);
return; return;
} }
@@ -111,7 +111,7 @@ public class PhaseUtil {
// otherwise land seems to stay tapped when it is really untapped // otherwise land seems to stay tapped when it is really untapped
// AllZone.getHumanPlayer().getZone(ZoneType.Battlefield).updateObservers(); // AllZone.getHumanPlayer().getZone(ZoneType.Battlefield).updateObservers();
game.getPhaseHandler().setPlayerMayHavePriority(false); game.getPhaseHandler().setPlayersPriorityPermission(false);
} }
/** /**

View File

@@ -52,8 +52,9 @@ public class AIPlayer extends Player {
* a {@link java.lang.String} object. * a {@link java.lang.String} object.
*/ */
public AIPlayer(final LobbyPlayer player, final GameState game) { public AIPlayer(final LobbyPlayer player, final GameState game) {
super(player, game); super(player, game, new PlayerController());
getController().setAiInput(new ComputerAIInput(new ComputerAIGeneral(this, game))); getController().setDefaultInput(new ComputerAIInput(new ComputerAIGeneral(this, game)));
getController().setBlockInput(new ComputerAiInputBlock(game, this));
} }

View File

@@ -38,13 +38,6 @@ public interface Computer {
*/ */
void declareAttackers(); void declareAttackers();
/**
* <p>
* declare_blockers.
* </p>
*/
void declareBlockers(); // this is called after when the Human or Computer
// blocks
/** /**
* <p> * <p>

View File

@@ -33,7 +33,6 @@ import forge.card.spellability.SpellPermanent;
import forge.card.trigger.Trigger; import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerType; import forge.card.trigger.TriggerType;
import forge.game.GameState; import forge.game.GameState;
import forge.game.phase.CombatUtil;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
/** /**
@@ -285,14 +284,13 @@ public class ComputerAIGeneral implements Computer {
for (final Card element : att) { for (final Card element : att) {
// tapping of attackers happens after Propaganda is paid for // tapping of attackers happens after Propaganda is paid for
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
sb.append("Computer just assigned "); sb.append("Computer just assigned ").append(element.getName()).append(" as an attacker.");
sb.append(element.getName()).append(" as an attacker.");
Log.debug(sb.toString()); Log.debug(sb.toString());
} }
player.getZone(ZoneType.Battlefield).updateObservers(); player.getZone(ZoneType.Battlefield).updateObservers();
game.getPhaseHandler().setPlayerMayHavePriority(false); game.getPhaseHandler().setPlayersPriorityPermission(false);
// ai is about to attack, cancel all phase skipping // ai is about to attack, cancel all phase skipping
for (Player p : game.getPlayers()) { for (Player p : game.getPlayers()) {
@@ -300,22 +298,6 @@ public class ComputerAIGeneral implements Computer {
} }
} }
/**
* <p>
* declare_blockers.
* </p>
*/
@Override
public final void declareBlockers() {
final List<Card> blockers = player.getCreaturesInPlay();
game.setCombat(ComputerUtilBlock.getBlockers(player, game.getCombat(), blockers));
CombatUtil.orderMultipleCombatants(game.getCombat());
game.getPhaseHandler().setPlayerMayHavePriority(false);
}
/** /**
* <p> * <p>

View File

@@ -0,0 +1,42 @@
package forge.game.player;
import java.util.List;
import forge.Card;
import forge.control.input.Input;
import forge.game.GameState;
import forge.game.phase.CombatUtil;
/**
* TODO: Write javadoc for this type.
*
*/
public class ComputerAiInputBlock extends Input {
private final GameState game;
/**
* TODO: Write javadoc for Constructor.
* @param game
* @param player
*/
public ComputerAiInputBlock(GameState game, Player player) {
super();
this.game = game;
this.player = player;
}
private final Player player;
private static final long serialVersionUID = -2253562658069995572L;
@Override
public void showMessage() {
// TODO Auto-generated method stub
final List<Card> blockers = player.getCreaturesInPlay();
game.setCombat(ComputerUtilBlock.getBlockers(player, game.getCombat(), blockers));
CombatUtil.orderMultipleCombatants(game.getCombat());
game.getPhaseHandler().setPlayersPriorityPermission(false);
stop();
}
}

View File

@@ -24,6 +24,8 @@ import forge.Card;
import forge.Singletons; import forge.Singletons;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.control.input.Input; import forge.control.input.Input;
import forge.control.input.InputBlock;
import forge.control.input.InputPassPriority;
import forge.game.GameType; import forge.game.GameType;
import forge.game.GameState; import forge.game.GameState;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
@@ -51,7 +53,9 @@ public class HumanPlayer extends Player {
* a {@link java.lang.String} object. * a {@link java.lang.String} object.
*/ */
public HumanPlayer(final LobbyPlayer player, GameState game) { public HumanPlayer(final LobbyPlayer player, GameState game) {
super(player, game); super(player, game, new PlayerController());
getController().setDefaultInput(new InputPassPriority());
getController().setBlockInput(new InputBlock(this));
} }
// ////////////// // //////////////

View File

@@ -178,7 +178,7 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
* @param myPoisonCounters * @param myPoisonCounters
* a int. * a int.
*/ */
public Player(LobbyPlayer lobbyPlayer0, GameState game0) { public Player(LobbyPlayer lobbyPlayer0, GameState game0, PlayerController pc) {
lobbyPlayer = lobbyPlayer0; lobbyPlayer = lobbyPlayer0;
game = game0; game = game0;
for (final ZoneType z : Player.ALL_ZONES) { for (final ZoneType z : Player.ALL_ZONES) {
@@ -188,7 +188,9 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
this.zones.put(z, toPut); this.zones.put(z, toPut);
} }
this.setName(lobbyPlayer.getName()); this.setName(lobbyPlayer.getName());
controller = new PlayerController(this); pc.setPlayer(this);
controller = pc;
} }
public final PlayerStatistics getStats() { public final PlayerStatistics getStats() {

View File

@@ -4,6 +4,7 @@ import java.util.List;
import forge.Singletons; import forge.Singletons;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.control.input.Input;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;
import forge.gui.match.CMatchUI; import forge.gui.match.CMatchUI;
@@ -18,18 +19,20 @@ public class PlayerController {
// Should keep some 'Model' of player here. // Should keep some 'Model' of player here.
// Yet I have little idea of what is model now. // Yet I have little idea of what is model now.
private final Player player; private Player player;
private PhaseType autoPassUntil = null; private PhaseType autoPassUntil = null;
private ComputerAIInput aiInput; private Input defaultInput;
private Input blockInput;
public final ComputerAIInput getAiInput() { public final Input getDefaultInput() {
return aiInput; return defaultInput;
} }
public PlayerController(Player player0) { public PlayerController() {}
player = player0; void setPlayer(Player p) {
player = p;
} }
/** /**
@@ -51,15 +54,12 @@ public class PlayerController {
public boolean isUiSetToSkipPhase(final Player turn, final PhaseType phase) { public boolean isUiSetToSkipPhase(final Player turn, final PhaseType phase) {
return player.equals(Singletons.getControl().getPlayer()) && !CMatchUI.SINGLETON_INSTANCE.stopAtPhase(turn, phase); boolean isLocalPlayer = player.equals(Singletons.getControl().getPlayer());
return isLocalPlayer && !CMatchUI.SINGLETON_INSTANCE.stopAtPhase(turn, phase);
} }
/** void setDefaultInput(Input input) {
* TODO: Write javadoc for this method. defaultInput = input;
* @param computerAIInput
*/
public void setAiInput(ComputerAIInput computerAIInput) {
aiInput = computerAIInput;
} }
/** /**
@@ -75,4 +75,13 @@ public class PlayerController {
} }
} }
/** Input to use when player has to declare blockers */
public Input getBlockInput() {
return blockInput;
}
void setBlockInput(Input blockInput0) {
this.blockInput = blockInput0;
}
} }

View File

@@ -1033,7 +1033,7 @@ public class MagicStack extends MyObservable {
game.getAction().checkStateEffects(); game.getAction().checkStateEffects();
game.getPhaseHandler().setPlayerMayHavePriority(true); game.getPhaseHandler().setPlayersPriorityPermission(true);
this.curResolvingCard = null; this.curResolvingCard = null;

View File

@@ -52,7 +52,7 @@ public class GuiInput extends MyObservable implements Observer {
if (tmp != null) { if (tmp != null) {
// System.out.println(ph.getPlayerTurn() + "'s " + ph.getPhase() + ", priority of " + ph.getPriorityPlayer() + " @ input is " + tmp.getClass().getName() ); // System.out.println(ph.getPlayerTurn() + "'s " + ph.getPhase() + ", priority of " + ph.getPriorityPlayer() + " @ input is " + tmp.getClass().getName() );
this.setInput(tmp); this.setInput(tmp);
} else if (!ph.mayPlayerHavePriority()) { } else if (!ph.isPlayerPriorityAllowed()) {
//System.out.println("cannot have priority, forced to pass"); //System.out.println("cannot have priority, forced to pass");
ph.passPriority(); ph.passPriority();
} }