diff --git a/forge-core/src/main/java/forge/card/StateChangedType.java b/forge-core/src/main/java/forge/card/StateChangedType.java new file mode 100644 index 00000000000..8fddf792490 --- /dev/null +++ b/forge-core/src/main/java/forge/card/StateChangedType.java @@ -0,0 +1,9 @@ +package forge.card; + +public record StateChangedType(CardTypeView type) implements ICardChangedType { + + @Override + public CardType applyChanges(CardType newType) { + return new CardType(type); + } +} diff --git a/forge-core/src/main/java/forge/card/TextChangedType.java b/forge-core/src/main/java/forge/card/TextChangedType.java deleted file mode 100644 index f22d269bef1..00000000000 --- a/forge-core/src/main/java/forge/card/TextChangedType.java +++ /dev/null @@ -1,18 +0,0 @@ -package forge.card; - -import java.util.Map; - -public record TextChangedType(Map textMap) implements ICardChangedType { - - @Override - public CardType applyChanges(CardType newType) { - for (Map.Entry e : textMap.entrySet()) { - if (newType.hasStringType(e.getKey())) { - newType.subtypes.remove(e.getKey()); - newType.subtypes.add(e.getValue()); - } - } - return newType; - } - -} diff --git a/forge-core/src/main/java/forge/card/WordChangedType.java b/forge-core/src/main/java/forge/card/WordChangedType.java new file mode 100644 index 00000000000..9652f359de7 --- /dev/null +++ b/forge-core/src/main/java/forge/card/WordChangedType.java @@ -0,0 +1,13 @@ +package forge.card; + +public record WordChangedType(String oldWord, String newWord) implements ICardChangedType { + + @Override + public CardType applyChanges(CardType newType) { + if (newType.hasStringType(oldWord)) { + newType.subtypes.remove(oldWord); + newType.subtypes.add(newWord); + } + return newType; + } +} diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 0a26dd22d5b..b2d60d824b3 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -1234,6 +1234,7 @@ public boolean visit(final Card c) { if (affectedPerLayer.containsKey(StaticAbilityLayer.TEXT)) { affectedPerLayer.get(StaticAbilityLayer.TEXT).forEach(Card::updateNameforView); affectedKeywords.addAll(affectedPerLayer.get(StaticAbilityLayer.TEXT)); + affectedPT.addAll(affectedPerLayer.get(StaticAbilityLayer.TEXT)); } if (affectedPerLayer.containsKey(StaticAbilityLayer.TYPE)) { affectedPerLayer.get(StaticAbilityLayer.TYPE).forEach(Card::updateTypesForView); 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 4503cfc7467..835c4147cfe 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -120,7 +120,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars, ITr // changes by AF animate and continuous static effects - protected ICardChangedType changedTypeByText; // Layer 3 by Text Change // x=timestamp y=StaticAbility id private final Table changedCardTypesByText = TreeBasedTable.create(); // Layer 3 private final Table changedCardTypesCharacterDefining = TreeBasedTable.create(); // Layer 4 CDA @@ -4140,25 +4139,19 @@ public Iterable getChangedCardTypes() { // If there are no changed types, just return an empty immutable list, which actually // produces a surprisingly large speedup by avoid lots of temp objects and making iteration // over the result much faster. (This function gets called a lot!) - if (changedCardTypesByText.isEmpty() && changedTypeByText == null && changedCardTypesCharacterDefining.isEmpty() && changedCardTypes.isEmpty()) { + if (changedCardTypesByText.isEmpty() && changedCardTypesCharacterDefining.isEmpty() && changedCardTypes.isEmpty()) { return ImmutableList.of(); } - Iterable byText = changedTypeByText == null ? ImmutableList.of() : ImmutableList.of(this.changedTypeByText); return ImmutableList.copyOf(Iterables.concat( changedCardTypesByText.values(), // Layer 3 - byText, // Layer 3 by Word Changes, changedCardTypesCharacterDefining.values(), // Layer 4 - changedCardTypes.values() // Layer 6 + changedCardTypes.values() // Layer 4 )); } public boolean clearChangedCardTypes() { boolean changed = false; - if (changedTypeByText != null) - changed = true; - changedTypeByText = null; - if (!changedCardTypesByText.isEmpty()) changed = true; changedCardTypesByText.clear(); @@ -4210,18 +4203,16 @@ public void setChangedCardKeywords(Table changedCard } } - public final void addChangedCardTypesByText(final CardType addType, final long timestamp, final long staticId) { - changedCardTypesByText.put(timestamp, staticId, new CardChangedType(addType, null, false, - EnumSet.of(RemoveType.SuperTypes, RemoveType.CardTypes, RemoveType.SubTypes))); - - // setting card type via text, does overwrite any other word change effects? - this.changedTextColors.addEmpty(timestamp, staticId); - this.changedTextTypes.addEmpty(timestamp, staticId); - - this.updateChangedText(); + public final void addChangedCardTypesByText(final CardTypeView addType, final long timestamp, final long staticId) { + changedCardTypesByText.put(timestamp, staticId, new StateChangedType(addType)); + updateTypeCache(); } public final boolean removeChangedCardTypesByText(final long timestamp, final long staticId) { - return changedCardTypesByText.remove(timestamp, staticId) != null; + boolean removed = changedCardTypesByText.remove(timestamp, staticId) != null; + if (removed) { + updateTypeCache(); + } + return removed; } public final void addChangedCardTypes(final CardType addType, final CardType removeType, final boolean addAllCreatureTypes, @@ -4472,7 +4463,6 @@ public final void setPTCharacterDefiningTable(Table spells, changedCardTraitsByText.put(timestamp, staticId, new CardTraitChanges( spells, null, trigger, replacements, statics, true, false )); - updateAbilityTextForView(); + + // setting card traits via text, does overwrite any other word change effects? + this.changedTextColors.addEmpty(timestamp, staticId); + this.changedTextTypes.addEmpty(timestamp, staticId); + updateChangedText(); } public final CardTraitChanges addChangedCardTraits(Collection spells, Collection removedAbilities, @@ -5536,10 +5530,14 @@ public final void removeChangedTextColorWord(final Long timestamp, final long st */ public final void addChangedTextTypeWord(final String originalWord, final String newWord, final Long timestamp, final long staticId) { changedTextTypes.add(timestamp, staticId, originalWord, newWord); + changedCardTypesByText.put(timestamp, staticId, new WordChangedType(originalWord, newWord)); updateChangedText(); } public final void removeChangedTextTypeWord(final Long timestamp, final long staticId) { + if (changedCardTypesByText.remove(timestamp, staticId) != null) { + updateTypeCache(); + } if (changedTextTypes.remove(timestamp, staticId)) { updateChangedText(); } @@ -5549,8 +5547,6 @@ public final void removeChangedTextTypeWord(final Long timestamp, final long sta * Update the changed text of the intrinsic spell abilities and keywords. */ public void updateChangedText() { - this.changedTypeByText = new TextChangedType(this.changedTextTypes); - currentState.updateChangedText(); // update changed text in the layer, for Volrath's Shapeshifter diff --git a/forge-game/src/main/java/forge/game/card/CardCopyService.java b/forge-game/src/main/java/forge/game/card/CardCopyService.java index 834ac295c13..baa33f5fd2f 100644 --- a/forge-game/src/main/java/forge/game/card/CardCopyService.java +++ b/forge-game/src/main/java/forge/game/card/CardCopyService.java @@ -358,7 +358,6 @@ public Card getLKICopy(Map cachedMap) { newCopy.setStoredReplacements(copyFrom.getStoredReplacements()); newCopy.copyChangedTextFrom(copyFrom); - newCopy.changedTypeByText = copyFrom.changedTypeByText; newCopy.changedCardKeywordsByWord = copyFrom.changedCardKeywordsByWord.copy(newCopy, true); newCopy.setGameTimestamp(copyFrom.getGameTimestamp()); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index a362ed550e7..f1785ebff67 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -624,11 +624,10 @@ public static CardCollectionView applyContinuousAbility(final StaticAbility stAb // color affectedCard.addColorByText(state.getColor(), false, se.getTimestamp(), stAb); // type - affectedCard.addChangedCardTypesByText(new CardType(state.getType()), se.getTimestamp(), stAb.getId()); + affectedCard.addChangedCardTypesByText(state.getType(), se.getTimestamp(), stAb.getId()); // abilities affectedCard.addChangedCardTraitsByText(spellAbilities, trigger, replacementEffects, staticAbilities, se.getTimestamp(), stAb.getId()); affectedCard.addChangedCardKeywordsByText(keywords, se.getTimestamp(), stAb.getId(), false); - // power and toughness affectedCard.addNewPTByText(state.getBasePower(), state.getBaseToughness(), se.getTimestamp(), stAb.getId()); }