Add support for negative thresholds

This commit is contained in:
drdev
2014-09-16 20:19:45 +00:00
parent cbdc6bd78a
commit fec98e99f9
3 changed files with 66 additions and 43 deletions

View File

@@ -11,8 +11,8 @@ import forge.util.gui.SOptionPane;
public abstract class Achievement { public abstract class Achievement {
private final String displayName, bronzeDesc, silverDesc, goldDesc; private final String displayName, bronzeDesc, silverDesc, goldDesc;
private final int bronzeThreshold, silverThreshold, goldThreshold; private final int bronzeThreshold, silverThreshold, goldThreshold;
private final boolean showBest, showCurrent; private final boolean showBest, showCurrent, checkGreaterThan;
private int best, current; protected int best, current;
public Achievement(String displayName0, public Achievement(String displayName0,
boolean showBest0, boolean showCurrent0, boolean showBest0, boolean showCurrent0,
@@ -28,6 +28,7 @@ public abstract class Achievement {
silverThreshold = silverThreshold0; silverThreshold = silverThreshold0;
goldDesc = goldDesc0; goldDesc = goldDesc0;
goldThreshold = goldThreshold0; goldThreshold = goldThreshold0;
checkGreaterThan = goldThreshold0 > silverThreshold0;
} }
public String getDisplayName() { public String getDisplayName() {
@@ -46,13 +47,22 @@ public abstract class Achievement {
return best; return best;
} }
public boolean earnedGold() { public boolean earnedGold() {
return best >= goldThreshold; if (checkGreaterThan) {
return best >= goldThreshold;
}
return best <= goldThreshold;
} }
public boolean earnedSilver() { public boolean earnedSilver() {
return best >= silverThreshold; if (checkGreaterThan) {
return best >= silverThreshold;
}
return best <= silverThreshold;
} }
public boolean earnedBronze() { public boolean earnedBronze() {
return best >= bronzeThreshold; if (checkGreaterThan) {
return best >= bronzeThreshold;
}
return best <= bronzeThreshold;
} }
protected abstract int evaluate(Player player, Game game, int current); protected abstract int evaluate(Player player, Game game, int current);
@@ -70,43 +80,49 @@ public abstract class Achievement {
public void update(IGuiBase gui, Player player) { public void update(IGuiBase gui, Player player) {
current = evaluate(player, player.getGame(), current); current = evaluate(player, player.getGame(), current);
if (current > best) { if (checkGreaterThan) {
int oldBest = best; if (current <= best) { return; }
best = current; }
else if (current >= best) { return; }
String type = null; boolean hadEarnedGold = earnedGold();
FSkinProp image = null; boolean hadEarnedSilver = earnedSilver();
String desc = null; boolean hadEarnedBronze = earnedBronze();
if (earnedGold()) {
if (oldBest < goldThreshold) { best = current;
type = "Gold";
image = FSkinProp.IMG_GOLD_TROPHY; String type = null;
desc = goldDesc; FSkinProp image = null;
} String desc = null;
if (earnedGold()) {
if (!hadEarnedGold) {
type = "Gold";
image = FSkinProp.IMG_GOLD_TROPHY;
desc = goldDesc;
} }
else if (earnedSilver()) { }
if (oldBest < silverThreshold) { else if (earnedSilver()) {
type = "Silver"; if (!hadEarnedSilver) {
image = FSkinProp.IMG_SILVER_TROPHY; type = "Silver";
desc = silverDesc; image = FSkinProp.IMG_SILVER_TROPHY;
} desc = silverDesc;
} }
else if (earnedBronze()) { }
if (oldBest < bronzeThreshold) { else if (earnedBronze()) {
type = "Bronze"; if (!hadEarnedBronze) {
image = FSkinProp.IMG_BRONZE_TROPHY; type = "Bronze";
desc = bronzeDesc; image = FSkinProp.IMG_BRONZE_TROPHY;
} desc = bronzeDesc;
}
if (type != null) {
SOptionPane.showMessageDialog(gui, "You've earned a " + type + " trophy!\n\n" +
displayName + " - " + desc, "Achievement Earned", image);
} }
} }
if (type != null) {
SOptionPane.showMessageDialog(gui, "You've earned a " + type + " trophy!\n\n" +
displayName + " - " + desc, "Achievement Earned", image);
}
} }
public boolean needSave() { public boolean needSave() {
return best > 0 || current > 0; return best != 0 || current != 0;
} }
public void saveToXml(Element el) { public void saveToXml(Element el) {

View File

@@ -52,7 +52,7 @@ public abstract class AchievementCollection implements Iterable<Achievement> {
add("MatchWinStreak", new MatchWinStreak(10, 25, 50)); add("MatchWinStreak", new MatchWinStreak(10, 25, 50));
add("TotalGameWins", new TotalGameWins(250, 500, 1000)); add("TotalGameWins", new TotalGameWins(250, 500, 1000));
add("TotalMatchWins", new TotalMatchWins(100, 250, 500)); add("TotalMatchWins", new TotalMatchWins(100, 250, 500));
add("Overkill", new Overkill(25, 50, 100)); add("Overkill", new Overkill(-25, -50, -100));
add("LifeToSpare", new LifeToSpare(20, 40, 80)); add("LifeToSpare", new LifeToSpare(20, 40, 80));
add("Hellbent", new Hellbent()); add("Hellbent", new Hellbent());
} }

View File

@@ -1,14 +1,16 @@
package forge.achievement; package forge.achievement;
import org.w3c.dom.Element;
import forge.game.Game; import forge.game.Game;
import forge.game.player.Player; import forge.game.player.Player;
public class Overkill extends Achievement { public class Overkill extends Achievement {
public Overkill(int bronze0, int silver0, int gold0) { public Overkill(int bronze0, int silver0, int gold0) {
super("Overkill", true, false, super("Overkill", true, false,
String.format("Win game with opponent at -%d life or less.", bronze0), bronze0, String.format("Win game with opponent at %d life or less.", bronze0), bronze0,
String.format("Win game with opponent at -%d life or less.", silver0), silver0, String.format("Win game with opponent at %d life or less.", silver0), silver0,
String.format("Win game with opponent at -%d life or less.", gold0), gold0); String.format("Win game with opponent at %d life or less.", gold0), gold0);
} }
@Override @Override
@@ -16,17 +18,22 @@ public class Overkill extends Achievement {
if (player.getOutcome().hasWon()) { if (player.getOutcome().hasWon()) {
Player opponent = getSingleOpponent(player); Player opponent = getSingleOpponent(player);
if (opponent != null && opponent.getLife() < 0) { if (opponent != null && opponent.getLife() < 0) {
return -opponent.getLife(); return opponent.getLife();
} }
} }
return 0; return 0;
} }
@Override @Override
public String getSubTitle() { public void loadFromXml(Element el) {
if (getBest() > 0) { super.loadFromXml(el);
return "Best: -" + getBest() + " life";
//perform conversion to handle data from old format before supporting negative thresholds
if (best > 0) {
best = -best;
}
if (current > 0) {
current = -current;
} }
return null;
} }
} }