From 73562528f61be7ae013be37732abac73aa791030 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 11 Jul 2021 15:15:54 +0000 Subject: [PATCH] Card: fix getType when using changedCardTypesCharacterDefining --- .../java/forge/ai/simulation/GameCopier.java | 6 +++- .../src/main/java/forge/game/GameAction.java | 11 ++++--- .../src/main/java/forge/game/card/Card.java | 31 ++++++++++++++++--- .../main/java/forge/game/card/CardUtil.java | 4 ++- .../main/java/forge/game/card/CardView.java | 2 +- 5 files changed, 42 insertions(+), 12 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java index 3e9d300fe7b..251dc8796f2 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java @@ -285,8 +285,12 @@ public class GameCopier { } newCard.setPTBoost(c.getPTBoostTable()); newCard.setDamage(c.getDamage()); - + + newCard.setChangedCardColors(c.getChangedCardColorsMap()); + newCard.setChangedCardColorsCharacterDefining(c.getChangedCardColorsCharacterDefiningMap()); + newCard.setChangedCardTypes(c.getChangedCardTypesMap()); + newCard.setChangedCardTypesCharacterDefining(c.getChangedCardTypesCharacterDefiningMap()); newCard.setChangedCardKeywords(c.getChangedCardKeywords()); newCard.setChangedCardNames(c.getChangedCardNames()); diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 674ea5925dd..19a9f25ac72 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -244,9 +244,11 @@ public class GameAction { if (zoneTo.is(ZoneType.Stack)) { // when moving to stack, copy changed card information - copied.setChangedCardColors(c.getChangedCardColors()); + copied.setChangedCardColors(c.getChangedCardColorsMap()); + copied.setChangedCardColorsCharacterDefining(c.getChangedCardColorsCharacterDefiningMap()); copied.setChangedCardKeywords(c.getChangedCardKeywords()); copied.setChangedCardTypes(c.getChangedCardTypesMap()); + copied.setChangedCardTypesCharacterDefining(c.getChangedCardTypesCharacterDefiningMap()); copied.setChangedCardNames(c.getChangedCardNames()); copied.setChangedCardTraits(c.getChangedCardTraits()); @@ -266,6 +268,9 @@ public class GameAction { // on Transformed objects) copied.setState(CardStateName.Original, false); copied.setBackSide(false); + + // reset timestamp in changezone effects so they have same timestamp if ETB simutaneously + copied.setTimestamp(game.getNextTimestamp()); } copied.setUnearthed(c.isUnearthed()); @@ -278,6 +283,7 @@ public class GameAction { } } else { //Token copied = c; + copied.setTimestamp(game.getNextTimestamp()); } } @@ -603,8 +609,6 @@ public class GameAction { } unattachCardLeavingBattlefield(copied); } else if (toBattlefield) { - // reset timestamp in changezone effects so they have same timestamp if ETB simutaneously - copied.setTimestamp(game.getNextTimestamp()); for (Player p : game.getPlayers()) { copied.getDamageHistory().setNotAttackedSinceLastUpkeepOf(p); copied.getDamageHistory().setNotBlockedSinceLastUpkeepOf(p); @@ -619,7 +623,6 @@ public class GameAction { || zoneTo.is(ZoneType.Hand) || zoneTo.is(ZoneType.Library) || zoneTo.is(ZoneType.Exile)) { - copied.setTimestamp(game.getNextTimestamp()); copied.clearOptionalCostsPaid(); if (copied.isFaceDown()) { copied.setState(CardStateName.Original, true); 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 ec03ca8b814..8f9a2056a0d 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -3495,7 +3495,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } public final CardTypeView getType(CardState state) { - if (changedCardTypes.isEmpty()) { + if (changedCardTypes.isEmpty() && changedCardTypesCharacterDefining.isEmpty()) { return state.getType(); } return state.getType().getTypeWithChanges(getChangedCardTypes()); @@ -3508,6 +3508,9 @@ public class Card extends GameEntity implements Comparable, IHasSVars { public Map getChangedCardTypesMap() { return Collections.unmodifiableMap(changedCardTypes); } + public Map getChangedCardTypesCharacterDefiningMap() { + return Collections.unmodifiableMap(changedCardTypesCharacterDefining); + } public boolean clearChangedCardTypes() { boolean changed = false; @@ -3548,9 +3551,15 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return changedCardKeywords; } - public Map getChangedCardColors() { + public Map getChangedCardColorsMap() { return changedCardColors; } + public Map getChangedCardColorsCharacterDefiningMap() { + return changedCardColorsCharacterDefining; + } + public Iterable getChangedCardColors() { + return Iterables.concat(changedCardColorsCharacterDefining.values(), changedCardColors.values()); + } public final void addChangedCardTypes(final CardType addType, final CardType removeType, final boolean removeSuperTypes, final boolean removeCardTypes, final boolean removeSubTypes, @@ -3602,7 +3611,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { public final void addColor(final String s, final boolean addToColors, final long timestamp, final boolean cda) { (cda ? changedCardColorsCharacterDefining : changedCardColors).put(timestamp, new CardColor(s, addToColors, timestamp)); currentState.getView().updateColors(this); - currentState.getView().updateHasChangeColors(!getChangedCardColors().isEmpty()); + currentState.getView().updateHasChangeColors(!Iterables.isEmpty(getChangedCardColors())); } public final void removeColor(final long timestampIn) { @@ -3612,7 +3621,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { if (removed) { currentState.getView().updateColors(this); - currentState.getView().updateHasChangeColors(!getChangedCardColors().isEmpty()); + currentState.getView().updateHasChangeColors(!Iterables.isEmpty(getChangedCardColors())); } } @@ -3628,7 +3637,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } public final ColorSet determineColor(CardState state) { byte colors = state.getColor(); - for (final CardColor cc : Iterables.concat(changedCardColorsCharacterDefining.values(), changedCardColors.values())) { + for (final CardColor cc : getChangedCardColors()) { if (cc.isAdditional()) { colors |= cc.getColorMask(); } else { @@ -6604,6 +6613,12 @@ public class Card extends GameEntity implements Comparable, IHasSVars { this.changedCardTypes.put(entry.getKey(), entry.getValue()); } } + public void setChangedCardTypesCharacterDefining(Map changedCardTypes) { + this.changedCardTypesCharacterDefining.clear(); + for (Entry entry : changedCardTypes.entrySet()) { + this.changedCardTypesCharacterDefining.put(entry.getKey(), entry.getValue()); + } + } public void setChangedCardKeywords(Map changedCardKeywords) { this.changedCardKeywords.clear(); @@ -6618,6 +6633,12 @@ public class Card extends GameEntity implements Comparable, IHasSVars { this.changedCardColors.put(entry.getKey(), entry.getValue()); } } + public void setChangedCardColorsCharacterDefining(Map changedCardColors) { + this.changedCardColorsCharacterDefining.clear(); + for (Entry entry : changedCardColors.entrySet()) { + this.changedCardColorsCharacterDefining.put(entry.getKey(), entry.getValue()); + } + } public void forceTurnFaceUp() { getGame().getTriggerHandler().suppressMode(TriggerType.TurnFaceUp); diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 69bee0fc573..8aa688e4678 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -281,9 +281,11 @@ public final class CardUtil { newCopy.setUnearthed(in.isUnearthed()); - newCopy.setChangedCardColors(in.getChangedCardColors()); + newCopy.setChangedCardColors(in.getChangedCardColorsMap()); + newCopy.setChangedCardColorsCharacterDefining(in.getChangedCardColorsCharacterDefiningMap()); newCopy.setChangedCardKeywords(in.getChangedCardKeywords()); newCopy.setChangedCardTypes(in.getChangedCardTypesMap()); + newCopy.setChangedCardTypesCharacterDefining(in.getChangedCardTypesCharacterDefiningMap()); newCopy.setChangedCardNames(in.getChangedCardNames()); newCopy.setChangedCardTraits(in.getChangedCardTraits()); 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 dfd26130bbc..4edc56438e9 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -869,7 +869,7 @@ public class CardView extends GameEntityView { // update the color only while in Game if (c.getGame() != null) { currentStateView.updateColors(currentState); - currentStateView.updateHasChangeColors(!c.getChangedCardColors().isEmpty()); + currentStateView.updateHasChangeColors(!Iterables.isEmpty(c.getChangedCardColors())); } } else { currentStateView.updateLoyalty(currentState);