- EMN: Added Lupine Prototype by Marek 14

- EMN: Added Decimator of the Provinces (Emerge)
This commit is contained in:
swordshine
2016-07-03 08:09:31 +00:00
parent 2e302bcd6a
commit c6106d7f58
7 changed files with 100 additions and 2 deletions

View File

@@ -1289,6 +1289,14 @@ public class ComputerUtilMana {
} }
sa.resetSacrificedAsOffering(); sa.resetSacrificedAsOffering();
} }
if (sa.isEmerge() && sa.getSacrificedAsEmerge() != null) {
final Card emerge = sa.getSacrificedAsEmerge();
emerge.setUsedToPay(false);
if (costIsPaid && !test) {
sa.getHostCard().getController().getGame().getAction().sacrifice(emerge, sa);
}
sa.resetSacrificedAsEmerge();
}
} }

View File

@@ -285,6 +285,23 @@ public final class GameActionUtil {
alternatives.add(newSA); alternatives.add(newSA);
} }
} }
if (sa.isSpell() && keyword.startsWith("Emerge")) {
List<Card> canEmerge = sa.getHostCard().getController().getCreaturesInPlay();
if (source.getController().hasKeyword("You can't sacrifice creatures to cast spells or activate abilities.")) {
continue;
}
if (!canEmerge.isEmpty()) {
final SpellAbility newSA = sa.copy();
SpellAbilityRestriction sar = new SpellAbilityRestriction();
sar.setVariables(sa.getRestrictions());
newSA.setRestrictions(sar);
newSA.setBasicSpell(false);
newSA.setIsEmerge(true);
newSA.setPayCosts(new Cost(keyword.substring(7), false));
newSA.setDescription(sa.getDescription() + " (Emerge)");
alternatives.add(newSA);
}
}
if (sa.hasParam("Equip") && sa instanceof AbilityActivated && keyword.equals("EquipInstantSpeed")) { if (sa.hasParam("Equip") && sa instanceof AbilityActivated && keyword.equals("EquipInstantSpeed")) {
final SpellAbility newSA = ((AbilityActivated) sa).getCopy(); final SpellAbility newSA = ((AbilityActivated) sa).getCopy();
SpellAbilityRestriction sar = new SpellAbilityRestriction(); SpellAbilityRestriction sar = new SpellAbilityRestriction();

View File

@@ -1788,6 +1788,11 @@ public class Card extends GameEntity implements Comparable<Card> {
} }
} }
sb.append("\r\n"); sb.append("\r\n");
} else if (keyword.startsWith("Emerge")) {
final Cost cost = new Cost(keyword.substring(7), false);
sb.append("Emerge ").append(cost.toSimpleString());
sb.append(" (You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's converted mana cost.)");
sb.append("\r\n");
} else if (keyword.startsWith("Splice")) { } else if (keyword.startsWith("Splice")) {
final Cost cost = new Cost(keyword.substring(19), false); final Cost cost = new Cost(keyword.substring(19), false);
sb.append("Splice onto Arcane ").append(cost.toSimpleString()).append("\r\n"); sb.append("Splice onto Arcane ").append(cost.toSimpleString()).append("\r\n");

View File

@@ -60,7 +60,7 @@ public final class CardUtil {
"Transmute", "Replicate", "Recover", "Suspend", "Aura swap", "Transmute", "Replicate", "Recover", "Suspend", "Aura swap",
"Fortify", "Transfigure", "Champion", "Evoke", "Prowl", "Fortify", "Transfigure", "Champion", "Evoke", "Prowl",
"Reinforce", "Unearth", "Level up", "Miracle", "Overload", "Reinforce", "Unearth", "Level up", "Miracle", "Overload",
"Scavenge", "Bestow", "Outlast", "Dash", "Renown", "Surge").build(); "Scavenge", "Bestow", "Outlast", "Dash", "Renown", "Surge", "Emerge").build();
/** List of keyword endings of keywords that could be modified by text changes. */ /** List of keyword endings of keywords that could be modified by text changes. */
public static final ImmutableList<String> modifiableKeywordEndings = ImmutableList.<String>builder().add( public static final ImmutableList<String> modifiableKeywordEndings = ImmutableList.<String>builder().add(
"walk", "cycling", "offering").build(); "walk", "cycling", "offering").build();

View File

