mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 04:08:01 +00:00
InputControl is invariant of player type
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -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/ComputerAIGeneral.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/ComputerUtilAttack.java svneol=native#text/plain
|
||||
src/main/java/forge/game/player/ComputerUtilBlock.java svneol=native#text/plain
|
||||
|
||||
@@ -88,7 +88,7 @@ public class InputAttack extends Input {
|
||||
Singletons.getModel().getGame().getPhaseHandler().repeatPhase();
|
||||
}
|
||||
|
||||
Singletons.getModel().getGame().getPhaseHandler().setPlayerMayHavePriority(false);
|
||||
Singletons.getModel().getGame().getPhaseHandler().setPlayersPriorityPermission(false);
|
||||
Singletons.getModel().getMatch().getInput().resetInput();
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ import java.util.List;
|
||||
import forge.Card;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.game.GameState;
|
||||
import forge.game.phase.CombatUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.Zone;
|
||||
@@ -96,12 +97,13 @@ public class InputBlock extends Input {
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
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
|
||||
ButtonUtil.reset();
|
||||
CombatUtil.orderMultipleCombatants(Singletons.getModel().getGame().getCombat());
|
||||
CombatUtil.orderMultipleCombatants(game.getCombat());
|
||||
|
||||
Singletons.getModel().getGame().getPhaseHandler().passPriority();
|
||||
game.getPhaseHandler().passPriority();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ import forge.game.GameState;
|
||||
import forge.game.phase.PhaseHandler;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.player.PlayerController;
|
||||
import forge.game.zone.MagicStack;
|
||||
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
|
||||
// to next phase
|
||||
if (!handler.mayPlayerHavePriority()) {
|
||||
if (!handler.isPlayerPriorityAllowed()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -205,18 +206,13 @@ public class InputControl extends MyObservable implements java.io.Serializable {
|
||||
|
||||
case COMBAT_DECLARE_BLOCKERS:
|
||||
stack.freezeStack();
|
||||
boolean isUnderAttack = game.getCombat().isPlayerAttacked(priority);
|
||||
if (!isUnderAttack) { // noone attacks you
|
||||
handler.passPriority();
|
||||
return null;
|
||||
|
||||
if (game.getCombat().isPlayerAttacked(priority)) {
|
||||
return priority.getController().getBlockInput();
|
||||
}
|
||||
|
||||
if (priority.isHuman()) {
|
||||
return new InputBlock(priority);
|
||||
}
|
||||
|
||||
// ai is under attack
|
||||
priority.getController().getAiInput().getComputer().declareBlockers();
|
||||
// noone attacks you
|
||||
handler.passPriority();
|
||||
return null;
|
||||
|
||||
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
|
||||
// priority
|
||||
if (priority == null) {
|
||||
if (priority == null)
|
||||
return null;
|
||||
} else if (priority.isHuman()) {
|
||||
boolean prioritySkip = priority.getController().mayAutoPass(phase)
|
||||
|| priority.getController().isUiSetToSkipPhase(playerTurn, phase);
|
||||
if (this.game.getStack().isEmpty() && prioritySkip) {
|
||||
handler.passPriority();
|
||||
return null;
|
||||
} else {
|
||||
priority.getController().autoPassCancel(); // probably cancel, since something has happened
|
||||
return new InputPassPriority();
|
||||
}
|
||||
} else // if (playerTurn.isComputer()) {
|
||||
return priority.getController().getAiInput();
|
||||
|
||||
PlayerController pc = priority.getController();
|
||||
|
||||
boolean prioritySkip = pc.mayAutoPass(phase) || pc.isUiSetToSkipPhase(playerTurn, phase);
|
||||
if (this.game.getStack().isEmpty() && prioritySkip) {
|
||||
handler.passPriority();
|
||||
return null;
|
||||
} else
|
||||
pc.autoPassCancel(); // probably cancel, since something has happened
|
||||
|
||||
return pc.getDefaultInput();
|
||||
} // getInput()
|
||||
|
||||
} // InputControl
|
||||
|
||||
@@ -258,7 +258,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
for (Player p : game.getPlayers()) {
|
||||
p.clearSlowtripList();
|
||||
}
|
||||
this.setPlayerMayHavePriority(false);
|
||||
this.setPlayersPriorityPermission(false);
|
||||
} else {
|
||||
game.getUpkeep().executeUntil(this.getPlayerTurn());
|
||||
game.getUpkeep().executeAt();
|
||||
@@ -267,7 +267,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
|
||||
case DRAW:
|
||||
if (getTurn() == 1 || PhaseUtil.skipDraw(this.getPlayerTurn())) {
|
||||
this.setPlayerMayHavePriority(false);
|
||||
this.setPlayersPriorityPermission(false);
|
||||
} else {
|
||||
this.getPlayerTurn().drawCards(1, true);
|
||||
}
|
||||
@@ -282,13 +282,13 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
case COMBAT_BEGIN:
|
||||
//PhaseUtil.verifyCombat();
|
||||
if (playerTurn.isSkippingCombat()) {
|
||||
this.setPlayerMayHavePriority(false);
|
||||
this.setPlayersPriorityPermission(false);
|
||||
}
|
||||
break;
|
||||
|
||||
case COMBAT_DECLARE_ATTACKERS:
|
||||
if (playerTurn.isSkippingCombat()) {
|
||||
this.setPlayerMayHavePriority(false);
|
||||
this.setPlayersPriorityPermission(false);
|
||||
playerTurn.removeKeyword("Skip your next combat phase.");
|
||||
}
|
||||
break;
|
||||
@@ -298,7 +298,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
PhaseUtil.handleDeclareAttackers(game.getCombat());
|
||||
CombatUtil.showCombat();
|
||||
} else {
|
||||
this.setPlayerMayHavePriority(false);
|
||||
this.setPlayersPriorityPermission(false);
|
||||
}
|
||||
break;
|
||||
// we can skip AfterBlockers and AfterAttackers if necessary
|
||||
@@ -307,7 +307,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
game.getCombat().verifyCreaturesInPlay();
|
||||
CombatUtil.showCombat();
|
||||
} else {
|
||||
this.setPlayerMayHavePriority(false);
|
||||
this.setPlayersPriorityPermission(false);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -318,19 +318,19 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
PhaseUtil.handleDeclareBlockers(game);
|
||||
CombatUtil.showCombat();
|
||||
} else {
|
||||
this.setPlayerMayHavePriority(false);
|
||||
this.setPlayersPriorityPermission(false);
|
||||
}
|
||||
break;
|
||||
|
||||
case COMBAT_FIRST_STRIKE_DAMAGE:
|
||||
if (!this.inCombat()) {
|
||||
this.setPlayerMayHavePriority(false);
|
||||
this.setPlayersPriorityPermission(false);
|
||||
} else {
|
||||
game.getCombat().verifyCreaturesInPlay();
|
||||
|
||||
// no first strikers, skip this step
|
||||
if (!game.getCombat().assignCombatDamage(true)) {
|
||||
this.setPlayerMayHavePriority(false);
|
||||
this.setPlayersPriorityPermission(false);
|
||||
} else {
|
||||
game.getCombat().dealAssignedDamage();
|
||||
game.getAction().checkStateEffects();
|
||||
@@ -341,12 +341,12 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
|
||||
case COMBAT_DAMAGE:
|
||||
if (!this.inCombat()) {
|
||||
this.setPlayerMayHavePriority(false);
|
||||
this.setPlayersPriorityPermission(false);
|
||||
} else {
|
||||
game.getCombat().verifyCreaturesInPlay();
|
||||
|
||||
if (!game.getCombat().assignCombatDamage(false)) {
|
||||
this.setPlayerMayHavePriority(false);
|
||||
this.setPlayersPriorityPermission(false);
|
||||
} else {
|
||||
game.getCombat().dealAssignedDamage();
|
||||
game.getAction().checkStateEffects();
|
||||
@@ -392,7 +392,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
break;
|
||||
}
|
||||
|
||||
if (this.mayPlayerHavePriority()) {
|
||||
if (this.isPlayerPriorityAllowed()) {
|
||||
// Run triggers if phase isn't being skipped
|
||||
final HashMap<String, Object> runParams = new HashMap<String, Object>();
|
||||
runParams.put("Phase", this.getPhase().Name);
|
||||
@@ -427,7 +427,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
*/
|
||||
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 (game.getStack().size() != 0) {
|
||||
@@ -787,7 +787,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
if (game.getStack().isEmpty()) {
|
||||
this.setPriority(this.getPlayerTurn()); // this needs to be set early as we exit the phase
|
||||
// end phase
|
||||
setPlayerMayHavePriority(true);
|
||||
setPlayersPriorityPermission(true);
|
||||
nextPhase();
|
||||
return;
|
||||
} else if (!game.getStack().hasSimultaneousStackEntries()) {
|
||||
@@ -810,7 +810,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
* @param needToNextPhase
|
||||
* a boolean.
|
||||
*/
|
||||
public final void setPlayerMayHavePriority(final boolean mayHavePriority) {
|
||||
public final void setPlayersPriorityPermission(final boolean mayHavePriority) {
|
||||
this.isPlayerPriorityAllowed = mayHavePriority;
|
||||
}
|
||||
|
||||
@@ -821,7 +821,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
*
|
||||
* @return a boolean.
|
||||
*/
|
||||
public final boolean mayPlayerHavePriority() {
|
||||
public final boolean isPlayerPriorityAllowed() {
|
||||
return this.isPlayerPriorityAllowed;
|
||||
}
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ public class PhaseUtil {
|
||||
// phase is skipped
|
||||
|
||||
if (PhaseUtil.skipUntap(turn)) {
|
||||
game.getPhaseHandler().setPlayerMayHavePriority(false);
|
||||
game.getPhaseHandler().setPlayersPriorityPermission(false);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -111,7 +111,7 @@ public class PhaseUtil {
|
||||
// otherwise land seems to stay tapped when it is really untapped
|
||||
// AllZone.getHumanPlayer().getZone(ZoneType.Battlefield).updateObservers();
|
||||
|
||||
game.getPhaseHandler().setPlayerMayHavePriority(false);
|
||||
game.getPhaseHandler().setPlayersPriorityPermission(false);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -52,8 +52,9 @@ public class AIPlayer extends Player {
|
||||
* a {@link java.lang.String} object.
|
||||
*/
|
||||
public AIPlayer(final LobbyPlayer player, final GameState game) {
|
||||
super(player, game);
|
||||
getController().setAiInput(new ComputerAIInput(new ComputerAIGeneral(this, game)));
|
||||
super(player, game, new PlayerController());
|
||||
getController().setDefaultInput(new ComputerAIInput(new ComputerAIGeneral(this, game)));
|
||||
getController().setBlockInput(new ComputerAiInputBlock(game, this));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -38,13 +38,6 @@ public interface Computer {
|
||||
*/
|
||||
void declareAttackers();
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* declare_blockers.
|
||||
* </p>
|
||||
*/
|
||||
void declareBlockers(); // this is called after when the Human or Computer
|
||||
// blocks
|
||||
|
||||
/**
|
||||
* <p>
|
||||
|
||||
@@ -33,7 +33,6 @@ import forge.card.spellability.SpellPermanent;
|
||||
import forge.card.trigger.Trigger;
|
||||
import forge.card.trigger.TriggerType;
|
||||
import forge.game.GameState;
|
||||
import forge.game.phase.CombatUtil;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
/**
|
||||
@@ -285,14 +284,13 @@ public class ComputerAIGeneral implements Computer {
|
||||
for (final Card element : att) {
|
||||
// tapping of attackers happens after Propaganda is paid for
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
sb.append("Computer just assigned ");
|
||||
sb.append(element.getName()).append(" as an attacker.");
|
||||
sb.append("Computer just assigned ").append(element.getName()).append(" as an attacker.");
|
||||
Log.debug(sb.toString());
|
||||
}
|
||||
|
||||
player.getZone(ZoneType.Battlefield).updateObservers();
|
||||
|
||||
game.getPhaseHandler().setPlayerMayHavePriority(false);
|
||||
game.getPhaseHandler().setPlayersPriorityPermission(false);
|
||||
|
||||
// ai is about to attack, cancel all phase skipping
|
||||
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>
|
||||
|
||||
42
src/main/java/forge/game/player/ComputerAiInputBlock.java
Normal file
42
src/main/java/forge/game/player/ComputerAiInputBlock.java
Normal 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();
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,8 @@ import forge.Card;
|
||||
import forge.Singletons;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.control.input.Input;
|
||||
import forge.control.input.InputBlock;
|
||||
import forge.control.input.InputPassPriority;
|
||||
import forge.game.GameType;
|
||||
import forge.game.GameState;
|
||||
import forge.game.zone.ZoneType;
|
||||
@@ -51,7 +53,9 @@ public class HumanPlayer extends Player {
|
||||
* a {@link java.lang.String} object.
|
||||
*/
|
||||
public HumanPlayer(final LobbyPlayer player, GameState game) {
|
||||
super(player, game);
|
||||
super(player, game, new PlayerController());
|
||||
getController().setDefaultInput(new InputPassPriority());
|
||||
getController().setBlockInput(new InputBlock(this));
|
||||
}
|
||||
|
||||
// //////////////
|
||||
|
||||
@@ -178,7 +178,7 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
|
||||
* @param myPoisonCounters
|
||||
* a int.
|
||||
*/
|
||||
public Player(LobbyPlayer lobbyPlayer0, GameState game0) {
|
||||
public Player(LobbyPlayer lobbyPlayer0, GameState game0, PlayerController pc) {
|
||||
lobbyPlayer = lobbyPlayer0;
|
||||
game = game0;
|
||||
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.setName(lobbyPlayer.getName());
|
||||
controller = new PlayerController(this);
|
||||
pc.setPlayer(this);
|
||||
controller = pc;
|
||||
|
||||
}
|
||||
|
||||
public final PlayerStatistics getStats() {
|
||||
|
||||
@@ -4,6 +4,7 @@ import java.util.List;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.control.input.Input;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.gui.GuiChoose;
|
||||
import forge.gui.match.CMatchUI;
|
||||
@@ -18,18 +19,20 @@ public class PlayerController {
|
||||
|
||||
// Should keep some 'Model' of player here.
|
||||
// Yet I have little idea of what is model now.
|
||||
private final Player player;
|
||||
private Player player;
|
||||
|
||||
private PhaseType autoPassUntil = null;
|
||||
|
||||
private ComputerAIInput aiInput;
|
||||
private Input defaultInput;
|
||||
private Input blockInput;
|
||||
|
||||
public final ComputerAIInput getAiInput() {
|
||||
return aiInput;
|
||||
public final Input getDefaultInput() {
|
||||
return defaultInput;
|
||||
}
|
||||
|
||||
public PlayerController(Player player0) {
|
||||
player = player0;
|
||||
public PlayerController() {}
|
||||
void setPlayer(Player p) {
|
||||
player = p;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -51,15 +54,12 @@ public class PlayerController {
|
||||
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this method.
|
||||
* @param computerAIInput
|
||||
*/
|
||||
public void setAiInput(ComputerAIInput computerAIInput) {
|
||||
aiInput = computerAIInput;
|
||||
void setDefaultInput(Input input) {
|
||||
defaultInput = input;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1033,7 +1033,7 @@ public class MagicStack extends MyObservable {
|
||||
|
||||
game.getAction().checkStateEffects();
|
||||
|
||||
game.getPhaseHandler().setPlayerMayHavePriority(true);
|
||||
game.getPhaseHandler().setPlayersPriorityPermission(true);
|
||||
|
||||
this.curResolvingCard = null;
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ public class GuiInput extends MyObservable implements Observer {
|
||||
if (tmp != null) {
|
||||
// System.out.println(ph.getPlayerTurn() + "'s " + ph.getPhase() + ", priority of " + ph.getPriorityPlayer() + " @ input is " + tmp.getClass().getName() );
|
||||
this.setInput(tmp);
|
||||
} else if (!ph.mayPlayerHavePriority()) {
|
||||
} else if (!ph.isPlayerPriorityAllowed()) {
|
||||
//System.out.println("cannot have priority, forced to pass");
|
||||
ph.passPriority();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user