diff --git a/.gitattributes b/.gitattributes index 4a7aabeb3f5..80a6f8a64b7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16907,6 +16907,7 @@ forge-gui/src/main/java/forge/achievement/Overkill.java -text forge-gui/src/main/java/forge/achievement/PlaneswalkerAchievements.java -text forge-gui/src/main/java/forge/achievement/Poisoned.java -text forge-gui/src/main/java/forge/achievement/QuestAchievements.java -text +forge-gui/src/main/java/forge/achievement/RagsToRiches.java -text forge-gui/src/main/java/forge/achievement/SealedAchievements.java -text forge-gui/src/main/java/forge/achievement/TotalGameWins.java -text forge-gui/src/main/java/forge/achievement/TotalMatchWins.java -text diff --git a/forge-game/src/main/java/forge/game/AchievementTracker.java b/forge-game/src/main/java/forge/game/AchievementTracker.java index 28abe557c4a..2b8c625dcf8 100644 --- a/forge-game/src/main/java/forge/game/AchievementTracker.java +++ b/forge-game/src/main/java/forge/game/AchievementTracker.java @@ -5,4 +5,5 @@ import java.util.HashSet; //class for storing information during a game that is used at the end of the game to determine achievements public class AchievementTracker { public final HashSet activatedUltimates = new HashSet(); + public int mulliganTo = 7; } diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 6afa8c07da8..ed2e0a3f589 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -88,7 +88,6 @@ public class Game implements IGameStateObject { private final ReplacementHandler replacementHandler = new ReplacementHandler(this); private final EventBus events = new EventBus("game events"); private final GameLog gameLog = new GameLog(); - private final AchievementTracker achievementTracker = new AchievementTracker(); private final Zone stackZone = new Zone(ZoneType.Stack, this); @@ -333,15 +332,6 @@ public class Game implements IGameStateObject { return gameLog; } - /** - * Gets the achievement tracker - * - * @return the achievement tracker - */ - public final AchievementTracker getAchievementTracker() { - return achievementTracker; - } - /** * Gets the stack zone. * diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index f42c659f8e4..bbcc1503e7a 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -1641,8 +1641,9 @@ public class GameAction { Player p = whoCanMulligan.get(i); List toMulligan = p.canMulligan() ? p.getController().getCardsToMulligan(isCommander, firstPlayer) : null; - if (game.isGameOver()) // conceded on mulligan prompt + if (game.isGameOver()) { // conceded on mulligan prompt return; + } if (toMulligan != null && !toMulligan.isEmpty()) { if (!isCommander) { diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 4331ae95aa8..978580bb5e9 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -190,6 +190,12 @@ public class Player extends GameEntity implements Comparable, IIdentifia private int numManaConversion = 0; + private final AchievementTracker achievementTracker = new AchievementTracker(); + + public final AchievementTracker getAchievementTracker() { + return achievementTracker; + } + public final PlayerOutcome getOutcome() { return stats.getOutcome(); } @@ -3351,6 +3357,7 @@ public class Player extends GameEntity implements Comparable, IIdentifia final int newHand = getCardsIn(ZoneType.Hand).size(); stats.notifyHasMulliganed(); stats.notifyOpeningHandSize(newHand); + achievementTracker.mulliganTo = newHand; } /** diff --git a/forge-gui/src/main/java/forge/achievement/AchievementCollection.java b/forge-gui/src/main/java/forge/achievement/AchievementCollection.java index 29e6fe1a101..881b3afe7db 100644 --- a/forge-gui/src/main/java/forge/achievement/AchievementCollection.java +++ b/forge-gui/src/main/java/forge/achievement/AchievementCollection.java @@ -89,6 +89,7 @@ public abstract class AchievementCollection implements Iterable { add(new Overkill(-25, -50, -100, -200)); add(new LifeToSpare(20, 40, 80, 160)); add(new Hellbent()); + add(new RagsToRiches()); } protected abstract void addAchievements(); diff --git a/forge-gui/src/main/java/forge/achievement/PlaneswalkerAchievements.java b/forge-gui/src/main/java/forge/achievement/PlaneswalkerAchievements.java index 974899774ac..14353ce447d 100644 --- a/forge-gui/src/main/java/forge/achievement/PlaneswalkerAchievements.java +++ b/forge-gui/src/main/java/forge/achievement/PlaneswalkerAchievements.java @@ -83,7 +83,7 @@ public class PlaneswalkerAchievements extends AchievementCollection { //only call update achievements for any ultimates activated during the game if (player.getOutcome().hasWon()) { boolean needSave = false; - for (String ultimate : player.getGame().getAchievementTracker().activatedUltimates) { + for (String ultimate : player.getAchievementTracker().activatedUltimates) { Achievement achievement = achievements.get(ultimate); if (achievement != null) { achievement.update(gui, player); diff --git a/forge-gui/src/main/java/forge/achievement/RagsToRiches.java b/forge-gui/src/main/java/forge/achievement/RagsToRiches.java new file mode 100644 index 00000000000..0d5f3d0def5 --- /dev/null +++ b/forge-gui/src/main/java/forge/achievement/RagsToRiches.java @@ -0,0 +1,38 @@ +package forge.achievement; + +import forge.game.Game; +import forge.game.player.Player; + +public class RagsToRiches extends Achievement { + private static final int NO_MULLIGAN = 7; + + public RagsToRiches() { + super("RagsToRiches", "Rags to Riches", "Win a game after mulliganing to", + "4 cards", 4, + "3 cards", 3, + "2 cards", 2, + "1 card", 1); + best = NO_MULLIGAN; //initialize best to max value so any amount of mulliganing is smaller + } + + @Override + public boolean needSave() { + return best < NO_MULLIGAN; + } + + @Override + protected int evaluate(Player player, Game game) { + if (player.getOutcome().hasWon() && player.getAchievementTracker().mulliganTo < NO_MULLIGAN) { + return player.getAchievementTracker().mulliganTo; + } + return NO_MULLIGAN; //indicate that player didn't win + } + + @Override + public String getSubTitle() { + if (best < NO_MULLIGAN) { + return "Best: " + best + " cards"; + } + return null; + } +} diff --git a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java index 73a768cb52a..7d413f7bb5f 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java @@ -122,7 +122,7 @@ public class HumanPlaySpellAbility { if (isFree || payment.isFullyPaid()) { //track when planeswalker ultimates are activated if (ability.getRestrictions().isPwAbility() && ability.hasParam("Ultimate") && ability.getActivatingPlayer().getController() instanceof PlayerControllerHuman) { - game.getAchievementTracker().activatedUltimates.add(ability.getHostCard().getName()); + ability.getActivatingPlayer().getAchievementTracker().activatedUltimates.add(ability.getHostCard().getName()); } if (skipStack) {