package magic.model.choice; import magic.model.MagicGame; import magic.model.MagicManaType; import magic.model.MagicCopyMap; import magic.model.MagicPlayer; import magic.model.event.MagicSourceManaActivation; import magic.model.event.MagicSourceManaActivationResult; import java.util.Arrays; import java.util.List; public class MagicBuilderPayManaCostResult implements MagicPayManaCostResult, Comparable<MagicBuilderPayManaCostResult> { private MagicSourceManaActivationResult[] results; private short[] amountLeft; private int weight; private int count; private int x; private int hashCode; MagicBuilderPayManaCostResult(final List<MagicSourceManaActivation> sourceActivations) { count=0; x=0; amountLeft=new short[MagicManaType.NR_OF_TYPES]; for (final MagicSourceManaActivation activation : sourceActivations) { if (activation.available) { for (int index=0;index<MagicManaType.NR_OF_TYPES;index++) { if (activation.activations[index]!=null) { amountLeft[index]++; } } } else { count++; weight+=activation.getWeight(); } } hashCode=Arrays.hashCode(amountLeft); } private MagicBuilderPayManaCostResult() {} private MagicBuilderPayManaCostResult(final MagicCopyMap copyMap, final MagicBuilderPayManaCostResult source) { results = copyMap.copyObjects(source.results, MagicSourceManaActivationResult.class); amountLeft = Arrays.copyOf(source.amountLeft,source.amountLeft.length); weight = source.weight; count = source.count; x = source.x; hashCode = source.hashCode; } @Override public MagicBuilderPayManaCostResult copy(final MagicCopyMap copyMap) { return new MagicBuilderPayManaCostResult(copyMap, this); } @Override public MagicBuilderPayManaCostResult map(final MagicGame game) { final MagicBuilderPayManaCostResult result=new MagicBuilderPayManaCostResult(); result.results=new MagicSourceManaActivationResult[results.length]; for (int index=0;index<results.length;index++) { result.results[index]=results[index].map(game); } result.amountLeft=Arrays.copyOf(amountLeft,amountLeft.length); result.weight=weight; result.count=count; result.x=x; result.hashCode=hashCode; return result; } /** Finishes construction when needed. */ void buildResults(final List<MagicSourceManaActivation> sourceActivations,final MagicBuilderManaCost cost) { x=cost.getX(count); results=new MagicSourceManaActivationResult[count]; int index=0; for (final MagicSourceManaActivation activation : sourceActivations) { if (!activation.available) { results[index++]=activation.getResult(); } } } int getWeight() { return weight; } @Override public int getX() { return x; } @Override public int getConverted() { return count; } public void doAction(final MagicGame game,final MagicPlayer player) { for (final MagicSourceManaActivationResult result : results) { result.doActivation(game); } } public String getText() { final StringBuilder builder=new StringBuilder(); builder.append('c').append(count); builder.append('-'); builder.append('w').append(weight); builder.append('-'); builder.append('x').append(x); for (final int amount : amountLeft) { builder.append('-').append(amount); } return builder.toString(); } @Override public String toString() { return x > 0 ? "X is " + x : ""; } @Override public int hashCode() { return hashCode; } @Override public boolean equals(final Object obj) { if (this==obj) { return true; } if (obj==null||getClass()!=obj.getClass()) { return false; } final MagicBuilderPayManaCostResult other=(MagicBuilderPayManaCostResult)obj; return Arrays.equals(amountLeft,other.amountLeft); } @Override public int compareTo(final MagicBuilderPayManaCostResult result) { for (int index=0;index<MagicManaType.NR_OF_TYPES;index++) { final int dif=amountLeft[index]-result.amountLeft[index]; if (dif!=0) { return dif; } } return 0; } @Override public long getId() { return hashCode; } }