mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 03:08:02 +00:00
done with Dependencies
added a class to hold all game rules (type, gamesToWinMatch, manaburn, etc)
This commit is contained in:
3
.gitattributes
vendored
3
.gitattributes
vendored
@@ -121,7 +121,6 @@ forge-game/.settings/org.eclipse.m2e.core.prefs -text
|
|||||||
forge-game/pom.xml -text
|
forge-game/pom.xml -text
|
||||||
forge-game/src/main/java/forge/Command.java svneol=native#text/plain
|
forge-game/src/main/java/forge/Command.java svneol=native#text/plain
|
||||||
forge-game/src/main/java/forge/Constant.java svneol=native#text/plain
|
forge-game/src/main/java/forge/Constant.java svneol=native#text/plain
|
||||||
forge-game/src/main/java/forge/Dependencies.java -text
|
|
||||||
forge-game/src/main/java/forge/ImageKeys.java -text
|
forge-game/src/main/java/forge/ImageKeys.java -text
|
||||||
forge-game/src/main/java/forge/ai/AiAttackController.java svneol=native#text/plain
|
forge-game/src/main/java/forge/ai/AiAttackController.java svneol=native#text/plain
|
||||||
forge-game/src/main/java/forge/ai/AiBlockController.java svneol=native#text/plain
|
forge-game/src/main/java/forge/ai/AiBlockController.java svneol=native#text/plain
|
||||||
@@ -256,6 +255,7 @@ forge-game/src/main/java/forge/game/GameLogEntryType.java -text
|
|||||||
forge-game/src/main/java/forge/game/GameLogFormatter.java -text
|
forge-game/src/main/java/forge/game/GameLogFormatter.java -text
|
||||||
forge-game/src/main/java/forge/game/GameObject.java -text
|
forge-game/src/main/java/forge/game/GameObject.java -text
|
||||||
forge-game/src/main/java/forge/game/GameOutcome.java -text
|
forge-game/src/main/java/forge/game/GameOutcome.java -text
|
||||||
|
forge-game/src/main/java/forge/game/GameRules.java -text
|
||||||
forge-game/src/main/java/forge/game/GameStage.java -text
|
forge-game/src/main/java/forge/game/GameStage.java -text
|
||||||
forge-game/src/main/java/forge/game/GameType.java -text
|
forge-game/src/main/java/forge/game/GameType.java -text
|
||||||
forge-game/src/main/java/forge/game/GlobalRuleChange.java -text
|
forge-game/src/main/java/forge/game/GlobalRuleChange.java -text
|
||||||
@@ -15207,7 +15207,6 @@ forge-gui/src/main/html/js/socket.js -text
|
|||||||
forge-gui/src/main/java/forge/FThreads.java -text
|
forge-gui/src/main/java/forge/FThreads.java -text
|
||||||
forge-gui/src/main/java/forge/ImageCache.java svneol=native#text/plain
|
forge-gui/src/main/java/forge/ImageCache.java svneol=native#text/plain
|
||||||
forge-gui/src/main/java/forge/ImageLoader.java -text
|
forge-gui/src/main/java/forge/ImageLoader.java -text
|
||||||
forge-gui/src/main/java/forge/PreferencesProvider.java -text
|
|
||||||
forge-gui/src/main/java/forge/Singletons.java svneol=native#text/plain
|
forge-gui/src/main/java/forge/Singletons.java svneol=native#text/plain
|
||||||
forge-gui/src/main/java/forge/control/ChatArea.java -text
|
forge-gui/src/main/java/forge/control/ChatArea.java -text
|
||||||
forge-gui/src/main/java/forge/control/FControl.java -text
|
forge-gui/src/main/java/forge/control/FControl.java -text
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
package forge;
|
|
||||||
|
|
||||||
public class Dependencies {
|
|
||||||
|
|
||||||
public static PreferencesMethods preferences;
|
|
||||||
public interface PreferencesMethods {
|
|
||||||
@Deprecated public abstract boolean getCloneModeSource();
|
|
||||||
@Deprecated public abstract boolean isManaBurnEnabled();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -57,7 +57,7 @@ import forge.util.Aggregates;
|
|||||||
* Represents the state of a <i>single game</i>, a new instance is created for each game.
|
* Represents the state of a <i>single game</i>, a new instance is created for each game.
|
||||||
*/
|
*/
|
||||||
public class Game {
|
public class Game {
|
||||||
private final GameType type;
|
private final GameRules rules;
|
||||||
private final List<Player> roIngamePlayers;
|
private final List<Player> roIngamePlayers;
|
||||||
private final List<Player> allPlayers;
|
private final List<Player> allPlayers;
|
||||||
private final List<Player> ingamePlayers = new ArrayList<Player>();
|
private final List<Player> ingamePlayers = new ArrayList<Player>();
|
||||||
@@ -89,8 +89,8 @@ public class Game {
|
|||||||
* Constructor.
|
* Constructor.
|
||||||
* @param match0
|
* @param match0
|
||||||
*/
|
*/
|
||||||
public Game(List<RegisteredPlayer> players0, GameType t, Match match0) { /* no more zones to map here */
|
public Game(List<RegisteredPlayer> players0, GameRules rules, Match match0) { /* no more zones to map here */
|
||||||
type = t;
|
this.rules = rules;
|
||||||
match = match0;
|
match = match0;
|
||||||
List<Player> players = new ArrayList<Player>();
|
List<Player> players = new ArrayList<Player>();
|
||||||
allPlayers = Collections.unmodifiableList(players);
|
allPlayers = Collections.unmodifiableList(players);
|
||||||
@@ -515,8 +515,8 @@ public class Game {
|
|||||||
/**
|
/**
|
||||||
* @return the type of game (Constructed/Limited/Planechase/etc...)
|
* @return the type of game (Constructed/Limited/Planechase/etc...)
|
||||||
*/
|
*/
|
||||||
public GameType getType() {
|
public GameRules getRules() {
|
||||||
return type;
|
return rules;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -798,7 +798,7 @@ public class GameAction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Max: I don't know where to put this! - but since it's a state based action, it must be in check state effects
|
// Max: I don't know where to put this! - but since it's a state based action, it must be in check state effects
|
||||||
if (game.getType() == GameType.Archenemy) {
|
if (game.getRules().getGameType() == GameType.Archenemy) {
|
||||||
game.archenemy904_10();
|
game.archenemy904_10();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1474,25 +1474,26 @@ public class GameAction {
|
|||||||
public void startGame(GameOutcome lastGameOutcome) {
|
public void startGame(GameOutcome lastGameOutcome) {
|
||||||
Player first = determineFirstTurnPlayer(lastGameOutcome);
|
Player first = determineFirstTurnPlayer(lastGameOutcome);
|
||||||
|
|
||||||
|
GameType gameType = game.getRules().getGameType();
|
||||||
do {
|
do {
|
||||||
if (game.isGameOver()) { break; } // conceded during "play or draw"
|
if (game.isGameOver()) { break; } // conceded during "play or draw"
|
||||||
|
|
||||||
// FControl should determine now if there are any human players.
|
// FControl should determine now if there are any human players.
|
||||||
// Where there are none, it should bring up speed controls
|
// Where there are none, it should bring up speed controls
|
||||||
game.fireEvent(new GameEventGameStarted(game.getType(), first, game.getPlayers()));
|
game.fireEvent(new GameEventGameStarted(gameType, first, game.getPlayers()));
|
||||||
|
|
||||||
game.setAge(GameStage.Mulligan);
|
game.setAge(GameStage.Mulligan);
|
||||||
for (final Player p1 : game.getPlayers()) {
|
for (final Player p1 : game.getPlayers()) {
|
||||||
p1.drawCards(p1.getMaxHandSize());
|
p1.drawCards(p1.getMaxHandSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
performMulligans(first, game.getType() == GameType.Commander);
|
performMulligans(first, gameType == GameType.Commander);
|
||||||
if (game.isGameOver()) { break; } // conceded during "mulligan" prompt
|
if (game.isGameOver()) { break; } // conceded during "mulligan" prompt
|
||||||
|
|
||||||
game.setAge(GameStage.Play);
|
game.setAge(GameStage.Play);
|
||||||
|
|
||||||
//<THIS CODE WILL WORK WITH PHASE = NULL>
|
//<THIS CODE WILL WORK WITH PHASE = NULL>
|
||||||
if (game.getType() == GameType.Planechase) {
|
if (gameType == GameType.Planechase) {
|
||||||
first.initPlane();
|
first.initPlane();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1515,7 +1516,7 @@ public class GameAction {
|
|||||||
Player goesFirst = null;
|
Player goesFirst = null;
|
||||||
|
|
||||||
// 904.6: in Archenemy games the Archenemy goes first
|
// 904.6: in Archenemy games the Archenemy goes first
|
||||||
if (game != null && game.getType() == GameType.Archenemy) {
|
if (game != null && game.getRules().getGameType() == GameType.Archenemy) {
|
||||||
for (Player p : game.getPlayers()) {
|
for (Player p : game.getPlayers()) {
|
||||||
if (p.isArchenemy()) {
|
if (p.isArchenemy()) {
|
||||||
return p;
|
return p;
|
||||||
|
|||||||
67
forge-game/src/main/java/forge/game/GameRules.java
Normal file
67
forge-game/src/main/java/forge/game/GameRules.java
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
package forge.game;
|
||||||
|
|
||||||
|
public class GameRules {
|
||||||
|
private GameType gameType;
|
||||||
|
private boolean manaBurn;
|
||||||
|
private int poisonCountersToLose = 10; // is commonly 10, but turns into 15 for 2HG
|
||||||
|
private int gamesPerMatch = 3;
|
||||||
|
private int gamesToWinMatch = 2;
|
||||||
|
private boolean playForAnte = false;
|
||||||
|
|
||||||
|
public GameRules(GameType type) {
|
||||||
|
this.gameType = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GameType getGameType() {
|
||||||
|
return gameType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the manaBurn
|
||||||
|
*/
|
||||||
|
public boolean hasManaBurn() {
|
||||||
|
return manaBurn;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param manaBurn the manaBurn to set
|
||||||
|
*/
|
||||||
|
public void setManaBurn(boolean manaBurn) {
|
||||||
|
this.manaBurn = manaBurn;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @return the poisonCountersToLose
|
||||||
|
*/
|
||||||
|
public int getPoisonCountersToLose() {
|
||||||
|
return poisonCountersToLose;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param poisonCountersToLose the poisonCountersToLose to set
|
||||||
|
*/
|
||||||
|
public void setPoisonCountersToLose(int amount) {
|
||||||
|
this.poisonCountersToLose = amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getGamesPerMatch() {
|
||||||
|
return gamesPerMatch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGamesPerMatch(int gamesPerMatch) {
|
||||||
|
this.gamesPerMatch = gamesPerMatch;
|
||||||
|
this.gamesToWinMatch = (int)Math.ceil((gamesPerMatch+1)/2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean useAnte() {
|
||||||
|
return playForAnte;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPlayForAnte(boolean useAnte) {
|
||||||
|
this.playForAnte = useAnte;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getGamesToWinMatch() {
|
||||||
|
return gamesToWinMatch;
|
||||||
|
}
|
||||||
|
|
||||||
|
// it's a preference, not rule... but I could hardly find a better place for it
|
||||||
|
public boolean canCloneUseTargetsImage;
|
||||||
|
}
|
||||||
@@ -33,29 +33,19 @@ import forge.util.MyRandom;
|
|||||||
|
|
||||||
public class Match {
|
public class Match {
|
||||||
private final List<RegisteredPlayer> players;
|
private final List<RegisteredPlayer> players;
|
||||||
private final GameType gameType;
|
private final GameRules rules;
|
||||||
|
|
||||||
private int gamesPerMatch = 3;
|
|
||||||
private int gamesToWinMatch = 2;
|
|
||||||
|
|
||||||
private final boolean useAnte;
|
|
||||||
|
|
||||||
private final List<GameOutcome> gamesPlayed = new ArrayList<GameOutcome>();
|
private final List<GameOutcome> gamesPlayed = new ArrayList<GameOutcome>();
|
||||||
private final List<GameOutcome> gamesPlayedRo;
|
private final List<GameOutcome> gamesPlayedRo;
|
||||||
|
|
||||||
public Match(GameType type, List<RegisteredPlayer> players0, boolean useAnte) {
|
public Match(GameRules rules, List<RegisteredPlayer> players0) {
|
||||||
this(type, players0, useAnte, 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Match(GameType type, List<RegisteredPlayer> players0, boolean useAnte, int games) {
|
|
||||||
gameType = type;
|
|
||||||
gamesPlayedRo = Collections.unmodifiableList(gamesPlayed);
|
gamesPlayedRo = Collections.unmodifiableList(gamesPlayed);
|
||||||
players = Collections.unmodifiableList(Lists.newArrayList(players0));
|
players = Collections.unmodifiableList(Lists.newArrayList(players0));
|
||||||
|
this.rules = rules;
|
||||||
|
}
|
||||||
|
|
||||||
gamesPerMatch = games;
|
public GameRules getRules() {
|
||||||
gamesToWinMatch = (int)Math.ceil((gamesPerMatch+1)/2);
|
return rules;
|
||||||
|
|
||||||
this.useAnte = useAnte;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -67,15 +57,6 @@ public class Match {
|
|||||||
return this.gamesPlayedRo;
|
return this.gamesPlayedRo;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return int */
|
|
||||||
public int getGamesPerMatch() {
|
|
||||||
return gamesPerMatch;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @return int */
|
|
||||||
public int getGamesToWinMatch() {
|
|
||||||
return gamesToWinMatch;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addGamePlayed(Game finished) {
|
public void addGamePlayed(Game finished) {
|
||||||
if (!finished.isGameOver()) {
|
if (!finished.isGameOver()) {
|
||||||
@@ -88,7 +69,7 @@ public class Match {
|
|||||||
* TODO: Write javadoc for this method.
|
* TODO: Write javadoc for this method.
|
||||||
*/
|
*/
|
||||||
public Game createGame() {
|
public Game createGame() {
|
||||||
Game game = new Game(players, gameType, this);
|
Game game = new Game(players, rules, this);
|
||||||
return game;
|
return game;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,7 +84,7 @@ public class Match {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
prepareAllZones(game);
|
prepareAllZones(game);
|
||||||
if (useAnte) { // Deciding which cards go to ante
|
if (rules.useAnte()) { // Deciding which cards go to ante
|
||||||
Multimap<Player, Card> list = game.chooseCardsForAnte();
|
Multimap<Player, Card> list = game.chooseCardsForAnte();
|
||||||
for (Entry<Player, Card> kv : list.entries()) {
|
for (Entry<Player, Card> kv : list.entries()) {
|
||||||
Player p = kv.getKey();
|
Player p = kv.getKey();
|
||||||
@@ -116,7 +97,7 @@ public class Match {
|
|||||||
GameOutcome lastOutcome = gamesPlayed.isEmpty() ? null : gamesPlayed.get(gamesPlayed.size() - 1);
|
GameOutcome lastOutcome = gamesPlayed.isEmpty() ? null : gamesPlayed.get(gamesPlayed.size() - 1);
|
||||||
game.getAction().startGame(lastOutcome);
|
game.getAction().startGame(lastOutcome);
|
||||||
|
|
||||||
if (useAnte) {
|
if (rules.useAnte()) {
|
||||||
executeAnte(game);
|
executeAnte(game);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,15 +122,6 @@ public class Match {
|
|||||||
gamesPlayed.remove(gamesPlayed.size() - 1);
|
gamesPlayed.remove(gamesPlayed.size() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this method.
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public GameType getGameType() {
|
|
||||||
return gameType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Iterable<GameOutcome> getOutcomes() {
|
public Iterable<GameOutcome> getOutcomes() {
|
||||||
return gamesPlayedRo;
|
return gamesPlayedRo;
|
||||||
}
|
}
|
||||||
@@ -174,11 +146,11 @@ public class Match {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int score : victories) {
|
for (int score : victories) {
|
||||||
if (score >= gamesToWinMatch) {
|
if (score >= rules.getGamesToWinMatch()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return gamesPlayed.size() >= gamesPerMatch;
|
return gamesPlayed.size() >= rules.getGamesPerMatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -204,7 +176,7 @@ public class Match {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public boolean isWonBy(LobbyPlayer questPlayer) {
|
public boolean isWonBy(LobbyPlayer questPlayer) {
|
||||||
return getGamesWonBy(questPlayer) >= gamesToWinMatch;
|
return getGamesWonBy(questPlayer) >= rules.getGamesToWinMatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<RegisteredPlayer> getPlayers() {
|
public List<RegisteredPlayer> getPlayers() {
|
||||||
@@ -261,9 +233,8 @@ public class Match {
|
|||||||
Multimap<Player, PaperCard> rAICards = HashMultimap.create();
|
Multimap<Player, PaperCard> rAICards = HashMultimap.create();
|
||||||
Multimap<Player, PaperCard> removedAnteCards = ArrayListMultimap.create();
|
Multimap<Player, PaperCard> removedAnteCards = ArrayListMultimap.create();
|
||||||
|
|
||||||
GameType gameType = game.getType();
|
|
||||||
boolean isFirstGame = game.getMatch().getPlayedGames().isEmpty();
|
boolean isFirstGame = game.getMatch().getPlayedGames().isEmpty();
|
||||||
boolean canSideBoard = !isFirstGame && gameType.isSideboardingAllowed();
|
boolean canSideBoard = !isFirstGame && rules.getGameType().isSideboardingAllowed();
|
||||||
|
|
||||||
final List<RegisteredPlayer> playersConditions = game.getMatch().getPlayers();
|
final List<RegisteredPlayer> playersConditions = game.getMatch().getPlayers();
|
||||||
for (int i = 0; i < playersConditions.size(); i++) {
|
for (int i = 0; i < playersConditions.size(); i++) {
|
||||||
@@ -274,7 +245,7 @@ public class Match {
|
|||||||
|
|
||||||
if (canSideBoard) {
|
if (canSideBoard) {
|
||||||
Deck toChange = psc.getDeck();
|
Deck toChange = psc.getDeck();
|
||||||
List<PaperCard> newMain = player.getController().sideboard(toChange, gameType);
|
List<PaperCard> newMain = player.getController().sideboard(toChange, rules.getGameType());
|
||||||
if (null != newMain) {
|
if (null != newMain) {
|
||||||
CardPool allCards = new CardPool();
|
CardPool allCards = new CardPool();
|
||||||
allCards.addAll(toChange.get(DeckSection.Main));
|
allCards.addAll(toChange.get(DeckSection.Main));
|
||||||
@@ -292,7 +263,7 @@ public class Match {
|
|||||||
Deck myDeck = psc.getDeck();
|
Deck myDeck = psc.getDeck();
|
||||||
|
|
||||||
Set<PaperCard> myRemovedAnteCards = null;
|
Set<PaperCard> myRemovedAnteCards = null;
|
||||||
if (!useAnte) {
|
if (!rules.useAnte()) {
|
||||||
myRemovedAnteCards = getRemovedAnteCards(myDeck);
|
myRemovedAnteCards = getRemovedAnteCards(myDeck);
|
||||||
for (PaperCard cp: myRemovedAnteCards) {
|
for (PaperCard cp: myRemovedAnteCards) {
|
||||||
for (Entry<DeckSection, CardPool> ds : myDeck) {
|
for (Entry<DeckSection, CardPool> ds : myDeck) {
|
||||||
@@ -321,8 +292,7 @@ public class Match {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isLimitedGame = GameType.Quest == game.getType() || GameType.Sealed == game.getType() || GameType.Draft == game.getType();
|
if (!rAICards.isEmpty() && !rules.getGameType().isCardpoolLimited()) {
|
||||||
if (!rAICards.isEmpty() && !isLimitedGame) {
|
|
||||||
game.getAction().revealAnte("AI can't play these cards well", rAICards);
|
game.getAction().revealAnte("AI can't play these cards well", rAICards);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,7 +375,7 @@ public class Match {
|
|||||||
outcome.anteResult.put(fromGame, GameOutcome.AnteResult.won(losses));
|
outcome.anteResult.put(fromGame, GameOutcome.AnteResult.won(losses));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gameType.canAddWonCardsMidgame()) {
|
if (rules.getGameType().canAddWonCardsMidgame()) {
|
||||||
// But only certain game types lets you swap midgame
|
// But only certain game types lets you swap midgame
|
||||||
List<PaperCard> chosen = fromGame.getController().chooseCardsYouWonToAddToDeck(losses);
|
List<PaperCard> chosen = fromGame.getController().chooseCardsYouWonToAddToDeck(losses);
|
||||||
if (null != chosen) {
|
if (null != chosen) {
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import forge.Command;
|
import forge.Command;
|
||||||
import forge.Dependencies;
|
|
||||||
import forge.card.CardCharacteristicName;
|
import forge.card.CardCharacteristicName;
|
||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
import forge.game.ability.AbilityUtils;
|
import forge.game.ability.AbilityUtils;
|
||||||
@@ -84,7 +83,7 @@ public class CloneEffect extends SpellAbilityEffect {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// determine the image to be used for the clone
|
// determine the image to be used for the clone
|
||||||
String imageFileName = Dependencies.preferences.getCloneModeSource() ? tgtCard.getImageKey() : cardToCopy.getImageKey();
|
String imageFileName = cardToCopy.getGame().getRules().canCloneUseTargetsImage ? tgtCard.getImageKey() : cardToCopy.getImageKey();
|
||||||
if (sa.hasParam("ImageSource")) { // Allow the image to be stipulated by using a defined card source
|
if (sa.hasParam("ImageSource")) { // Allow the image to be stipulated by using a defined card source
|
||||||
List<Card> cloneImgSources = AbilityUtils.getDefinedCards(host, sa.getParam("ImageSource"), sa);
|
List<Card> cloneImgSources = AbilityUtils.getDefinedCards(host, sa.getParam("ImageSource"), sa);
|
||||||
if (!cloneImgSources.isEmpty()) {
|
if (!cloneImgSources.isEmpty()) {
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ public class CostAddMana extends CostPart {
|
|||||||
Card source = sa.getSourceCard();
|
Card source = sa.getSourceCard();
|
||||||
|
|
||||||
ColorSet cid = null;
|
ColorSet cid = null;
|
||||||
if (ai.getGame().getType() == GameType.Commander) {
|
if (ai.getGame().getRules().getGameType() == GameType.Commander) {
|
||||||
cid = ai.getCommander().getRules().getColorIdentity();
|
cid = ai.getCommander().getRules().getColorIdentity();
|
||||||
}
|
}
|
||||||
ArrayList<Mana> manaProduced = new ArrayList<Mana>();
|
ArrayList<Mana> manaProduced = new ArrayList<Mana>();
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ import org.apache.commons.lang3.time.StopWatch;
|
|||||||
import com.google.common.collect.ArrayListMultimap;
|
import com.google.common.collect.ArrayListMultimap;
|
||||||
import com.google.common.collect.Multimap;
|
import com.google.common.collect.Multimap;
|
||||||
|
|
||||||
import forge.Dependencies;
|
|
||||||
import forge.card.mana.ManaCost;
|
import forge.card.mana.ManaCost;
|
||||||
import forge.game.GameEntity;
|
import forge.game.GameEntity;
|
||||||
import forge.game.GameStage;
|
import forge.game.GameStage;
|
||||||
@@ -434,14 +433,14 @@ public class PhaseHandler implements java.io.Serializable {
|
|||||||
|
|
||||||
for (Player p : game.getPlayers()) {
|
for (Player p : game.getPlayers()) {
|
||||||
int burn = p.getManaPool().clearPool(true);
|
int burn = p.getManaPool().clearPool(true);
|
||||||
boolean dealDamage = Dependencies.preferences.isManaBurnEnabled();
|
|
||||||
|
|
||||||
if (dealDamage) {
|
boolean manaBurns = game.getRules().hasManaBurn();
|
||||||
|
if (manaBurns) {
|
||||||
p.loseLife(burn);
|
p.loseLife(burn);
|
||||||
}
|
}
|
||||||
// Play the Mana Burn sound
|
// Play the Mana Burn sound
|
||||||
if (burn > 0) {
|
if (burn > 0) {
|
||||||
game.fireEvent(new GameEventManaBurn(burn, dealDamage));
|
game.fireEvent(new GameEventManaBurn(burn, manaBurns));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -752,7 +751,7 @@ public class PhaseHandler implements java.io.Serializable {
|
|||||||
|
|
||||||
Player next = getNextActivePlayer();
|
Player next = getNextActivePlayer();
|
||||||
|
|
||||||
if (game.getType() == GameType.Planechase) {
|
if (game.getRules().getGameType() == GameType.Planechase) {
|
||||||
for (Card p :game.getActivePlanes()) {
|
for (Card p :game.getActivePlanes()) {
|
||||||
if (p != null) {
|
if (p != null) {
|
||||||
p.setController(next, 0);
|
p.setController(next, 0);
|
||||||
|
|||||||
@@ -2170,7 +2170,7 @@ public class Player extends GameEntity implements Comparable<Player> {
|
|||||||
return this.loseConditionMet(GameLossReason.Poisoned, null);
|
return this.loseConditionMet(GameLossReason.Poisoned, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(game.getType() == GameType.Commander)
|
if(game.getRules().getGameType() == GameType.Commander)
|
||||||
{
|
{
|
||||||
Map<Card,Integer> cmdDmg = getCommanderDamage();
|
Map<Card,Integer> cmdDmg = getCommanderDamage();
|
||||||
for(Card c : cmdDmg.keySet())
|
for(Card c : cmdDmg.keySet())
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ public class AbilityManaPart implements java.io.Serializable {
|
|||||||
}
|
}
|
||||||
ColorSet CID = null;
|
ColorSet CID = null;
|
||||||
|
|
||||||
if (player.getGame().getType() == GameType.Commander) {
|
if (player.getGame().getRules().getGameType() == GameType.Commander) {
|
||||||
CID = player.getCommander().getRules().getColorIdentity();
|
CID = player.getCommander().getRules().getColorIdentity();
|
||||||
}
|
}
|
||||||
//clear lastProduced
|
//clear lastProduced
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
package forge;
|
|
||||||
|
|
||||||
import forge.properties.ForgePreferences.FPref;
|
|
||||||
|
|
||||||
public class PreferencesProvider implements Dependencies.PreferencesMethods {
|
|
||||||
@Override
|
|
||||||
public boolean getCloneModeSource() {
|
|
||||||
return Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isManaBurnEnabled() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_MANABURN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -42,6 +42,7 @@ import forge.ImageCache;
|
|||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.control.KeyboardShortcuts.Shortcut;
|
import forge.control.KeyboardShortcuts.Shortcut;
|
||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
|
import forge.game.GameRules;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
import forge.game.Match;
|
import forge.game.Match;
|
||||||
import forge.game.card.Card;
|
import forge.game.card.Card;
|
||||||
@@ -452,7 +453,7 @@ public enum FControl implements KeyEventDispatcher {
|
|||||||
private final FControlGameEventHandler fcVisitor = new FControlGameEventHandler(this);
|
private final FControlGameEventHandler fcVisitor = new FControlGameEventHandler(this);
|
||||||
private final FControlGamePlayback playbackControl = new FControlGamePlayback(this);
|
private final FControlGamePlayback playbackControl = new FControlGamePlayback(this);
|
||||||
private void attachToGame(Game game0) {
|
private void attachToGame(Game game0) {
|
||||||
if (game0.getType() == GameType.Quest) {
|
if (game0.getRules().getGameType() == GameType.Quest) {
|
||||||
QuestController qc = Singletons.getModel().getQuest();
|
QuestController qc = Singletons.getModel().getQuest();
|
||||||
// Reset new list when the Match round starts, not when each game starts
|
// Reset new list when the Match round starts, not when each game starts
|
||||||
if (game0.getMatch().getPlayedGames().isEmpty()) {
|
if (game0.getMatch().getPlayedGames().isEmpty()) {
|
||||||
@@ -557,14 +558,17 @@ public enum FControl implements KeyEventDispatcher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startMatch(GameType gameType, List<RegisteredPlayer> starter) {
|
public void startMatch(GameType gameType, List<RegisteredPlayer> players) {
|
||||||
boolean useRandomFoil = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_RANDOM_FOIL);
|
boolean useRandomFoil = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_RANDOM_FOIL);
|
||||||
for(RegisteredPlayer rp : starter) {
|
for(RegisteredPlayer rp : players) {
|
||||||
rp.setRandomFoil(useRandomFoil);
|
rp.setRandomFoil(useRandomFoil);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean useAnte = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_ANTE);
|
GameRules rules = new GameRules(gameType);
|
||||||
final Match mc = new Match(gameType, starter, useAnte);
|
rules.setPlayForAnte(Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_ANTE));
|
||||||
|
rules.setManaBurn(Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_MANABURN));
|
||||||
|
rules.canCloneUseTargetsImage = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE);
|
||||||
|
final Match mc = new Match(rules, players);
|
||||||
SOverlayUtils.startGameOverlay();
|
SOverlayUtils.startGameOverlay();
|
||||||
SOverlayUtils.showOverlay();
|
SOverlayUtils.showOverlay();
|
||||||
FThreads.invokeInEdtLater(new Runnable(){
|
FThreads.invokeInEdtLater(new Runnable(){
|
||||||
|
|||||||
@@ -445,7 +445,7 @@ public final class GuiDisplayUtil {
|
|||||||
|
|
||||||
public static void devModePlaneswalkTo() {
|
public static void devModePlaneswalkTo() {
|
||||||
final Game game = getGame();
|
final Game game = getGame();
|
||||||
if (game.getMatch().getGameType() != GameType.Planechase) { return; }
|
if (game.getRules().getGameType() != GameType.Planechase) { return; }
|
||||||
final Player p = game.getPhaseHandler().getPlayerTurn();
|
final Player p = game.getPhaseHandler().getPlayerTurn();
|
||||||
|
|
||||||
final List<PaperCard> allPlanars = new ArrayList<PaperCard>();
|
final List<PaperCard> allPlanars = new ArrayList<PaperCard>();
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import forge.FThreads;
|
|||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.card.CardEdition;
|
import forge.card.CardEdition;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
|
import forge.game.GameRules;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
import forge.game.Match;
|
import forge.game.Match;
|
||||||
import forge.game.player.LobbyPlayer;
|
import forge.game.player.LobbyPlayer;
|
||||||
@@ -456,7 +457,12 @@ public class SSubmenuQuestUtil {
|
|||||||
boolean useAnte = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_ANTE);
|
boolean useAnte = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_ANTE);
|
||||||
if(forceAnte != null)
|
if(forceAnte != null)
|
||||||
useAnte = forceAnte.booleanValue();
|
useAnte = forceAnte.booleanValue();
|
||||||
final Match mc = new Match(GameType.Quest, starter, useAnte, qData.getCharmState() ? 5 : 3);
|
GameRules rules = new GameRules(GameType.Quest);
|
||||||
|
rules.setPlayForAnte(useAnte);
|
||||||
|
rules.setGamesPerMatch(qData.getCharmState() ? 5 : 3);
|
||||||
|
rules.setManaBurn(Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_MANABURN));
|
||||||
|
rules.canCloneUseTargetsImage = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE);
|
||||||
|
final Match mc = new Match(rules, starter);
|
||||||
FThreads.invokeInEdtLater(new Runnable(){
|
FThreads.invokeInEdtLater(new Runnable(){
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ public enum VMatchUI implements IVTopLevelUI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Singletons.getControl().getObservedGame().getType().isCommandZoneNeeded()) {
|
if (Singletons.getControl().getObservedGame().getRules().getGameType().isCommandZoneNeeded()) {
|
||||||
// Add extra players alternatively to existing user/AI field panels.
|
// Add extra players alternatively to existing user/AI field panels.
|
||||||
for (int i = 2; i < lstCommands.size(); i++) {
|
for (int i = 2; i < lstCommands.size(); i++) {
|
||||||
// If already in layout, no need to add again.
|
// If already in layout, no need to add again.
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ public class ViewWinLose {
|
|||||||
// Control of the win/lose is handled differently for various game
|
// Control of the win/lose is handled differently for various game
|
||||||
// modes.
|
// modes.
|
||||||
ControlWinLose control = null;
|
ControlWinLose control = null;
|
||||||
switch (game0.getType()) {
|
switch (game0.getRules().getGameType()) {
|
||||||
case Quest:
|
case Quest:
|
||||||
control = new QuestWinLose(this, game0);
|
control = new QuestWinLose(this, game0);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import javax.swing.JButton;
|
|||||||
import forge.Command;
|
import forge.Command;
|
||||||
import forge.FThreads;
|
import forge.FThreads;
|
||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
|
import forge.game.GameRules;
|
||||||
import forge.game.Match;
|
import forge.game.Match;
|
||||||
import forge.gui.InputProxy;
|
import forge.gui.InputProxy;
|
||||||
import forge.gui.framework.ICDoc;
|
import forge.gui.framework.ICDoc;
|
||||||
@@ -120,9 +121,10 @@ public enum CPrompt implements ICDoc {
|
|||||||
public void updateText(Game game) {
|
public void updateText(Game game) {
|
||||||
FThreads.assertExecutedByEdt(true);
|
FThreads.assertExecutedByEdt(true);
|
||||||
final Match match = game.getMatch();
|
final Match match = game.getMatch();
|
||||||
final String text = String.format("T:%d G:%d/%d [%s]", game.getPhaseHandler().getTurn(), match.getPlayedGames().size() + 1, match.getGamesPerMatch(), match.getGameType());
|
final GameRules rules = game.getRules();
|
||||||
|
final String text = String.format("T:%d G:%d/%d [%s]", game.getPhaseHandler().getTurn(), match.getPlayedGames().size() + 1, rules.getGamesPerMatch(), rules.getGameType());
|
||||||
view.getLblGames().setText(text);
|
view.getLblGames().setText(text);
|
||||||
view.getLblGames().setToolTipText(String.format("%s: Game #%d of %d, turn %d", match.getGameType(), match.getPlayedGames().size() + 1, match.getGamesPerMatch(), game.getPhaseHandler().getTurn()));
|
view.getLblGames().setToolTipText(String.format("%s: Game #%d of %d, turn %d", rules.getGameType(), match.getPlayedGames().size() + 1, rules.getGamesPerMatch(), game.getPhaseHandler().getTurn()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ public enum VPlayers implements IVDoc<CPlayers> {
|
|||||||
}
|
}
|
||||||
temp[6].setText(sb.toString());
|
temp[6].setText(sb.toString());
|
||||||
}
|
}
|
||||||
if(p0.getGame().getType() == GameType.Commander) {
|
if(p0.getGame().getRules().getGameType() == GameType.Commander) {
|
||||||
temp[7].setText(CardFactoryUtil.getCommanderInfo(p0));
|
temp[7].setText(CardFactoryUtil.getCommanderInfo(p0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import forge.Singletons;
|
|||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
import forge.game.GameLogEntry;
|
import forge.game.GameLogEntry;
|
||||||
|
import forge.game.GameRules;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
import forge.game.Match;
|
import forge.game.Match;
|
||||||
import forge.game.player.LobbyPlayer;
|
import forge.game.player.LobbyPlayer;
|
||||||
@@ -88,8 +89,8 @@ public enum FServer {
|
|||||||
List<RegisteredPlayer> pp = new ArrayList<RegisteredPlayer>();
|
List<RegisteredPlayer> pp = new ArrayList<RegisteredPlayer>();
|
||||||
pp.add(new RegisteredPlayer(d1).setPlayer(FServer.instance.getLobby().getAiPlayer("Ai-" + d1.getName())));
|
pp.add(new RegisteredPlayer(d1).setPlayer(FServer.instance.getLobby().getAiPlayer("Ai-" + d1.getName())));
|
||||||
pp.add(new RegisteredPlayer(d2).setPlayer(FServer.instance.getLobby().getAiPlayer("Ai_" + d2.getName())));
|
pp.add(new RegisteredPlayer(d2).setPlayer(FServer.instance.getLobby().getAiPlayer("Ai_" + d2.getName())));
|
||||||
|
GameRules rules = new GameRules(GameType.Constructed);
|
||||||
Match mc = new Match(GameType.Constructed, pp, false);
|
Match mc = new Match(rules, pp);
|
||||||
for(int iGame = 0; iGame < nGames; iGame++)
|
for(int iGame = 0; iGame < nGames; iGame++)
|
||||||
simulateSingleMatch(mc, iGame);
|
simulateSingleMatch(mc, iGame);
|
||||||
System.out.flush();
|
System.out.flush();
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
*/
|
*/
|
||||||
package forge.view;
|
package forge.view;
|
||||||
|
|
||||||
import forge.PreferencesProvider;
|
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.net.FServer;
|
import forge.net.FServer;
|
||||||
|
|
||||||
@@ -35,8 +34,6 @@ public final class Main {
|
|||||||
//Turn off the Java 2D system's use of Direct3D to improve rendering speed (particularly when Full Screen)
|
//Turn off the Java 2D system's use of Direct3D to improve rendering speed (particularly when Full Screen)
|
||||||
System.setProperty("sun.java2d.d3d", "false");
|
System.setProperty("sun.java2d.d3d", "false");
|
||||||
|
|
||||||
forge.Dependencies.preferences = new PreferencesProvider();
|
|
||||||
|
|
||||||
// Start splash screen first, then data models, then controller.
|
// Start splash screen first, then data models, then controller.
|
||||||
if (args.length == 0) {
|
if (args.length == 0) {
|
||||||
Singletons.initializeOnce(true);
|
Singletons.initializeOnce(true);
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import forge.game.GameLog;
|
|||||||
import forge.game.GameLogEntry;
|
import forge.game.GameLogEntry;
|
||||||
import forge.game.GameLogEntryType;
|
import forge.game.GameLogEntryType;
|
||||||
import forge.game.GameLogFormatter;
|
import forge.game.GameLogFormatter;
|
||||||
|
import forge.game.GameRules;
|
||||||
import forge.game.GameStage;
|
import forge.game.GameStage;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
import forge.game.Match;
|
import forge.game.Match;
|
||||||
@@ -69,8 +70,10 @@ public class GameWrapper {
|
|||||||
registeredPlayers.add( registeredPlayer );
|
registeredPlayers.add( registeredPlayer );
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean an = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_ANTE);
|
GameRules rules = new GameRules(GameType.Constructed);
|
||||||
Match match = new Match( GameType.Constructed, registeredPlayers, an);
|
rules.setPlayForAnte(Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_ANTE));
|
||||||
|
rules.setManaBurn(Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_MANABURN));
|
||||||
|
Match match = new Match(rules, registeredPlayers);
|
||||||
game = match.createGame();
|
game = match.createGame();
|
||||||
game.subscribeToEvents( new GameLogFormatter( gameLog ) );
|
game.subscribeToEvents( new GameLogFormatter( gameLog ) );
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user