Cross my fingers

This commit is contained in:
Chris H
2018-10-08 23:35:53 -04:00
parent 29ff9d3c92
commit 8ac960168d
16 changed files with 122 additions and 101 deletions

View File

@@ -26,6 +26,7 @@ import forge.game.card.CardPredicates.Presets;
import forge.game.combat.Combat; import forge.game.combat.Combat;
import forge.game.cost.*; import forge.game.cost.*;
import forge.game.mana.Mana; import forge.game.mana.Mana;
import forge.game.mana.ManaConversionMatrix;
import forge.game.mana.ManaCostBeingPaid; import forge.game.mana.ManaCostBeingPaid;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
@@ -892,7 +893,7 @@ public class PlayerControllerAi extends PlayerController {
} }
@Override @Override
public boolean payManaCost(ManaCost toPay, CostPartMana costPartMana, SpellAbility sa, String prompt /* ai needs hints as well */, boolean isActivatedSa) { public boolean payManaCost(ManaCost toPay, CostPartMana costPartMana, SpellAbility sa, String prompt /* ai needs hints as well */, ManaConversionMatrix matrix, boolean isActivatedSa) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
ManaCostBeingPaid cost = isActivatedSa ? ComputerUtilMana.calculateManaCost(sa, false, 0) : new ManaCostBeingPaid(toPay); ManaCostBeingPaid cost = isActivatedSa ? ComputerUtilMana.calculateManaCost(sa, false, 0) : new ManaCostBeingPaid(toPay);
return ComputerUtilMana.payManaCost(cost, sa, player); return ComputerUtilMana.payManaCost(cost, sa, player);

View File

@@ -29,7 +29,6 @@ import forge.game.ability.effects.AttachEffect;
import forge.game.card.*; import forge.game.card.*;
import forge.game.event.*; import forge.game.event.*;
import forge.game.keyword.KeywordInterface; import forge.game.keyword.KeywordInterface;
import forge.game.mana.ManaConversionService;
import forge.game.player.GameLossReason; import forge.game.player.GameLossReason;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementEffect;
@@ -786,7 +785,9 @@ public class GameAction {
game.getReplacementHandler().cleanUpTemporaryReplacements(); game.getReplacementHandler().cleanUpTemporaryReplacements();
for (final Player p : game.getPlayers()) { for (final Player p : game.getPlayers()) {
new ManaConversionService(p.getManaPool()).restoreColorReplacements(); if (!game.getStack().isFrozen()) {
p.getManaPool().restoreColorReplacements();
}
p.clearStaticAbilities(); p.clearStaticAbilities();
} }

View File

@@ -18,7 +18,7 @@ import forge.game.ability.AbilityFactory.AbilityRecordType;
import forge.game.card.*; import forge.game.card.*;
import forge.game.cost.Cost; import forge.game.cost.Cost;
import forge.game.keyword.KeywordInterface; import forge.game.keyword.KeywordInterface;
import forge.game.mana.ManaConversionService; import forge.game.mana.ManaConversionMatrix;
import forge.game.mana.ManaCostBeingPaid; import forge.game.mana.ManaCostBeingPaid;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerCollection; import forge.game.player.PlayerCollection;
@@ -1643,7 +1643,7 @@ public class AbilityUtils {
return CardFactoryUtil.xCount(c, s2); return CardFactoryUtil.xCount(c, s2);
} }
public static final void applyManaColorConversion(final Player p, final Map<String, String> params) { public static final void applyManaColorConversion(ManaConversionMatrix matrix, final Map<String, String> params) {
String conversionType = params.get("ManaColorConversion"); String conversionType = params.get("ManaColorConversion");
// Choices are Additives(OR) or Restrictive(AND) // Choices are Additives(OR) or Restrictive(AND)
@@ -1664,7 +1664,7 @@ public class AbilityUtils {
} }
} }
// AdjustColorReplacement has two different matrices handling final mana conversion under the covers // AdjustColorReplacement has two different matrices handling final mana conversion under the covers
new ManaConversionService(p.getManaPool()).adjustColorReplacement(ManaAtom.fromName(c), convertByte, additive); matrix.adjustColorReplacement(ManaAtom.fromName(c), convertByte, additive);
} }
} }
} }

View File

