From 6c95af229ac0ec2e3daa888fb2bd6244b8b8aa19 Mon Sep 17 00:00:00 2001 From: drdev Date: Thu, 9 Oct 2014 00:33:38 +0000 Subject: [PATCH] Support storing commander and commander damage in player view --- .../java/forge/ai/ComputerUtilCombat.java | 11 +- .../java/forge/game/card/CardFactoryUtil.java | 9 +- .../main/java/forge/game/player/Player.java | 25 ++-- .../java/forge/game/player/PlayerView.java | 23 +++- .../trackable/TrackableDeserializer.java | 3 + .../forge/trackable/TrackableProperty.java | 3 +- .../forge/trackable/TrackableSerializer.java | 11 +- .../java/forge/trackable/TrackableTypes.java | 122 +++++++++--------- .../java/forge/achievement/Blackjack.java | 2 +- 9 files changed, 116 insertions(+), 93 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index a2f78199157..e834c79f8f8 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -289,15 +289,14 @@ public class ComputerUtilCombat { public static List getLifeThreateningCommanders(final Player ai, final Combat combat) { List res = new ArrayList(); - - for(Card c : combat.getAttackers()) { - if(c.isCommander()) { - int currentCommanderDamage = ai.getCommanderDamage().containsKey(c) ? ai.getCommanderDamage().get(c) : 0; - if (damageIfUnblocked(c, ai, combat, false) + currentCommanderDamage >= 21) + for (Card c : combat.getAttackers()) { + if (c.isCommander()) { + int currentCommanderDamage = ai.getCommanderDamage(c); + if (damageIfUnblocked(c, ai, combat, false) + currentCommanderDamage >= 21) { res.add(c); + } } } - return res; } diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 872e0f2d8b8..cb7a208d4a1 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2114,13 +2114,12 @@ public class CardFactoryUtil { else { text = "Commander Damage to " + p.getName() + ": "; } - - final Map map = p.getCommanderDamage(); - if (map.containsKey(originPlayer.getCommander())) { - sb.append(text + map.get(originPlayer.getCommander()) + "\r\n"); + + int damage = p.getCommanderDamage(originPlayer.getCommander()); + if (damage > 0) { + sb.append(text + damage + "\r\n"); } } - return sb.toString(); } 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 9e3aafceec8..41ceee83dd1 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -78,7 +78,7 @@ public class Player extends GameEntity implements Comparable { ZoneType.Library, ZoneType.Graveyard, ZoneType.Hand, ZoneType.Exile, ZoneType.Command, ZoneType.Ante, ZoneType.Sideboard, ZoneType.PlanarDeck, ZoneType.SchemeDeck)); - private final Map commanderDamage = new HashMap(); + private final Map commanderDamage = new HashMap(); private int poisonCounters = 0; private int life = 20; @@ -496,12 +496,8 @@ public class Player extends GameEntity implements Comparable { } if (source.isCommander() && isCombat) { - if (!commanderDamage.containsKey(source)) { - commanderDamage.put(source, amount); - } - else { - commanderDamage.put(source,commanderDamage.get(source) + amount); - } + commanderDamage.put(source, getCommanderDamage(source) + amount); + view.updateCommanderDamage(this); } assignedDamage.put(source, amount); @@ -1795,9 +1791,8 @@ public class Player extends GameEntity implements Comparable { } if (game.getRules().hasAppliedVariant(GameType.Commander)) { - Map cmdDmg = getCommanderDamage(); - for (Card c : cmdDmg.keySet()) { - if (cmdDmg.get(c) >= 21) { + for (Entry entry : getCommanderDamage()) { + if (entry.getValue() >= 21) { return loseConditionMet(GameLossReason.CommanderDamage, null); } } @@ -2709,11 +2704,17 @@ public class Player extends GameEntity implements Comparable { return commander; } public void setCommander(Card commander0) { + if (commander == commander0) { return; } commander = commander0; + view.updateCommander(this); } - public Map getCommanderDamage() { - return commanderDamage; + public Iterable> getCommanderDamage() { + return commanderDamage.entrySet(); + } + public int getCommanderDamage(Card commander) { + Integer damage = commanderDamage.get(commander); + return damage == null ? 0 : damage.intValue(); } public boolean isPlayingExtraTurn() { diff --git a/forge-game/src/main/java/forge/game/player/PlayerView.java b/forge-game/src/main/java/forge/game/player/PlayerView.java index 7ef3cbb66b7..ad14db00bf9 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerView.java +++ b/forge-game/src/main/java/forge/game/player/PlayerView.java @@ -1,13 +1,15 @@ package forge.game.player; +import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; import forge.card.MagicColor; import forge.game.GameEntityView; -import forge.game.card.CardFactoryUtil; +import forge.game.card.Card; import forge.game.card.CardView; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; @@ -102,11 +104,22 @@ public class PlayerView extends GameEntityView { set(TrackableProperty.Keywords, ImmutableList.of(p.getKeywords())); } - public String getCommanderInfo() { - return get(TrackableProperty.CommanderInfo); + public CardView getCommander() { + return get(TrackableProperty.Commander); } - void updateCommanderInfo(Player p) { - set(TrackableProperty.CommanderInfo, CardFactoryUtil.getCommanderInfo(p).trim().replace("\r\n", "; ")); + void updateCommander(Player p) { + set(TrackableProperty.Commander, PlayerView.get(p.getCommander())); + } + + public Map getCommanderDamage() { + return get(TrackableProperty.CommanderDamage); + } + void updateCommanderDamage(Player p) { + Map map = new HashMap(); + for (Entry entry : p.getCommanderDamage()) { + map.put(entry.getKey().getId(), entry.getValue()); + } + set(TrackableProperty.CommanderDamage, map); } public Iterable getAnte() { diff --git a/forge-game/src/main/java/forge/trackable/TrackableDeserializer.java b/forge-game/src/main/java/forge/trackable/TrackableDeserializer.java index 7c27eff2486..897d2eaf923 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableDeserializer.java +++ b/forge-game/src/main/java/forge/trackable/TrackableDeserializer.java @@ -19,6 +19,9 @@ public class TrackableDeserializer { public int readInt() { return Integer.parseInt(readString()); } + public byte readByte() { + return Byte.parseByte(readString()); + } public long readLong() { return Long.parseLong(readString()); } diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 0594bae74ad..d7aa9eb9b25 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -79,7 +79,8 @@ public enum TrackableProperty { HasUnlimitedHandSize(TrackableTypes.BooleanType), NumDrawnThisTurn(TrackableTypes.IntegerType), Keywords(TrackableTypes.BooleanType), - CommanderInfo(TrackableTypes.StringType), + Commander(TrackableTypes.CardViewType), + CommanderDamage(TrackableTypes.IntegerMapType), Ante(TrackableTypes.CardViewCollectionType), Battlefield(TrackableTypes.CardViewCollectionType), Command(TrackableTypes.CardViewCollectionType), diff --git a/forge-game/src/main/java/forge/trackable/TrackableSerializer.java b/forge-game/src/main/java/forge/trackable/TrackableSerializer.java index c03b4000fba..167f779dead 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableSerializer.java +++ b/forge-game/src/main/java/forge/trackable/TrackableSerializer.java @@ -23,16 +23,19 @@ public class TrackableSerializer { write(value ? "1" : "0"); } public void write(int value) { - write(String.valueOf(value)); + write(Integer.toString(value)); + } + public void write(byte value) { + write(Byte.toString(value)); } public void write(long value) { - write(String.valueOf(value)); + write(Long.toString(value)); } public void write(float value) { - write(String.valueOf(value)); + write(Float.toString(value)); } public void write(double value) { - write(String.valueOf(value)); + write(Double.toString(value)); } public void write(TrackableIndex index) { write(index.size()); diff --git a/forge-game/src/main/java/forge/trackable/TrackableTypes.java b/forge-game/src/main/java/forge/trackable/TrackableTypes.java index 125bd1deceb..13e74ae75d3 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableTypes.java +++ b/forge-game/src/main/java/forge/trackable/TrackableTypes.java @@ -1,18 +1,13 @@ package forge.trackable; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; -import org.apache.commons.lang3.StringUtils; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; - import forge.card.ColorSet; -import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.game.GameEntityView; import forge.game.card.CardView; @@ -301,8 +296,6 @@ public class TrackableTypes { } }; public static final TrackableType> StringSetType = new TrackableType>() { - private static final char DELIM = (char)6; - @Override public Set getDefaultValue() { return null; @@ -310,22 +303,26 @@ public class TrackableTypes { @Override public Set deserialize(TrackableDeserializer td, Set oldValue) { - String value = td.readString(); - if (value.length() > 0) { - return Sets.newHashSet(StringUtils.split(value, DELIM)); + int size = td.readInt(); + if (size > 0) { + Set set = new HashSet(); + for (int i = 0; i < size; i++) { + set.add(td.readString()); + } + return set; } return null; } @Override public void serialize(TrackableSerializer ts, Set value) { - ts.write(StringUtils.join(value, DELIM)); + ts.write(value.size()); + for (String s : value) { + ts.write(s); + } } }; public static final TrackableType> StringMapType = new TrackableType>() { - private static final char DELIM_1 = (char)6; - private static final char DELIM_2 = (char)7; - @Override public Map getDefaultValue() { return null; @@ -333,13 +330,11 @@ public class TrackableTypes { @Override public Map deserialize(TrackableDeserializer td, Map oldValue) { - String value = td.readString(); - if (value.length() > 0) { - Map map = ImmutableMap.of(); - String[] entries = StringUtils.split(value, DELIM_1); - for (String entry : entries) { - int idx = entry.indexOf(DELIM_2); - map.put(entry.substring(0, idx), entry.substring(idx + 1)); + int size = td.readInt(); + if (size > 0) { + Map map = new HashMap(); + for (int i = 0; i < size; i++) { + map.put(td.readString(), td.readString()); } return map; } @@ -348,20 +343,42 @@ public class TrackableTypes { @Override public void serialize(TrackableSerializer ts, Map value) { - StringBuilder builder = new StringBuilder(); + ts.write(value.size()); for (Entry entry : value.entrySet()) { - if (builder.length() > 0) { - builder.append(DELIM_1); - } - builder.append(entry.getKey() + DELIM_2 + entry.getValue()); + ts.write(entry.getKey()); + ts.write(entry.getValue()); + } + } + }; + public static final TrackableType> IntegerMapType = new TrackableType>() { + @Override + public Map getDefaultValue() { + return null; + } + + @Override + public Map deserialize(TrackableDeserializer td, Map oldValue) { + int size = td.readInt(); + if (size > 0) { + Map map = new HashMap(); + for (int i = 0; i < size; i++) { + map.put(td.readInt(), td.readInt()); + } + return map; + } + return null; + } + + @Override + public void serialize(TrackableSerializer ts, Map value) { + ts.write(value.size()); + for (Entry entry : value.entrySet()) { + ts.write(entry.getKey()); + ts.write(entry.getValue()); } - ts.write(builder.toString()); } }; public static final TrackableType> ManaMapType = new TrackableType>() { - private static final char DELIM_1 = (char)6; - private static final char DELIM_2 = (char)7; - @Override public Map getDefaultValue() { return null; @@ -369,13 +386,11 @@ public class TrackableTypes { @Override public Map deserialize(TrackableDeserializer td, Map oldValue) { - String value = td.readString(); - if (value.length() > 0) { - Map map = Maps.newHashMapWithExpectedSize(MagicColor.NUMBER_OR_COLORS + 1); - String[] entries = StringUtils.split(value, DELIM_1); - for (String entry : entries) { - int idx = entry.indexOf(DELIM_2); - map.put(Byte.valueOf(entry.substring(0, idx)), Integer.valueOf(entry.substring(idx + 1))); + int size = td.readInt(); + if (size > 0) { + Map map = new HashMap(); + for (int i = 0; i < size; i++) { + map.put(td.readByte(), td.readInt()); } return map; } @@ -384,20 +399,14 @@ public class TrackableTypes { @Override public void serialize(TrackableSerializer ts, Map value) { - StringBuilder builder = new StringBuilder(); + ts.write(value.size()); for (Entry entry : value.entrySet()) { - if (builder.length() > 0) { - builder.append(DELIM_1); - } - builder.append(Byte.toString(entry.getKey()) + DELIM_2 + Integer.toString(entry.getValue())); + ts.write(entry.getKey()); + ts.write(entry.getValue()); } - ts.write(builder.toString()); } }; public static final TrackableType> CounterMapType = new TrackableType>() { - private static final char DELIM_1 = (char)6; - private static final char DELIM_2 = (char)7; - @Override public Map getDefaultValue() { return null; @@ -405,13 +414,11 @@ public class TrackableTypes { @Override public Map deserialize(TrackableDeserializer td, Map oldValue) { - String value = td.readString(); - if (value.length() > 0) { + int size = td.readInt(); + if (size > 0) { Map map = new TreeMap(); - String[] entries = StringUtils.split(value, DELIM_1); - for (String entry : entries) { - int idx = entry.indexOf(DELIM_2); - map.put(CounterType.valueOf(entry.substring(0, idx)), Integer.valueOf(entry.substring(idx + 1))); + for (int i = 0; i < size; i++) { + map.put(CounterType.valueOf(td.readString()), td.readInt()); } return map; } @@ -420,14 +427,11 @@ public class TrackableTypes { @Override public void serialize(TrackableSerializer ts, Map value) { - StringBuilder builder = new StringBuilder(); + ts.write(value.size()); for (Entry entry : value.entrySet()) { - if (builder.length() > 0) { - builder.append(DELIM_1); - } - builder.append(entry.getKey().name() + DELIM_2 + Integer.toString(entry.getValue())); + ts.write(entry.getKey().name()); + ts.write(entry.getValue()); } - ts.write(builder.toString()); } }; } diff --git a/forge-gui/src/main/java/forge/achievement/Blackjack.java b/forge-gui/src/main/java/forge/achievement/Blackjack.java index e2df2b2701d..c3dfb9f2e0f 100644 --- a/forge-gui/src/main/java/forge/achievement/Blackjack.java +++ b/forge-gui/src/main/java/forge/achievement/Blackjack.java @@ -20,7 +20,7 @@ public class Blackjack extends Achievement { if (player.getOutcome().hasWon()) { for (Player p : game.getRegisteredPlayers()) { if (p.isOpponentOf(player) && p.getOutcome().lossState == GameLossReason.CommanderDamage) { - Integer damage = p.getCommanderDamage().get(player.getCommander()); + Integer damage = p.getCommanderDamage(player.getCommander()); if (damage != null && damage >= THRESHOLD) { return damage; }