@@ -83,7 +83,9 @@ public class ManaCostAdjustment {
if (sa.isSpell() && sa.isOffering()) { // cost reduction from offerings if (sa.isSpell() && sa.isOffering()) { // cost reduction from offerings
adjustCostByOffering(cost, sa); adjustCostByOffering(cost, sa);
} }
if (sa.isSpell() && sa.isEmerge()) { // cost reduction from offerings
adjustCostByEmerge(cost, sa);
}
// Set cost (only used by Trinisphere) is applied last // Set cost (only used by Trinisphere) is applied last
for (final StaticAbility stAb : setAbilities) { for (final StaticAbility stAb : setAbilities) {
applyAbility(stAb, "SetCost", sa, cost); applyAbility(stAb, "SetCost", sa, cost);
@@ -197,7 +199,26 @@ public class ManaCostAdjustment {
sa.setSacrificedAsOffering(toSac); sa.setSacrificedAsOffering(toSac);
toSac.setUsedToPay(true); //stop it from interfering with mana input toSac.setUsedToPay(true); //stop it from interfering with mana input
} }
private static void adjustCostByEmerge(final ManaCostBeingPaid cost, final SpellAbility sa) {
Card toSac = null;
CardCollectionView canEmerge = CardLists.filter(sa.getActivatingPlayer().getCreaturesInPlay(), CardPredicates.canBeSacrificedBy(sa));
final CardCollectionView toSacList = sa.getHostCard().getController().getController().choosePermanentsToSacrifice(sa, 0, 1, canEmerge, "Creature");
if (!toSacList.isEmpty()) {
toSac = toSacList.getFirst();
}
else {
return;
}
cost.decreaseGenericMana(toSac.getCMC());
sa.setSacrificedAsEmerge(toSac);
toSac.setUsedToPay(true); //stop it from interfering with mana input
}
/** /**
* Applies applyRaiseCostAbility ability. * Applies applyRaiseCostAbility ability.
* *

View File

@@ -95,6 +95,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
private boolean delve = false; private boolean delve = false;
private boolean dash = false; private boolean dash = false;
private boolean offering = false; private boolean offering = false;
private boolean emerge = false;
private boolean morphup = false; private boolean morphup = false;
private boolean manifestUp = false; private boolean manifestUp = false;
private boolean cumulativeupkeep = false; private boolean cumulativeupkeep = false;
@@ -123,6 +124,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
private List<AbilitySub> chosenList = null; private List<AbilitySub> chosenList = null;
private CardCollection tappedForConvoke = new CardCollection(); private CardCollection tappedForConvoke = new CardCollection();
private Card sacrificedAsOffering = null; private Card sacrificedAsOffering = null;
private Card sacrificedAsEmerge = null;
private int conspireInstances = 0; private int conspireInstances = 0;
private HashMap<String, String> sVars = new HashMap<String, String>(); private HashMap<String, String> sVars = new HashMap<String, String>();
@@ -778,6 +780,23 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
} }
} }
public boolean isEmerge() {
return emerge;
}
public void setIsEmerge(final boolean bEmerge) {
emerge = bEmerge;
}
public Card getSacrificedAsEmerge() {
return sacrificedAsEmerge;
}
public void setSacrificedAsEmerge(final Card c) {
sacrificedAsEmerge = c;
}
public void resetSacrificedAsEmerge() {
sacrificedAsEmerge = null;
}
public boolean isOffering() { public boolean isOffering() {
return offering; return offering;
} }

View File

@@ -718,6 +718,14 @@ public class HumanPlay {
} }
ability.resetSacrificedAsOffering(); ability.resetSacrificedAsOffering();
} }
if (ability.isEmerge() && ability.getSacrificedAsEmerge() != null) {
final Card emerge = ability.getSacrificedAsEmerge();
emerge.setUsedToPay(false);
if (!manaInputCancelled) {
ability.getHostCard().getGame().getAction().sacrifice(emerge, ability);
}
ability.resetSacrificedAsEmerge();
}
if (ability.getTappedForConvoke() != null) { if (ability.getTappedForConvoke() != null) {
for (final Card c : ability.getTappedForConvoke()) { for (final Card c : ability.getTappedForConvoke()) {
c.setTapped(false); c.setTapped(false);
@@ -774,6 +782,7 @@ public class HumanPlay {
} }
Card offering = null; Card offering = null;
Card emerge = null;
InputPayMana inpPayment; InputPayMana inpPayment;
if (ability.isOffering()) { if (ability.isOffering()) {
@@ -784,6 +793,14 @@ public class HumanPlay {
offering = ability.getSacrificedAsOffering(); offering = ability.getSacrificedAsOffering();
} }
} }
if (ability.isEmerge()) {
if (ability.getSacrificedAsEmerge() == null) {
System.out.println("Sacrifice input for Emerge cancelled");
return false;
} else {
emerge = ability.getSacrificedAsEmerge();
}
}
if (!toPay.isPaid()) { if (!toPay.isPaid()) {
// Input is somehow clearing out the offering card? // Input is somehow clearing out the offering card?
inpPayment = new InputPayManaOfCostPayment(controller, toPay, ability, activator); inpPayment = new InputPayManaOfCostPayment(controller, toPay, ability, activator);
@@ -810,6 +827,17 @@ public class HumanPlay {
ability.resetSacrificedAsOffering(); ability.resetSacrificedAsOffering();
} }
} }
if (ability.isEmerge()) {
if (ability.getSacrificedAsEmerge() == null && emerge != null) {
ability.setSacrificedAsEmerge(emerge);
}
if (ability.getSacrificedAsEmerge() != null) {
System.out.println("Finishing up Emerge");
emerge.setUsedToPay(false);
activator.getGame().getAction().sacrifice(emerge, ability);
ability.resetSacrificedAsEmerge();
}
}
if (ability.getTappedForConvoke() != null) { if (ability.getTappedForConvoke() != null) {
for (final Card c : ability.getTappedForConvoke()) { for (final Card c : ability.getTappedForConvoke()) {
c.setTapped(false); c.setTapped(false);