build fuse ability moved to ability/AbilityFactory.java

had to copy svars from sides to joined 'original' card in order to support cards like Beck//Call from http://www.slightlymagic.net/forum/viewtopic.php?p=114908#p114908
This commit is contained in:
Maxmtg
2013-04-08 19:24:03 +00:00
parent c662f77e10
commit 1d6ea63cf1
3 changed files with 36 additions and 32 deletions

View File

@@ -22,6 +22,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import forge.Card; import forge.Card;
import forge.CardCharacteristicName;
import forge.card.cost.Cost; import forge.card.cost.Cost;
import forge.card.spellability.AbilitySub; import forge.card.spellability.AbilitySub;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
@@ -120,7 +121,7 @@ public final class AbilityFactory {
return abCost; return abCost;
} }
public static final SpellAbility getAbility(AbilityRecordType type, ApiType api, Map<String, String> mapParams, Cost abCost, Card hostCard) { private static final SpellAbility getAbility(AbilityRecordType type, ApiType api, Map<String, String> mapParams, Cost abCost, Card hostCard) {
Target abTgt = mapParams.containsKey("ValidTgts") ? readTarget(hostCard, mapParams) : null; 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<String, String> 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<String, String> 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 } // end class AbilityFactory

View File

@@ -291,8 +291,10 @@ public class CardFactory {
if ( state == CardCharacteristicName.LeftSplit || state == CardCharacteristicName.RightSplit ) if ( state == CardCharacteristicName.LeftSplit || state == CardCharacteristicName.RightSplit )
{ {
card.getState(CardCharacteristicName.Original).getSpellAbility().addAll(card.getCharacteristics().getSpellAbility()); CardCharacteristics original = card.getState(CardCharacteristicName.Original);
card.getState(CardCharacteristicName.Original).getIntrinsicKeyword().addAll(card.getIntrinsicKeyword()); // Copy 'Fuse' to original side 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)
} }
} }

View File

@@ -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<String, String> 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<String, String> 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;
}
/** /**
* <p> * <p>
* postFactoryKeywords. * postFactoryKeywords.
@@ -2446,7 +2418,7 @@ public class CardFactoryUtil {
} }
if(CardFactoryUtil.hasKeyword(card, "Fuse") != -1) { 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"); final int evokePos = CardFactoryUtil.hasKeyword(card, "Evoke");