Fix so MultiKicker is announced before mana paid

This commit is contained in:
drdev
2014-09-07 20:15:16 +00:00
parent 3427709c7b
commit 683ccbcf41
5 changed files with 32 additions and 45 deletions

View File

@@ -2136,9 +2136,10 @@ public class CardFactoryUtil {
final SpellAbility sa = card.getFirstSpellAbility();
sa.setMultiKickerManaCost(new ManaCost(new ManaCostParser(k[1])));
sa.addAnnounceVar("Multikicker");
}
}
if (hasKeyword(card, "Fuse") != -1) {
card.getState(CardCharacteristicName.Original).getSpellAbility().add(AbilityFactory.buildFusedAbility(card));
}
@@ -2732,7 +2733,7 @@ public class CardFactoryUtil {
// instantiate attach ability
final SpellAbility sa = AbilityFactory.getAbility(abilityStr.toString(), card);
card.addSpellAbility(sa);
// add ability to instrinic strings so copies/clones create the ability also
// add ability to intrinsic strings so copies/clones create the ability also
card.getUnparsedAbilities().add(abilityStr.toString());
}

View File

@@ -302,18 +302,6 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
public boolean isSpell() { return false; }
public boolean isAbility() { return true; }
/**
* <p>
* isMultiKicker.
* </p>
*
* @return a boolean.
*/
public boolean isMultiKicker() {
return this.multiKickerManaCost != null && !this.isAnnouncing("Multikicker");
}
/**
* <p>
* setIsMorphUp.
@@ -384,14 +372,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
}
public String getParamOrDefault(String key, String defaultValue) {
return mapParams == null || !mapParams.containsKey(key) ? defaultValue : mapParams.get(key);
return mapParams.containsKey(key) ? mapParams.get(key) : defaultValue;
}
public String getParam(String key) {
return mapParams == null ? null : mapParams.get(key);
return mapParams.get(key);
}
public boolean hasParam(String key) {
return mapParams == null ? false : mapParams.containsKey(key);
return mapParams.containsKey(key);
}
/**
@@ -399,9 +387,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
* @param mapParams
*/
public void copyParamsToMap(Map<String, String> mapParams) {
if (null != this.mapParams) {
mapParams.putAll(this.mapParams);
}
mapParams.putAll(this.mapParams);
}
// If this is not null, then ability was made in a factory
@@ -1355,7 +1341,8 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
*/
public boolean isAnnouncing(String variable) {
String announce = getParam("Announce");
if (StringUtils.isBlank(announce)) return false;
if (StringUtils.isBlank(announce)) { return false; }
String[] announcedOnes = TextUtil.split(announce, ',');
for (String a : announcedOnes) {
if (a.trim().equalsIgnoreCase(variable)) {
@@ -1365,6 +1352,21 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
return false;
}
public void addAnnounceVar(String variable) {
String announce = getParam("Announce");
if (StringUtils.isBlank(announce)) {
mapParams.put("Announce", variable);
return;
}
String[] announcedOnes = TextUtil.split(announce, ',');
for (String a : announcedOnes) {
if (a.trim().equalsIgnoreCase(variable)) {
return; //don't add announce variable that already exists
}
}
mapParams.put("Announce", announce + ";" + variable);
}
public boolean isXCost() {
CostPartMana cm = payCosts != null ? getPayCosts().getCostMana() : null;
return cm != null && cm.getAmountOfX() > 0;

View File

@@ -243,11 +243,6 @@ public class WrappedAbility extends Ability implements ISpellAbility {
return sa.isFlashBackAbility();
}
@Override
public boolean isMultiKicker() {
return sa.isMultiKicker();
}
@Override
public boolean isSpell() {
return sa.isSpell();

View File

@@ -340,20 +340,6 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
si = this.push(sp);
}
else {
if (sp.isMultiKicker()) {
final Cost costMultikicker = new Cost(sp.getMultiKickerManaCost(), false);
boolean hasPaid = false;
do {
int mkMagnitude = source.getKickerMagnitude();
String prompt = String.format("Multikicker for %s\r\nTimes Kicked: %d\r\n", source, mkMagnitude );
hasPaid = activator.getController().payManaOptional(source, costMultikicker, sp, prompt, ManaPaymentPurpose.Multikicker);
if (hasPaid) {
source.addMultiKickerMagnitude(1);
totManaSpent += sp.getPayingMana().size();
// TODO: paying mana is replaced by multikicker cost, this should be fixed in the future
}
} while( hasPaid );
}
if (sp.isSpell() && source.isCreature() && Iterables.any(activator.getCardsIn(ZoneType.Battlefield),
CardPredicates.hasKeyword("As an additional cost to cast creature spells," +
" you may pay any amount of mana. If you do, that creature enters " +