color conversion routine for mana implemented

This commit is contained in:
Maxmtg
2014-02-08 12:21:55 +00:00
parent c5a791f361
commit 715ee1f9ab
3 changed files with 38 additions and 8 deletions

View File

@@ -85,6 +85,14 @@ public class MagicColor {
}
}
public static int getIndexOfFirstColor(byte color){
for(int i = 0; i < NUMBER_OR_COLORS; i++) {
if ((color & WUBRG[i]) != 0)
return i;
}
return -1; // colorless
}
/**
* The Interface Color.
*/

View File

@@ -65,6 +65,7 @@ public class ManaPool {
*/
public ManaPool(final Player player) {
owner = player;
restoreColorReplacements();
}
public final int getAmountOfColor(final byte color) {
@@ -416,8 +417,25 @@ public class ManaPool {
p.getGame().fireEvent(new GameEventZone(ZoneType.Battlefield, p, EventValueChangeType.ComplexUpdate, null));
}
private byte[] colorConversionMatrix = new byte[6];
private static final byte[] identityMatrix = { MagicColor.WHITE, MagicColor.BLUE, MagicColor.BLACK, MagicColor.RED, MagicColor.GREEN, 0 };
public void restoreColorReplacements() {
for(int i = 0; i < colorConversionMatrix.length; i++)
colorConversionMatrix[i] = identityMatrix[i];
}
public boolean canPayForShardWithColor(ManaCostShard shard, byte color) {
// add color changing manipulations here
return shard.canBePaidWithManaOfColor(color);
int rowIdx = MagicColor.getIndexOfFirstColor(color);
byte line = colorConversionMatrix[rowIdx < 0 ? identityMatrix.length - 1 : rowIdx];
for(int i = 0; i < MagicColor.NUMBER_OR_COLORS; i++)
{
byte outColor = MagicColor.WUBRG[i];
if (( line & outColor) != 0 && shard.canBePaidWithManaOfColor(outColor))
return true;
}
return shard.canBePaidWithManaOfColor((byte)0);
}
}

View File

@@ -110,7 +110,11 @@ public abstract class InputPayMana extends InputSyncronizedBase {
if (manaCost.isAnyPartPayableWith(color, player.getManaPool())) { colorCanUse |= color; }
if (manaCost.needsColor(color, player.getManaPool())) { colorNeeded |= color; }
}
boolean canUseColorless = manaCost.isAnyPartPayableWith((byte)0, player.getManaPool());
if (manaCost.isAnyPartPayableWith(MagicColor.COLORLESS, player.getManaPool()))
colorCanUse |= MagicColor.COLORLESS;
if ( 0 == colorCanUse ) // no mana cost or something
return;
List<SpellAbility> abilities = new ArrayList<SpellAbility>();
// you can't remove unneeded abilities inside a for (am:abilities) loop :(
@@ -126,7 +130,7 @@ public abstract class InputPayMana extends InputSyncronizedBase {
AbilityManaPart m = ma.getManaPartRecursive();
if (m == null || !ma.canPlay()) { continue; }
if (!canUseColorless && !abilityProducesManaColor(ma, m, colorCanUse)) { continue; }
if (!abilityProducesManaColor(ma, m, colorCanUse)) { continue; }
if (ma.isAbility() && ma.getRestrictions().isInstantSpeed()) { continue; }
if (!m.meetsManaRestrictions(saPaidFor)) { continue; }
@@ -216,7 +220,7 @@ public abstract class InputPayMana extends InputSyncronizedBase {
* @return a boolean.
*/
private static boolean abilityProducesManaColor(final SpellAbility am, AbilityManaPart m, final byte neededColor) {
if (neededColor == 0) {
if (0 != (neededColor & MagicColor.COLORLESS)) {
return true;
}