mirror of
https://github.com/magefree/mage.git
synced 2026-01-26 21:29:17 -08:00
refactor: simplified extra turn code, fixed NPE error on usage (Alchemist's Gambit)
This commit is contained in:
parent
ad461498b0
commit
6529ead72f
9 changed files with 100 additions and 107 deletions
|
|
@ -82,16 +82,16 @@ public class AddExtraTurnControllerEffect extends OneShotEffect {
|
|||
|
||||
class LoseGameDelayedTriggeredAbility extends DelayedTriggeredAbility {
|
||||
|
||||
private final UUID connectedTurnMod;
|
||||
private final UUID turnId;
|
||||
|
||||
public LoseGameDelayedTriggeredAbility(UUID connectedTurnMod) {
|
||||
public LoseGameDelayedTriggeredAbility(UUID turnId) {
|
||||
super(new LoseGameSourceControllerEffect(), Duration.EndOfGame);
|
||||
this.connectedTurnMod = connectedTurnMod;
|
||||
this.turnId = turnId;
|
||||
}
|
||||
|
||||
public LoseGameDelayedTriggeredAbility(final LoseGameDelayedTriggeredAbility ability) {
|
||||
super(ability);
|
||||
this.connectedTurnMod = ability.connectedTurnMod;
|
||||
this.turnId = ability.turnId;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -106,7 +106,7 @@ class LoseGameDelayedTriggeredAbility extends DelayedTriggeredAbility {
|
|||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
return connectedTurnMod != null && connectedTurnMod.equals(game.getState().getTurnId());
|
||||
return this.turnId != null && this.turnId.equals(game.getState().getExtraTurnId());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -206,6 +206,8 @@ public interface Game extends MageItem, Serializable, Copyable<Game> {
|
|||
/**
|
||||
* Id of the player the current turn it is.
|
||||
*
|
||||
* Player can be under control of another player, so search a real GUI's controller by Player->getTurnControlledBy
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
UUID getActivePlayerId();
|
||||
|
|
|
|||
|
|
@ -1033,25 +1033,26 @@ public abstract class GameImpl implements Game {
|
|||
private boolean playExtraTurns() {
|
||||
//20091005 - 500.7
|
||||
TurnMod extraTurn = getNextExtraTurn();
|
||||
while (extraTurn != null) {
|
||||
GameEvent event = new GameEvent(GameEvent.EventType.PLAY_TURN, null, null, extraTurn.getPlayerId());
|
||||
if (!replaceEvent(event)) {
|
||||
Player extraPlayer = this.getPlayer(extraTurn.getPlayerId());
|
||||
if (extraPlayer != null && extraPlayer.canRespond()) {
|
||||
state.setExtraTurn(true);
|
||||
state.setTurnId(extraTurn.getId());
|
||||
if (!this.isSimulation()) {
|
||||
informPlayers(extraPlayer.getLogName() + " takes an extra turn");
|
||||
}
|
||||
if (!playTurn(extraPlayer)) {
|
||||
return false;
|
||||
try {
|
||||
while (extraTurn != null) {
|
||||
GameEvent event = new GameEvent(GameEvent.EventType.PLAY_TURN, null, null, extraTurn.getPlayerId());
|
||||
if (!replaceEvent(event)) {
|
||||
Player extraPlayer = this.getPlayer(extraTurn.getPlayerId());
|
||||
if (extraPlayer != null && extraPlayer.canRespond()) {
|
||||
state.setExtraTurnId(extraTurn.getId());
|
||||
if (!this.isSimulation()) {
|
||||
informPlayers(extraPlayer.getLogName() + " takes an extra turn");
|
||||
}
|
||||
if (!playTurn(extraPlayer)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
extraTurn = getNextExtraTurn();
|
||||
}
|
||||
extraTurn = getNextExtraTurn();
|
||||
} finally {
|
||||
state.setExtraTurnId(null);
|
||||
}
|
||||
state.setTurnId(null);
|
||||
state.setExtraTurn(false);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -91,8 +91,7 @@ public class GameState implements Serializable, Copyable<GameState> {
|
|||
private Battlefield battlefield;
|
||||
private int turnNum = 1;
|
||||
private int stepNum = 0;
|
||||
private UUID turnId = null;
|
||||
private boolean extraTurn = false;
|
||||
private UUID extraTurnId = null; // id of the current extra turn (null on normal turn or after game stopped)
|
||||
private boolean gameOver;
|
||||
private boolean paused;
|
||||
private ContinuousEffects effects;
|
||||
|
|
@ -162,7 +161,7 @@ public class GameState implements Serializable, Copyable<GameState> {
|
|||
this.battlefield = state.battlefield.copy();
|
||||
this.turnNum = state.turnNum;
|
||||
this.stepNum = state.stepNum;
|
||||
this.extraTurn = state.extraTurn;
|
||||
this.extraTurnId = state.extraTurnId;
|
||||
this.effects = state.effects.copy();
|
||||
for (TriggeredAbility trigger : state.triggered) {
|
||||
this.triggered.add(trigger.copy());
|
||||
|
|
@ -229,7 +228,7 @@ public class GameState implements Serializable, Copyable<GameState> {
|
|||
companion.clear();
|
||||
turnNum = 1;
|
||||
stepNum = 0;
|
||||
extraTurn = false;
|
||||
extraTurnId = null;
|
||||
gameOver = false;
|
||||
specialActions.clear();
|
||||
cardState.clear();
|
||||
|
|
@ -265,7 +264,7 @@ public class GameState implements Serializable, Copyable<GameState> {
|
|||
this.battlefield = state.battlefield;
|
||||
this.turnNum = state.turnNum;
|
||||
this.stepNum = state.stepNum;
|
||||
this.extraTurn = state.extraTurn;
|
||||
this.extraTurnId = state.extraTurnId;
|
||||
this.effects = state.effects;
|
||||
this.triggered = state.triggered;
|
||||
this.triggers = state.triggers;
|
||||
|
|
@ -616,20 +615,16 @@ public class GameState implements Serializable, Copyable<GameState> {
|
|||
this.turnNum = turnNum;
|
||||
}
|
||||
|
||||
public UUID getTurnId() {
|
||||
return this.turnId;
|
||||
public UUID getExtraTurnId() {
|
||||
return this.extraTurnId;
|
||||
}
|
||||
|
||||
public void setTurnId(UUID turnId) {
|
||||
this.turnId = turnId;
|
||||
public void setExtraTurnId(UUID extraTurnId) {
|
||||
this.extraTurnId = extraTurnId;
|
||||
}
|
||||
|
||||
public boolean isExtraTurn() {
|
||||
return extraTurn;
|
||||
}
|
||||
|
||||
public void setExtraTurn(boolean extraTurn) {
|
||||
this.extraTurn = extraTurn;
|
||||
return this.extraTurnId != null;
|
||||
}
|
||||
|
||||
public boolean isGameOver() {
|
||||
|
|
|
|||
|
|
@ -9,6 +9,10 @@ import mage.game.events.GameEvent;
|
|||
import mage.game.events.GameEvent.EventType;
|
||||
|
||||
/**
|
||||
* Game's step
|
||||
*
|
||||
* Warning, don't use a changeable data in step's implementations
|
||||
* TODO: implement copyable<> interface and copy usage in GameState
|
||||
*
|
||||
* @author BetaSteward_at_googlemail.com
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue