mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 18:28:00 +00:00
Pull ManaConversion out to be reused for SpellAbilityStackInstance
This commit is contained in:
@@ -29,6 +29,7 @@ import forge.game.ability.effects.AttachEffect;
|
||||
import forge.game.card.*;
|
||||
import forge.game.event.*;
|
||||
import forge.game.keyword.KeywordInterface;
|
||||
import forge.game.mana.ManaConversionService;
|
||||
import forge.game.player.GameLossReason;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.replacement.ReplacementEffect;
|
||||
@@ -786,7 +787,7 @@ public class GameAction {
|
||||
game.getReplacementHandler().cleanUpTemporaryReplacements();
|
||||
|
||||
for (final Player p : game.getPlayers()) {
|
||||
p.getManaPool().restoreColorReplacements();
|
||||
new ManaConversionService(p.getManaPool()).restoreColorReplacements();
|
||||
p.clearStaticAbilities();
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ import forge.game.ability.AbilityFactory.AbilityRecordType;
|
||||
import forge.game.card.*;
|
||||
import forge.game.cost.Cost;
|
||||
import forge.game.keyword.KeywordInterface;
|
||||
import forge.game.mana.ManaConversionService;
|
||||
import forge.game.mana.ManaCostBeingPaid;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.player.PlayerCollection;
|
||||
@@ -1663,7 +1664,7 @@ public class AbilityUtils {
|
||||
}
|
||||
}
|
||||
// AdjustColorReplacement has two different matrices handling final mana conversion under the covers
|
||||
p.getManaPool().adjustColorReplacement(ManaAtom.fromName(c), convertByte, additive);
|
||||
new ManaConversionService(p.getManaPool()).adjustColorReplacement(ManaAtom.fromName(c), convertByte, additive);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
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];
|
||||
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,6 @@ package forge.game.mana;
|
||||
import com.google.common.collect.ArrayListMultimap;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Multimap;
|
||||
|
||||
import forge.GameCommand;
|
||||
import forge.card.MagicColor;
|
||||
import forge.card.mana.ManaAtom;
|
||||
@@ -36,14 +35,9 @@ import forge.game.player.Player;
|
||||
import forge.game.spellability.AbilityManaPart;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@@ -53,13 +47,13 @@ import java.util.List;
|
||||
* @author Forge
|
||||
* @version $Id$
|
||||
*/
|
||||
public class ManaPool implements Iterable<Mana> {
|
||||
public class ManaPool implements Iterable<Mana>, IManaConversionMatrix {
|
||||
private final Player owner;
|
||||
private final Multimap<Byte, Mana> floatingMana = ArrayListMultimap.create();
|
||||
|
||||
public ManaPool(final Player player) {
|
||||
owner = player;
|
||||
restoreColorReplacements();
|
||||
new ManaConversionService(this).restoreColorReplacements();
|
||||
}
|
||||
|
||||
public final int getAmountOfColor(final byte color) {
|
||||
@@ -355,39 +349,10 @@ public class ManaPool implements Iterable<Mana> {
|
||||
p.getGame().fireEvent(new GameEventZone(ZoneType.Battlefield, p, EventValueChangeType.ComplexUpdate, null));
|
||||
}
|
||||
|
||||
// Conversion matrix ORs byte values to make mana more payable
|
||||
// Restrictive matrix ANDs byte values to make mana less payable
|
||||
private final byte[] colorConversionMatrix = new byte[ManaAtom.MANATYPES.length];
|
||||
private final byte[] colorRestrictionMatrix = new byte[ManaAtom.MANATYPES.length];
|
||||
private static final byte[] identityMatrix = { ManaAtom.WHITE, ManaAtom.BLUE, ManaAtom.BLACK, ManaAtom.RED, ManaAtom.GREEN, ManaAtom.COLORLESS };
|
||||
|
||||
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 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;
|
||||
}
|
||||
}
|
||||
|
||||
public byte getPossibleColorUses(byte color) {
|
||||
// Take the current conversion value, AND with restrictions to get mana usage
|
||||
int rowIdx = ManaAtom.getIndexOfFirstManaType(color);
|
||||
int matrixIdx = rowIdx < 0 ? identityMatrix.length - 1 : rowIdx;
|
||||
int matrixIdx = rowIdx < 0 ? ManaConversionService.identityMatrix.length - 1 : rowIdx;
|
||||
|
||||
byte colorUse = colorConversionMatrix[matrixIdx];
|
||||
colorUse &= colorRestrictionMatrix[matrixIdx];
|
||||
|
||||
@@ -17,14 +17,8 @@
|
||||
*/
|
||||
package forge.player;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
import forge.card.CardStateName;
|
||||
import forge.card.CardType;
|
||||
import forge.card.MagicColor;
|
||||
@@ -38,16 +32,17 @@ import forge.game.cost.CostPart;
|
||||
import forge.game.cost.CostPartMana;
|
||||
import forge.game.cost.CostPayment;
|
||||
import forge.game.keyword.KeywordInterface;
|
||||
import forge.game.mana.ManaConversionService;
|
||||
import forge.game.mana.ManaPool;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.player.PlayerController;
|
||||
import forge.game.spellability.AbilityActivated;
|
||||
import forge.game.spellability.AbilitySub;
|
||||
import forge.game.spellability.Spell;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.spellability.TargetRestrictions;
|
||||
import forge.game.spellability.*;
|
||||
import forge.game.zone.Zone;
|
||||
import forge.util.collect.FCollection;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@@ -81,6 +76,7 @@ public class HumanPlaySpellAbility {
|
||||
final Card c = ability.getHostCard();
|
||||
final CardPlayOption option = c.mayPlay(ability.getMayPlay());
|
||||
|
||||
ManaConversionService service = new ManaConversionService(manapool);
|
||||
boolean manaTypeConversion = false;
|
||||
boolean manaColorConversion = false;
|
||||
|
||||
@@ -169,11 +165,12 @@ public class HumanPlaySpellAbility {
|
||||
ability.getHostCard().unanimateBestow();
|
||||
}
|
||||
}
|
||||
|
||||
if (manaTypeConversion || manaColorConversion || keywordColor) {
|
||||
manapool.restoreColorReplacements();
|
||||
service.restoreColorReplacements();
|
||||
}
|
||||
if (playerManaConversion) {
|
||||
manapool.restoreColorReplacements();
|
||||
service.restoreColorReplacements();
|
||||
human.decNumManaConversion();
|
||||
}
|
||||
return false;
|
||||
@@ -196,7 +193,7 @@ public class HumanPlaySpellAbility {
|
||||
clearTargets(ability);
|
||||
}
|
||||
if (manaTypeConversion || manaColorConversion || keywordColor) {
|
||||
manapool.restoreColorReplacements();
|
||||
service.restoreColorReplacements();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user