From f9b473c8fdb65c5dbfd1c6e3efdef3d114d7ef82 Mon Sep 17 00:00:00 2001 From: elcnesh Date: Tue, 27 Jan 2015 14:28:54 +0000 Subject: [PATCH] - Move changed card colors to the Card rather than CardState - Fix Kusari-Gama --- .../src/main/java/forge/game/GameAction.java | 1 - .../src/main/java/forge/game/card/Card.java | 72 ++++++++++++------- .../main/java/forge/game/card/CardColor.java | 14 ---- .../main/java/forge/game/card/CardState.java | 63 ++++------------ .../main/java/forge/game/card/CardView.java | 2 +- .../main/java/forge/game/player/Player.java | 2 + .../forge/game/trigger/TriggerDamageDone.java | 2 + forge-gui/res/cardsfolder/k/kusari_gama.txt | 7 +- 8 files changed, 68 insertions(+), 95 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index d2c3534c763..c26bc06300e 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -262,7 +262,6 @@ public class GameAction { } if (!c.isToken() && !toBattlefield) { - copied.getCurrentState().resetCardColor(); copied.clearDevoured(); copied.clearDelved(); } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 92e9966a510..c0e008cfe63 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -120,8 +120,9 @@ public class Card extends GameEntity implements Comparable { private final Map mayPlay = Maps.newTreeMap(); // changes by AF animate and continuous static effects - timestamp is the key of maps - private Map changedCardTypes = new ConcurrentSkipListMap(); - private Map changedCardKeywords = new ConcurrentSkipListMap(); + private final Map changedCardTypes = new ConcurrentSkipListMap(); + private final Map changedCardKeywords = new ConcurrentSkipListMap(); + private final SortedMap changedCardColors = new ConcurrentSkipListMap(); // changes that say "replace each instance of one [color,type] by another - timestamp is the key of maps private final CardChangedWords changedTextColors = new CardChangedWords(); @@ -739,7 +740,7 @@ public class Card extends GameEntity implements Comparable { return colorsPaid; } public final void setColorsPaid(final byte s) { - colorsPaid = s; // TODO: Append colors instead of replacing + colorsPaid |= s; } public final int getXManaCostPaid() { @@ -1080,29 +1081,6 @@ public class Card extends GameEntity implements Comparable { return currentState.getManaCost(); } - public final void addColor(final String s, final boolean addToColors, final long timestamp) { - currentState.addColor(s, addToColors, timestamp); - } - - public final void removeColor(final long timestamp) { - currentState.removeColor(timestamp); - } - - public final void setColor(final byte color) { - currentState.setColor(new CardColor(color)); - } - public final void setColor(final String color) { - currentState.setColor(new CardColor(color)); - } - - public final ColorSet determineColor() { - if (isImmutable()) { - return ColorSet.getNullColor(); - } - - return currentState.determineColor(); - } - public final Player getChosenPlayer() { return chosenPlayer; } @@ -2449,6 +2427,41 @@ public class Card extends GameEntity implements Comparable { currentState.getView().updateType(currentState); } + public final void addColor(final String s, final boolean addToColors, final long timestamp) { + changedCardColors.put(timestamp, new CardColor(s, addToColors, timestamp)); + currentState.getView().updateColors(this); + } + + public final void removeColor(final long timestampIn) { + final CardColor removeCol = changedCardColors.remove(timestampIn); + + if (removeCol != null) { + currentState.getView().updateColors(this); + } + } + + public final void setColor(final String color) { + currentState.setColor(color); + currentState.getView().updateColors(this); + } + public final void setColor(final byte color) { + currentState.setColor(color); + currentState.getView().updateColors(this); + } + + public final ColorSet determineColor() { + final Iterable colorList = changedCardColors.values(); + byte colors = currentState.getColor(); + for (final CardColor cc : colorList) { + if (cc.isAdditional()) { + colors |= cc.getColorMask(); + } else { + colors = cc.getColorMask(); + } + } + return ColorSet.fromMask(colors); + } + // values that are printed on card public final int getBaseLoyalty() { return baseLoyalty; @@ -3687,6 +3700,11 @@ public class Card extends GameEntity implements Comparable { if (!getOwner().isValid(valid, sourceController, source)) { return false; } + } else if (property.startsWith("ControlledBy")) { + final String valid = property.substring(13); + if (!getController().isValid(valid, sourceController, source)) { + return false; + } } else if (property.startsWith("OwnerDoesntControl")) { if (getOwner().equals(getController())) { return false; @@ -5588,6 +5606,8 @@ public class Card extends GameEntity implements Comparable { runParams.put("DamageTarget", this); runParams.put("DamageAmount", damageToAdd); runParams.put("IsCombatDamage", isCombat); + // Defending player at the time the damage was dealt + runParams.put("DefendingPlayer", game.getCombat() != null ? game.getCombat().getDefendingPlayerRelatedTo(source) : null); getGame().getTriggerHandler().runTrigger(TriggerType.DamageDone, runParams, false); GameEventCardDamaged.DamageType damageType = DamageType.Normal; diff --git a/forge-game/src/main/java/forge/game/card/CardColor.java b/forge-game/src/main/java/forge/game/card/CardColor.java index 2a06918865e..0b2bf697844 100644 --- a/forge-game/src/main/java/forge/game/card/CardColor.java +++ b/forge-game/src/main/java/forge/game/card/CardColor.java @@ -17,7 +17,6 @@ */ package forge.game.card; -import forge.card.ColorSet; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostParser; @@ -45,23 +44,10 @@ public class CardColor { return this.timestamp; } - CardColor(final String colors) { - this(colors, false, 0L); - } CardColor(final String colors, final boolean addToColors, final long timestamp) { final ManaCost mc = new ManaCost(new ManaCostParser(colors)); this.colorMask = mc.getColorProfile(); this.additional = addToColors; this.timestamp = timestamp; } - - CardColor(final byte mask) { - this.colorMask = mask; - this.additional = false; - this.timestamp = 0; - } - - public final ColorSet toColorSet() { - return ColorSet.fromMask(colorMask); - } } diff --git a/forge-game/src/main/java/forge/game/card/CardState.java b/forge-game/src/main/java/forge/game/card/CardState.java index 52bf88dc358..3c2c2baad42 100644 --- a/forge-game/src/main/java/forge/game/card/CardState.java +++ b/forge-game/src/main/java/forge/game/card/CardState.java @@ -20,21 +20,19 @@ package forge.game.card; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.SortedMap; import java.util.TreeMap; import org.apache.commons.lang3.StringUtils; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; -import com.google.common.collect.Maps; import forge.card.CardEdition; import forge.card.CardRarity; import forge.card.CardType; import forge.card.CardTypeView; -import forge.card.ColorSet; +import forge.card.MagicColor; import forge.card.mana.ManaCost; +import forge.card.mana.ManaCostParser; import forge.game.card.CardView.CardStateView; import forge.game.replacement.ReplacementEffect; import forge.game.spellability.SpellAbility; @@ -47,7 +45,7 @@ public class CardState { private String name = ""; private CardType type = new CardType(); private ManaCost manaCost = ManaCost.NO_COST; - private final SortedMap cardColor = Maps.newTreeMap(); + private byte color = MagicColor.COLORLESS; private int basePower = 0; private int baseToughness = 0; private List intrinsicKeywords = new ArrayList(); @@ -118,52 +116,17 @@ public class CardState { view.updateManaCost(this); } - public final void addColor(final CardColor color) { - cardColor.put(color.getTimestamp(), color); - getView().updateColors(this); + public final byte getColor() { + return color; } - - public final void addColor(final String s, final boolean addToColors, final long timestamp) { - addColor(new CardColor(s, addToColors, timestamp)); + public final void setColor(final String color) { + final ManaCostParser parser = new ManaCostParser(color); + final ManaCost cost = new ManaCost(parser); + setColor(cost.getColorProfile()); } - - public final void removeColor(final long timestampIn) { - final CardColor removeCol = cardColor.remove(timestampIn); - - if (removeCol != null) { - getView().updateColors(this); - } - } - - public final void setColor(final CardColor color) { - setColor(ImmutableMap.of(color.getTimestamp(), color)); - } - private final void setColor(final Map cardColor0) { - cardColor.clear(); - cardColor.putAll(cardColor0); - view.updateColors(this); - } - public final void resetCardColor() { - if (cardColor.isEmpty()) { - return; - } - final Long firstKey = cardColor.firstKey(); - final CardColor first = cardColor.get(firstKey); - cardColor.clear(); - cardColor.put(firstKey, first); - view.updateColors(this); - } - public final ColorSet determineColor() { - final Iterable colorList = cardColor.values(); - byte colors = 0; - for (final CardColor cc : colorList) { - if (cc.isAdditional()) { - colors |= cc.getColorMask(); - } else { - colors = cc.getColorMask(); - } - } - return ColorSet.fromMask(colors); + public final void setColor(final byte color) { + this.color = color; + view.updateColors(card); } public final int getBasePower() { @@ -389,7 +352,7 @@ public class CardState { setName(source.getName()); setType(source.type); setManaCost(source.getManaCost()); - setColor(source.cardColor); + setColor(source.getColor()); setBasePower(source.getBasePower()); setBaseToughness(source.getBaseToughness()); intrinsicKeywords = new ArrayList(source.intrinsicKeywords); diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index ddc24b074ac..fe23b1e5a44 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -770,7 +770,7 @@ public class CardView extends GameEntityView { set(TrackableProperty.Colors, c.determineColor()); } void updateColors(CardState c) { - set(TrackableProperty.Colors, c.determineColor()); + set(TrackableProperty.Colors, c.getColor()); } public String getImageKey(PlayerView viewer) { 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 d4c59b4159a..915c20bde52 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -532,6 +532,8 @@ public class Player extends GameEntity implements Comparable { runParams.put("DamageTarget", this); runParams.put("DamageAmount", amount); runParams.put("IsCombatDamage", isCombat); + // Defending player at the time the damage was dealt + runParams.put("DefendingPlayer", game.getCombat() != null ? game.getCombat().getDefendingPlayerRelatedTo(source) : null); game.getTriggerHandler().runTrigger(TriggerType.DamageDone, runParams, false); game.fireEvent(new GameEventPlayerDamaged(this, source, amount, isCombat, infect)); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java index 53977ff5503..b937bca3886 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java @@ -104,5 +104,7 @@ public class TriggerDamageDone extends Trigger { sa.setTriggeringObject("Source", this.getRunParams().get("DamageSource")); sa.setTriggeringObject("Target", this.getRunParams().get("DamageTarget")); sa.setTriggeringObject("DamageAmount", this.getRunParams().get("DamageAmount")); + // This parameter is here because LKI information related to combat doesn't work properly + sa.setTriggeringObject("DefendingPlayer", this.getRunParams().get("DefendingPlayer")); } } diff --git a/forge-gui/res/cardsfolder/k/kusari_gama.txt b/forge-gui/res/cardsfolder/k/kusari_gama.txt index 81b68a66c1b..918ab250c56 100644 --- a/forge-gui/res/cardsfolder/k/kusari_gama.txt +++ b/forge-gui/res/cardsfolder/k/kusari_gama.txt @@ -5,9 +5,10 @@ K:Equip 3 S:Mode$ Continuous | Affected$ Card.EquippedBy | AddAbility$ GamaPump | Description$ Equipped creature has "{2}: This creature gets +1/+0 until end of turn." SVar:GamaPump:AB$ Pump | Cost$ 2 | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. T:Mode$ DamageDone | ValidSource$ Card.EquippedBy | ValidTarget$ Creature.blocking | Execute$ KusariPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals damage to a blocking creature, CARDNAME deals that much damage to each other creature defending player controls. -SVar:KusariPump:DB$ Pump | Defined$ TriggeredTarget | RememberObjects$ TriggeredTarget | SubAbility$ GamaDamage -SVar:GamaDamage:DB$ DamageAll | NumDmg$ X | References$ X | ValidCards$ Creature.DefenderCtrl+IsNotRemembered | SubAbility$ CleanUp +SVar:KusariPump:DB$ Pump | Defined$ Self | RememberObjects$ TriggeredTarget | SubAbility$ KusariPump2 +SVar:KusariPump2:DB$ Pump | Defined$ Self | RememberObjects$ TriggeredDefendingPlayer | SubAbility$ GamaDamage +SVar:GamaDamage:DB$ DamageAll | NumDmg$ X | References$ X | ValidCards$ Creature.IsNotRemembered+ControlledBy Player.IsRemembered | SubAbility$ CleanUp SVar:CleanUp:DB$ Cleanup | ClearRemembered$ True SVar:X:TriggerCount$DamageAmount SVar:Picture:http://www.wizards.com/global/images/magic/general/kusari_gama.jpg -Oracle:Equipped creature has "{2}: This creature gets +1/+0 until end of turn."\nWhenever equipped creature deals damage to a blocking creature, Kusari-Gama deals that much damage to each other creature defending player controls.\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) +Oracle:Equipped creature has "{2}: This creature gets +1/+0 until end of turn."\nWhenever equipped creature deals damage to a blocking creature, Kusari-Gama deals that much damage to each other creature defending player controls.\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) \ No newline at end of file