@@ -19,7 +19,9 @@ package forge.game.cost;
import forge.card.mana.ManaCost; import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostShard; import forge.card.mana.ManaCostShard;
import forge.game.mana.ManaConversionMatrix;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.spellability.AbilityActivated;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
/** /**
@@ -37,6 +39,9 @@ public class CostPartMana extends CostPart {
private boolean isEnchantedCreatureCost = false; private boolean isEnchantedCreatureCost = false;
private final String restriction; private final String restriction;
private ManaConversionMatrix cardMatrix = null;
public void setCardMatrix(ManaConversionMatrix mtrx) { cardMatrix = mtrx; }
public int paymentOrder() { return shouldPayLast() ? 200 : 0; } public int paymentOrder() { return shouldPayLast() ? 200 : 0; }
public boolean shouldPayLast() { public boolean shouldPayLast() {
@@ -147,8 +152,9 @@ public class CostPartMana extends CostPart {
// TODO Auto-generated method stub // TODO Auto-generated method stub
sa.clearManaPaid(); sa.clearManaPaid();
boolean isActivated = sa instanceof AbilityActivated;
// decision not used here, the whole payment is interactive! // decision not used here, the whole payment is interactive!
return payer.getController().payManaCost(this, sa, null, true); return payer.getController().payManaCost(this, sa, null, cardMatrix, isActivated);
} }
} }

View File

@@ -21,6 +21,7 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import forge.game.Game; import forge.game.Game;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.mana.ManaConversionMatrix;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
@@ -35,7 +36,7 @@ import java.util.Map;
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
public class CostPayment { public class CostPayment extends ManaConversionMatrix {
private final Cost cost; private final Cost cost;
private Cost adjustedCost; private Cost adjustedCost;
private final SpellAbility ability; private final SpellAbility ability;
@@ -70,6 +71,7 @@ public class CostPayment {
this.cost = cost; this.cost = cost;
this.adjustedCost = cost; this.adjustedCost = cost;
this.ability = abil; this.ability = abil;
restoreColorReplacements();
} }
/** /**
@@ -137,6 +139,11 @@ public class CostPayment {
PaymentDecision pd = part.accept(decisionMaker); PaymentDecision pd = part.accept(decisionMaker);
// RIght before we start paying as decided, we need to transfer the CostPayments matrix over?
if (part instanceof CostPartMana) {
((CostPartMana)part).setCardMatrix(this);
}
if (pd == null || !part.payAsDecided(decisionMaker.getPlayer(), pd, ability)) { if (pd == null || !part.payAsDecided(decisionMaker.getPlayer(), pd, ability)) {
game.costPaymentStack.pop(); // cost is resolved game.costPaymentStack.pop(); // cost is resolved
return false; return false;

View File

@@ -1,11 +0,0 @@
package forge.game.mana;
import forge.card.mana.ManaAtom;
public interface IManaConversionMatrix {
// Conversion matrix ORs byte values to make mana more payable
// Restrictive matrix ANDs byte values to make mana less payable
byte[] colorConversionMatrix = new byte[ManaAtom.MANATYPES.length];
byte[] colorRestrictionMatrix = new byte[ManaAtom.MANATYPES.length];
}

View File

@@ -0,0 +1,45 @@
package forge.game.mana;
import forge.card.mana.ManaAtom;
public class ManaConversionMatrix {
static byte[] identityMatrix = { ManaAtom.WHITE, ManaAtom.BLUE, ManaAtom.BLACK, ManaAtom.RED, ManaAtom.GREEN, ManaAtom.COLORLESS };
// Conversion matrix ORs byte values to make mana more payable
// Restrictive matrix ANDs byte values to make mana less payable
byte[] colorConversionMatrix = new byte[ManaAtom.MANATYPES.length];
byte[] colorRestrictionMatrix = new byte[ManaAtom.MANATYPES.length];
public void adjustColorReplacement(byte originalColor, byte replacementColor, boolean additive) {
// Fix the index without hardcodes
int rowIdx = ManaAtom.getIndexOfFirstManaType(originalColor);
rowIdx = rowIdx < 0 ? identityMatrix.length - 1 : rowIdx;
if (additive) {
colorConversionMatrix[rowIdx] |= replacementColor;
}
else {
colorRestrictionMatrix[rowIdx] &= replacementColor;
}
}
public void applyCardMatrix(ManaConversionMatrix extraMatrix) {
for (int i = 0; i < colorConversionMatrix.length; i++) {
colorConversionMatrix[i] |= extraMatrix.colorConversionMatrix[i];
}
for (int i = 0; i < colorRestrictionMatrix.length; i++) {
colorRestrictionMatrix[i] &= extraMatrix.colorRestrictionMatrix[i];
}
}
public void restoreColorReplacements() {
// By default each color can only be paid by itself ( {G} -> {G}, {C} -> {C}
for (int i = 0; i < colorConversionMatrix.length; i++) {
colorConversionMatrix[i] = identityMatrix[i];
}
// By default all mana types are unrestricted
for (int i = 0; i < colorRestrictionMatrix.length; i++) {
colorRestrictionMatrix[i] = ManaAtom.ALL_MANA_TYPES;
}
}
}

View File

@@ -1,36 +0,0 @@
package forge.game.mana;
import forge.card.mana.ManaAtom;
public class ManaConversionService {
static byte[] identityMatrix = { ManaAtom.WHITE, ManaAtom.BLUE, ManaAtom.BLACK, ManaAtom.RED, ManaAtom.GREEN, ManaAtom.COLORLESS };
IManaConversionMatrix matrix;
public ManaConversionService(IManaConversionMatrix mtrx) {
matrix = mtrx;
}
public void adjustColorReplacement(byte originalColor, byte replacementColor, boolean additive) {
// Fix the index without hardcodes
int rowIdx = ManaAtom.getIndexOfFirstManaType(originalColor);
rowIdx = rowIdx < 0 ? identityMatrix.length - 1 : rowIdx;
if (additive) {
matrix.colorConversionMatrix[rowIdx] |= replacementColor;
}
else {
matrix.colorRestrictionMatrix[rowIdx] &= replacementColor;
}
}
public void restoreColorReplacements() {
// By default each color can only be paid by itself ( {G} -> {G}, {C} -> {C}
for (int i = 0; i < matrix.colorConversionMatrix.length; i++) {
matrix.colorConversionMatrix[i] = identityMatrix[i];
}
// By default all mana types are unrestricted
for (int i = 0; i < matrix.colorRestrictionMatrix.length; i++) {
matrix.colorRestrictionMatrix[i] = ManaAtom.ALL_MANA_TYPES;
}
}
}

View File

@@ -47,13 +47,13 @@ import java.util.*;
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
public class ManaPool implements Iterable<Mana>, IManaConversionMatrix { public class ManaPool extends ManaConversionMatrix implements Iterable<Mana> {
private final Player owner; private final Player owner;
private final Multimap<Byte, Mana> floatingMana = ArrayListMultimap.create(); private final Multimap<Byte, Mana> floatingMana = ArrayListMultimap.create();
public ManaPool(final Player player) { public ManaPool(final Player player) {
owner = player; owner = player;
new ManaConversionService(this).restoreColorReplacements(); restoreColorReplacements();
} }
public final int getAmountOfColor(final byte color) { public final int getAmountOfColor(final byte color) {
@@ -352,7 +352,7 @@ public class ManaPool implements Iterable<Mana>, IManaConversionMatrix {
public byte getPossibleColorUses(byte color) { public byte getPossibleColorUses(byte color) {
// Take the current conversion value, AND with restrictions to get mana usage // Take the current conversion value, AND with restrictions to get mana usage
int rowIdx = ManaAtom.getIndexOfFirstManaType(color); int rowIdx = ManaAtom.getIndexOfFirstManaType(color);
int matrixIdx = rowIdx < 0 ? ManaConversionService.identityMatrix.length - 1 : rowIdx; int matrixIdx = rowIdx < 0 ? identityMatrix.length - 1 : rowIdx;
byte colorUse = colorConversionMatrix[matrixIdx]; byte colorUse = colorConversionMatrix[matrixIdx];
colorUse &= colorRestrictionMatrix[matrixIdx]; colorUse &= colorRestrictionMatrix[matrixIdx];

View File

@@ -20,6 +20,7 @@ import forge.game.cost.Cost;
import forge.game.cost.CostPart; import forge.game.cost.CostPart;
import forge.game.cost.CostPartMana; import forge.game.cost.CostPartMana;
import forge.game.mana.Mana; import forge.game.mana.Mana;
import forge.game.mana.ManaConversionMatrix;
import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementEffect;
import forge.game.spellability.*; import forge.game.spellability.*;
import forge.game.trigger.WrappedAbility; import forge.game.trigger.WrappedAbility;
@@ -218,9 +219,13 @@ public abstract class PlayerController {
public abstract void resetAtEndOfTurn(); // currently used by the AI to perform card memory cleanup public abstract void resetAtEndOfTurn(); // currently used by the AI to perform card memory cleanup
public final boolean payManaCost(CostPartMana costPartMana, SpellAbility sa, String prompt, boolean isActivatedAbility) { public final boolean payManaCost(CostPartMana costPartMana, SpellAbility sa, String prompt, boolean isActivatedAbility) {
return payManaCost(costPartMana.getManaCostFor(sa), costPartMana, sa, prompt, isActivatedAbility); return payManaCost(costPartMana, sa, prompt, null, isActivatedAbility);
} }
public abstract boolean payManaCost(ManaCost toPay, CostPartMana costPartMana, SpellAbility sa, String prompt, boolean isActivatedAbility);
public final boolean payManaCost(CostPartMana costPartMana, SpellAbility sa, String prompt, ManaConversionMatrix matrix, boolean isActivatedAbility) {
return payManaCost(costPartMana.getManaCostFor(sa), costPartMana, sa, prompt, matrix, isActivatedAbility);
}
public abstract boolean payManaCost(ManaCost toPay, CostPartMana costPartMana, SpellAbility sa, String prompt, ManaConversionMatrix matrix, boolean isActivatedAbility);
public abstract Map<Card, ManaCostShard> chooseCardsForConvokeOrImprovise(SpellAbility sa, ManaCost manaCost, CardCollectionView untappedCards, boolean improvise); public abstract Map<Card, ManaCostShard> chooseCardsForConvokeOrImprovise(SpellAbility sa, ManaCost manaCost, CardCollectionView untappedCards, boolean improvise);

View File

@@ -41,7 +41,6 @@ import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler; import forge.game.trigger.TriggerHandler;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.TextUtil; import forge.util.TextUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.*; import java.util.*;
@@ -481,7 +480,7 @@ public final class StaticAbilityContinuous {
} }
if (params.containsKey("ManaColorConversion")) { if (params.containsKey("ManaColorConversion")) {
AbilityUtils.applyManaColorConversion(p, params); AbilityUtils.applyManaColorConversion(p.getManaPool(), params);
} }
} }
} }

View File

@@ -30,6 +30,7 @@ import forge.game.cost.Cost;
import forge.game.cost.CostPart; import forge.game.cost.CostPart;
import forge.game.cost.CostPartMana; import forge.game.cost.CostPartMana;
import forge.game.mana.Mana; import forge.game.mana.Mana;
import forge.game.mana.ManaConversionMatrix;
import forge.game.mana.ManaCostBeingPaid; import forge.game.mana.ManaCostBeingPaid;
import forge.game.player.*; import forge.game.player.*;
import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementEffect;
@@ -586,7 +587,7 @@ public class PlayerControllerForTests extends PlayerController {
} }
@Override @Override
public boolean payManaCost(ManaCost toPay, CostPartMana costPartMana, SpellAbility sa, String prompt /* ai needs hints as well */, boolean isActivatedSa ) { public boolean payManaCost(ManaCost toPay, CostPartMana costPartMana, SpellAbility sa, String prompt /* ai needs hints as well */, ManaConversionMatrix matrix, boolean isActivatedSa) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
ManaCostBeingPaid cost = new ManaCostBeingPaid(toPay); ManaCostBeingPaid cost = new ManaCostBeingPaid(toPay);
return ComputerUtilMana.payManaCost(cost, sa, player); return ComputerUtilMana.payManaCost(cost, sa, player);

View File

@@ -1,6 +1,7 @@
package forge.match.input; package forge.match.input;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.mana.ManaConversionMatrix;
import forge.game.mana.ManaCostBeingPaid; import forge.game.mana.ManaCostBeingPaid;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
@@ -10,13 +11,16 @@ import forge.properties.ForgePreferences;
import forge.util.ITriggerEvent; import forge.util.ITriggerEvent;
public class InputPayManaOfCostPayment extends InputPayMana { public class InputPayManaOfCostPayment extends InputPayMana {
public InputPayManaOfCostPayment(final PlayerControllerHuman controller, ManaCostBeingPaid cost, SpellAbility spellAbility, Player payer) { public InputPayManaOfCostPayment(final PlayerControllerHuman controller, ManaCostBeingPaid cost, SpellAbility spellAbility, Player payer, ManaConversionMatrix matrix) {
super(controller, spellAbility, payer); super(controller, spellAbility, payer);
manaCost = cost; manaCost = cost;
extraMatrix = matrix;
applyMatrix();
} }
private static final long serialVersionUID = 3467312982164195091L; private static final long serialVersionUID = 3467312982164195091L;
private int phyLifeToLose = 0; private int phyLifeToLose = 0;
private ManaConversionMatrix extraMatrix;
@Override @Override
protected final void onPlayerSelected(Player selected, final ITriggerEvent triggerEvent) { protected final void onPlayerSelected(Player selected, final ITriggerEvent triggerEvent) {
@@ -47,6 +51,8 @@ public class InputPayManaOfCostPayment extends InputPayMana {
final String displayMana = manaCost.toString(false, player.getManaPool()); final String displayMana = manaCost.toString(false, player.getManaPool());
final StringBuilder msg = new StringBuilder(); final StringBuilder msg = new StringBuilder();
applyMatrix();
if (messagePrefix != null) { if (messagePrefix != null) {
msg.append(messagePrefix).append("\n"); msg.append(messagePrefix).append("\n");
} }
@@ -71,4 +77,12 @@ public class InputPayManaOfCostPayment extends InputPayMana {
return msg.toString(); return msg.toString();
} }
private void applyMatrix() {
if (extraMatrix == null) {
return;
}
player.getManaPool().applyCardMatrix(extraMatrix);
}
} }

View File

@@ -1,21 +1,8 @@
package forge.player; package forge.player;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import forge.game.cost.*;
import forge.game.spellability.LandAbility;
import forge.game.spellability.OptionalCostValue;
import forge.game.spellability.Spell;
import forge.util.TextUtil;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import forge.FThreads; import forge.FThreads;
import forge.card.mana.ManaCost; import forge.card.mana.ManaCost;
import forge.game.Game; import forge.game.Game;
@@ -25,30 +12,31 @@ import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType; import forge.game.ability.ApiType;
import forge.game.ability.effects.CharmEffect; import forge.game.ability.effects.CharmEffect;
import forge.game.ability.effects.FlipCoinEffect; import forge.game.ability.effects.FlipCoinEffect;
import forge.game.card.Card; import forge.game.card.*;
import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView;
import forge.game.card.CardDamageMap;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CardPredicates.Presets; import forge.game.card.CardPredicates.Presets;
import forge.game.card.CardView; import forge.game.cost.*;
import forge.game.card.CounterType; import forge.game.mana.ManaConversionMatrix;
import forge.game.mana.ManaCostBeingPaid; import forge.game.mana.ManaCostBeingPaid;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerController; import forge.game.player.PlayerController;
import forge.game.player.PlayerView; import forge.game.player.PlayerView;
import forge.game.spellability.SpellAbility; import forge.game.spellability.*;
import forge.game.spellability.TargetRestrictions;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.match.input.InputPayMana; import forge.match.input.InputPayMana;
import forge.match.input.InputPayManaOfCostPayment; import forge.match.input.InputPayManaOfCostPayment;
import forge.match.input.InputPayManaSimple; import forge.match.input.InputPayManaSimple;
import forge.match.input.InputSelectCardsFromList; import forge.match.input.InputSelectCardsFromList;
import forge.util.collect.FCollectionView;
import forge.util.Lang; import forge.util.Lang;
import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
import forge.util.gui.SGuiChoose; import forge.util.gui.SGuiChoose;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class HumanPlay { public class HumanPlay {
@@ -814,7 +802,7 @@ public class HumanPlay {
return !manaInputCancelled; return !manaInputCancelled;
} }
public static boolean payManaCost(final PlayerControllerHuman controller, final ManaCost realCost, final CostPartMana mc, final SpellAbility ability, final Player activator, String prompt, boolean isActivatedSa) { public static boolean payManaCost(final PlayerControllerHuman controller, final ManaCost realCost, final CostPartMana mc, final SpellAbility ability, final Player activator, String prompt, ManaConversionMatrix matrix, boolean isActivatedSa) {
final Card source = ability.getHostCard(); final Card source = ability.getHostCard();
ManaCostBeingPaid toPay = new ManaCostBeingPaid(realCost, mc.getRestiction()); ManaCostBeingPaid toPay = new ManaCostBeingPaid(realCost, mc.getRestiction());
@@ -879,7 +867,7 @@ public class HumanPlay {
} }
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, matrix);
inpPayment.setMessagePrefix(prompt); inpPayment.setMessagePrefix(prompt);
inpPayment.showAndWait(); inpPayment.showAndWait();
if (!inpPayment.isPaid()) { if (!inpPayment.isPaid()) {

View File

@@ -32,7 +32,6 @@ import forge.game.cost.CostPart;
import forge.game.cost.CostPartMana; import forge.game.cost.CostPartMana;
import forge.game.cost.CostPayment; import forge.game.cost.CostPayment;
import forge.game.keyword.KeywordInterface; import forge.game.keyword.KeywordInterface;
import forge.game.mana.ManaConversionService;
import forge.game.mana.ManaPool; import forge.game.mana.ManaPool;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerController; import forge.game.player.PlayerController;
@@ -76,7 +75,6 @@ public class HumanPlaySpellAbility {
final Card c = ability.getHostCard(); final Card c = ability.getHostCard();
final CardPlayOption option = c.mayPlay(ability.getMayPlay()); final CardPlayOption option = c.mayPlay(ability.getMayPlay());
ManaConversionService service = new ManaConversionService(manapool);
boolean manaTypeConversion = false; boolean manaTypeConversion = false;
boolean manaColorConversion = false; boolean manaColorConversion = false;
@@ -118,13 +116,15 @@ public class HumanPlaySpellAbility {
ability.resetPaidHash(); ability.resetPaidHash();
} }
// TODO Apply this to the SAStackInstance instead of the Player
if (manaTypeConversion) { if (manaTypeConversion) {
AbilityUtils.applyManaColorConversion(human, MagicColor.Constant.ANY_TYPE_CONVERSION); AbilityUtils.applyManaColorConversion(payment, MagicColor.Constant.ANY_TYPE_CONVERSION);
} else if (manaColorConversion) { } else if (manaColorConversion) {
AbilityUtils.applyManaColorConversion(human, MagicColor.Constant.ANY_COLOR_CONVERSION); AbilityUtils.applyManaColorConversion(payment, MagicColor.Constant.ANY_COLOR_CONVERSION);
} }
if (playerManaConversion) { if (playerManaConversion) {
AbilityUtils.applyManaColorConversion(human, MagicColor.Constant.ANY_COLOR_CONVERSION); AbilityUtils.applyManaColorConversion(manapool, MagicColor.Constant.ANY_COLOR_CONVERSION);
human.incNumManaConversion(); human.incNumManaConversion();
} }
@@ -142,7 +142,7 @@ public class HumanPlaySpellAbility {
} }
if (keywordColor) { if (keywordColor) {
AbilityUtils.applyManaColorConversion(human, params); AbilityUtils.applyManaColorConversion(payment, params);
} }
} }
@@ -167,10 +167,10 @@ public class HumanPlaySpellAbility {
} }
if (manaTypeConversion || manaColorConversion || keywordColor) { if (manaTypeConversion || manaColorConversion || keywordColor) {
service.restoreColorReplacements(); manapool.restoreColorReplacements();
} }
if (playerManaConversion) { if (playerManaConversion) {
service.restoreColorReplacements(); manapool.restoreColorReplacements();
human.decNumManaConversion(); human.decNumManaConversion();
} }
return false; return false;
@@ -193,7 +193,7 @@ public class HumanPlaySpellAbility {
clearTargets(ability); clearTargets(ability);
} }
if (manaTypeConversion || manaColorConversion || keywordColor) { if (manaTypeConversion || manaColorConversion || keywordColor) {
service.restoreColorReplacements(); manapool.restoreColorReplacements();
} }
} }
return true; return true;

View File

@@ -31,6 +31,7 @@ import forge.game.cost.CostPart;
import forge.game.cost.CostPartMana; import forge.game.cost.CostPartMana;
import forge.game.keyword.Keyword; import forge.game.keyword.Keyword;
import forge.game.mana.Mana; import forge.game.mana.Mana;
import forge.game.mana.ManaConversionMatrix;
import forge.game.player.*; import forge.game.player.*;
import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementEffect;
import forge.game.replacement.ReplacementLayer; import forge.game.replacement.ReplacementLayer;
@@ -1702,8 +1703,8 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
@Override @Override
public boolean payManaCost(final ManaCost toPay, final CostPartMana costPartMana, final SpellAbility sa, public boolean payManaCost(final ManaCost toPay, final CostPartMana costPartMana, final SpellAbility sa,
final String prompt, final boolean isActivatedSa) { final String prompt, ManaConversionMatrix matrix, final boolean isActivatedSa) {
return HumanPlay.payManaCost(this, toPay, costPartMana, sa, player, prompt, isActivatedSa); return HumanPlay.payManaCost(this, toPay, costPartMana, sa, player, prompt, matrix, isActivatedSa);
} }
@Override @Override