diff --git a/src/main/java/forge/card/ability/AbilityFactory.java b/src/main/java/forge/card/ability/AbilityFactory.java index f6a2f88dead..8654b1dc78a 100644 --- a/src/main/java/forge/card/ability/AbilityFactory.java +++ b/src/main/java/forge/card/ability/AbilityFactory.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import forge.Card; +import forge.CardCharacteristicName; import forge.card.cost.Cost; import forge.card.spellability.AbilitySub; import forge.card.spellability.SpellAbility; @@ -120,7 +121,7 @@ public final class AbilityFactory { return abCost; } - public static final SpellAbility getAbility(AbilityRecordType type, ApiType api, Map mapParams, Cost abCost, Card hostCard) { + private static final SpellAbility getAbility(AbilityRecordType type, ApiType api, Map mapParams, Cost abCost, Card hostCard) { Target abTgt = mapParams.containsKey("ValidTgts") ? readTarget(hostCard, mapParams) : null; @@ -351,4 +352,33 @@ public final class AbilityFactory { } } + public static final SpellAbility buildFusedAbility(final Card card) { + if(!card.isSplitCard()) + throw new IllegalStateException("Fuse ability may be built only on split cards"); + + final String strLeftAbility = card.getState(CardCharacteristicName.LeftSplit).getIntrinsicAbility().get(0); + Map leftMap = getMapParams(strLeftAbility); + AbilityRecordType leftType = AbilityRecordType.getRecordType(leftMap); + Cost leftCost = parseAbilityCost(card, leftMap, leftType); + ApiType leftApi = leftType.getApiTypeOf(leftMap); + leftMap.put("StackDecription", leftMap.get("SpellDescription")); + leftMap.put("SpellDescription", "Fuse (you may cast both halves of this card from your hand)."); + leftMap.put("ActivationZone", "Hand"); + + final String strRightAbility = card.getState(CardCharacteristicName.RightSplit).getIntrinsicAbility().get(0); + Map rightMap = getMapParams(strRightAbility); + AbilityRecordType rightType = AbilityRecordType.getRecordType(leftMap); + Cost rightCost = parseAbilityCost(card, rightMap, rightType); + ApiType rightApi = leftType.getApiTypeOf(rightMap); + rightMap.put("StackDecription", rightMap.get("SpellDescription")); + rightMap.put("SpellDescription", ""); + + + Cost joinedCost = Cost.combine(rightCost, leftCost); + final SpellAbility left = getAbility(leftType, leftApi, leftMap, joinedCost, card); + final AbilitySub right = (AbilitySub) getAbility(AbilityRecordType.SubAbility, rightApi, rightMap, null, card); + left.appendSubAbility(right); + return left; + } + } // end class AbilityFactory diff --git a/src/main/java/forge/card/cardfactory/CardFactory.java b/src/main/java/forge/card/cardfactory/CardFactory.java index 31681eda675..a2542224c18 100644 --- a/src/main/java/forge/card/cardfactory/CardFactory.java +++ b/src/main/java/forge/card/cardfactory/CardFactory.java @@ -291,8 +291,10 @@ public class CardFactory { if ( state == CardCharacteristicName.LeftSplit || state == CardCharacteristicName.RightSplit ) { - card.getState(CardCharacteristicName.Original).getSpellAbility().addAll(card.getCharacteristics().getSpellAbility()); - card.getState(CardCharacteristicName.Original).getIntrinsicKeyword().addAll(card.getIntrinsicKeyword()); // Copy 'Fuse' to original side + CardCharacteristics original = card.getState(CardCharacteristicName.Original); + original.getSpellAbility().addAll(card.getCharacteristics().getSpellAbility()); + original.getIntrinsicKeyword().addAll(card.getIntrinsicKeyword()); // Copy 'Fuse' to original side + original.getSVars().putAll(card.getCharacteristics().getSVars()); // Unfortunately need to copy these to (Effect looks for sVars on execute) } } diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index 06309d6e54e..0035a294aed 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -2373,34 +2373,6 @@ public class CardFactoryUtil { } } - public static final SpellAbility buildFusedAbility(final Card card) { - if(!card.isSplitCard()) - throw new IllegalStateException("Fuse ability may be built only on split cards"); - - final String strLeftAbility = card.getState(CardCharacteristicName.LeftSplit).getIntrinsicAbility().get(0); - Map leftMap = AbilityFactory.getMapParams(strLeftAbility); - AbilityFactory.AbilityRecordType leftType = AbilityFactory.AbilityRecordType.getRecordType(leftMap); - Cost leftCost = AbilityFactory.parseAbilityCost(card, leftMap, leftType); - ApiType leftApi = leftType.getApiTypeOf(leftMap); - leftMap.put("StackDecription", leftMap.get("SpellDescription")); - leftMap.put("SpellDescription", "Fuse (you may cast both halves of this card from your hand)."); - - final String strRightAbility = card.getState(CardCharacteristicName.RightSplit).getIntrinsicAbility().get(0); - Map rightMap = AbilityFactory.getMapParams(strRightAbility); - AbilityFactory.AbilityRecordType rightType = AbilityFactory.AbilityRecordType.getRecordType(leftMap); - Cost rightCost = AbilityFactory.parseAbilityCost(card, rightMap, rightType); - ApiType rightApi = leftType.getApiTypeOf(rightMap); - rightMap.put("StackDecription", rightMap.get("SpellDescription")); - rightMap.put("SpellDescription", ""); - - - Cost joinedCost = Cost.combine(rightCost, leftCost); - final SpellAbility left = AbilityFactory.getAbility(leftType, leftApi, leftMap, joinedCost, card); - final AbilitySub right = (AbilitySub) AbilityFactory.getAbility(AbilityFactory.AbilityRecordType.SubAbility, rightApi, rightMap, null, card); - left.appendSubAbility(right); - return left; - } - /** *

* postFactoryKeywords. @@ -2446,7 +2418,7 @@ public class CardFactoryUtil { } if(CardFactoryUtil.hasKeyword(card, "Fuse") != -1) { - card.getState(CardCharacteristicName.Original).getSpellAbility().add(buildFusedAbility(card)); + card.getState(CardCharacteristicName.Original).getSpellAbility().add(AbilityFactory.buildFusedAbility(card)); } final int evokePos = CardFactoryUtil.hasKeyword(card, "Evoke");