diff --git a/.gitattributes b/.gitattributes index 166a7e46089..7779b268b4c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -264,7 +264,6 @@ forge-game/.settings/org.eclipse.m2e.core.prefs -text forge-game/pom.xml -text forge-game/src/main/java/forge/GameCommand.java svneol=native#text/plain forge-game/src/main/java/forge/ImageKeys.java -text -forge-game/src/main/java/forge/game/AchievementTracker.java -text forge-game/src/main/java/forge/game/CardTraitBase.java -text forge-game/src/main/java/forge/game/Direction.java -text forge-game/src/main/java/forge/game/Game.java -text @@ -542,6 +541,7 @@ forge-game/src/main/java/forge/game/phase/PhaseType.java -text forge-game/src/main/java/forge/game/phase/Untap.java -text forge-game/src/main/java/forge/game/phase/Upkeep.java svneol=native#text/plain forge-game/src/main/java/forge/game/phase/package-info.java svneol=native#text/plain +forge-game/src/main/java/forge/game/player/AchievementTracker.java -text forge-game/src/main/java/forge/game/player/GameLossReason.java -text forge-game/src/main/java/forge/game/player/IGameEntitiesFactory.java -text forge-game/src/main/java/forge/game/player/Player.java svneol=native#text/plain @@ -16897,7 +16897,6 @@ forge-gui/src/main/java/forge/achievement/ArcaneMaster.java -text forge-gui/src/main/java/forge/achievement/Blackjack.java -text forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java -text forge-gui/src/main/java/forge/achievement/ConstructedAchievements.java -text -forge-gui/src/main/java/forge/achievement/DeckChallengeAchievement.java -text forge-gui/src/main/java/forge/achievement/DeckedOut.java -text forge-gui/src/main/java/forge/achievement/Domain.java -text forge-gui/src/main/java/forge/achievement/DraftAchievements.java -text diff --git a/forge-game/src/main/java/forge/game/AchievementTracker.java b/forge-game/src/main/java/forge/game/AchievementTracker.java deleted file mode 100644 index efdeb095e9f..00000000000 --- a/forge-game/src/main/java/forge/game/AchievementTracker.java +++ /dev/null @@ -1,12 +0,0 @@ -package forge.game; - -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; - public int spellsCast = 0; - public int maxStormCount = 0; - public int landsPlayed = 0; -} diff --git a/forge-game/src/main/java/forge/game/ability/SpellApiBased.java b/forge-game/src/main/java/forge/game/ability/SpellApiBased.java index 90c38e6e921..087aa826708 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellApiBased.java +++ b/forge-game/src/main/java/forge/game/ability/SpellApiBased.java @@ -45,9 +45,9 @@ public class SpellApiBased extends Spell { /* (non-Javadoc) * @see forge.card.spellability.SpellAbility#resolve() */ - @Override public void resolve() { effect.resolve(this); + getActivatingPlayer().getAchievementTracker().onSpellResolve(this); } } diff --git a/forge-game/src/main/java/forge/game/player/AchievementTracker.java b/forge-game/src/main/java/forge/game/player/AchievementTracker.java new file mode 100644 index 00000000000..9133603616e --- /dev/null +++ b/forge-game/src/main/java/forge/game/player/AchievementTracker.java @@ -0,0 +1,34 @@ +package forge.game.player; + +import java.util.HashSet; + +import forge.card.MagicColor; +import forge.game.card.Card; +import forge.game.spellability.SpellAbility; + +//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 final HashSet challengesCompleted = new HashSet(); + public int mulliganTo = 7; + public int spellsCast = 0; + public int maxStormCount = 0; + public int landsPlayed = 0; + + public void onSpellAbilityPlayed(SpellAbility sa) { + final Card card = sa.getHostCard(); + if (sa.getRestrictions().isPwAbility() && sa.hasParam("Ultimate")) { + activatedUltimates.add(card.getName()); + } + if (card.determineColor().getColor() == MagicColor.ALL_COLORS) { + challengesCompleted.add("Chromatic"); + } + } + + public void onSpellResolve(SpellAbility spell) { + final Card card = spell.getHostCard(); + if (card.hasKeyword("Epic")) { + challengesCompleted.add("Epic"); + } + } +} diff --git a/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java b/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java index 5d28871a266..89ee82cc2f1 100644 --- a/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java +++ b/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java @@ -1,5 +1,8 @@ package forge.achievement; +import forge.deck.Deck; +import forge.game.Game; +import forge.game.player.Player; import forge.properties.ForgeConstants; public class ChallengeAchievements extends AchievementCollection { @@ -20,5 +23,44 @@ public class ChallengeAchievements extends AchievementCollection { add(new NoSpells()); add(new NoLands()); add(new Domain()); + add("Chromatic", "Chromatic", "Win a game after casting a 5 color spell", "With great color requirements comes great power."); + add("Epic", "Epic", "Win a game after resolving a spell with the Epic keyword", "When it's the last spell you ever cast, you better make it count!"); + } + + private void add(String key0, String displayName0, String description0, String flavorText0) { + add(new ChallengeAchievement(key0, displayName0, description0, flavorText0)); + } + + public static class ChallengeAchievement extends ProgressiveAchievement { + protected ChallengeAchievement(String key0, String displayName0, String description0, String flavorText0) { + super(key0, displayName0, description0, flavorText0); + } + + @Override + protected final String getNoun() { + return "Win"; + } + + @Override + protected boolean eval(Player player, Game game) { + return player.getOutcome().hasWon() && + player.getAchievementTracker().challengesCompleted.contains(getKey()); + } + } + + public static abstract class DeckChallengeAchievement extends ChallengeAchievement { + protected DeckChallengeAchievement(String key0, String displayName0, String condition0, String flavorText0) { + super(key0, displayName0, "Win a game using a deck " + condition0, flavorText0); + } + + @Override + protected final boolean eval(Player player, Game game) { + if (player.getOutcome().hasWon()) { + return eval(player.getRegisteredPlayer().getDeck()); + } + return false; + } + + protected abstract boolean eval(Deck deck); } } diff --git a/forge-gui/src/main/java/forge/achievement/DeckChallengeAchievement.java b/forge-gui/src/main/java/forge/achievement/DeckChallengeAchievement.java deleted file mode 100644 index bd7b3486cee..00000000000 --- a/forge-gui/src/main/java/forge/achievement/DeckChallengeAchievement.java +++ /dev/null @@ -1,26 +0,0 @@ -package forge.achievement; - -import forge.deck.Deck; -import forge.game.Game; -import forge.game.player.Player; - -public abstract class DeckChallengeAchievement extends ProgressiveAchievement { - protected DeckChallengeAchievement(String key0, String displayName0, String condition0, String flavorText0) { - super(key0, displayName0, "Win a game using a deck " + condition0, flavorText0); - } - - @Override - protected String getNoun() { - return "Win"; - } - - @Override - protected final boolean eval(Player player, Game game) { - if (player.getOutcome().hasWon()) { - return eval(player.getRegisteredPlayer().getDeck()); - } - return false; - } - - protected abstract boolean eval(Deck deck); -} diff --git a/forge-gui/src/main/java/forge/achievement/NoCreatures.java b/forge-gui/src/main/java/forge/achievement/NoCreatures.java index de88eb53ab8..520ec2c3c82 100644 --- a/forge-gui/src/main/java/forge/achievement/NoCreatures.java +++ b/forge-gui/src/main/java/forge/achievement/NoCreatures.java @@ -2,6 +2,7 @@ package forge.achievement; import java.util.Map.Entry; +import forge.achievement.ChallengeAchievements.DeckChallengeAchievement; import forge.deck.Deck; import forge.item.PaperCard; diff --git a/forge-gui/src/main/java/forge/achievement/NoLands.java b/forge-gui/src/main/java/forge/achievement/NoLands.java index a73d87abe87..a531189a028 100644 --- a/forge-gui/src/main/java/forge/achievement/NoLands.java +++ b/forge-gui/src/main/java/forge/achievement/NoLands.java @@ -2,6 +2,7 @@ package forge.achievement; import java.util.Map.Entry; +import forge.achievement.ChallengeAchievements.DeckChallengeAchievement; import forge.deck.Deck; import forge.item.PaperCard; diff --git a/forge-gui/src/main/java/forge/achievement/NoSpells.java b/forge-gui/src/main/java/forge/achievement/NoSpells.java index 9ee387597be..ffe4a7dbfe5 100644 --- a/forge-gui/src/main/java/forge/achievement/NoSpells.java +++ b/forge-gui/src/main/java/forge/achievement/NoSpells.java @@ -2,6 +2,7 @@ package forge.achievement; import java.util.Map.Entry; +import forge.achievement.ChallengeAchievements.DeckChallengeAchievement; import forge.card.CardType; import forge.deck.Deck; import forge.item.PaperCard; diff --git a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java index 7d413f7bb5f..aee74690509 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java @@ -121,9 +121,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) { - ability.getActivatingPlayer().getAchievementTracker().activatedUltimates.add(ability.getHostCard().getName()); - } + ability.getActivatingPlayer().getAchievementTracker().onSpellAbilityPlayed(ability); if (skipStack) { AbilityUtils.resolve(ability);