package magic.model.choice;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import magic.model.MagicGame;
import magic.model.MagicMappable;
import magic.model.MagicPermanent;
import magic.model.MagicPermanentState;
import magic.model.MurmurHash3;
import magic.model.action.ChangeStateAction;
public class MagicExcludeResult implements MagicMappable<MagicExcludeResult> {
private static final List<MagicPermanent> NO_EXCLUDE_PERMANENTS=Collections.emptyList();
private final List<MagicPermanent> excludePermanents;
private final int excludeFlags;
MagicExcludeResult(final List<MagicPermanent> excludePermanents,final int excludeFlags) {
this.excludePermanents=excludePermanents;
this.excludeFlags=excludeFlags;
}
MagicExcludeResult() {
this(NO_EXCLUDE_PERMANENTS,0);
}
@Override
public MagicExcludeResult map(final MagicGame game) {
final List<MagicPermanent> mappedExcludePermanents=new ArrayList<MagicPermanent>();
for (final MagicPermanent excludePermanent : excludePermanents) {
mappedExcludePermanents.add(excludePermanent.map(game));
}
return new MagicExcludeResult(mappedExcludePermanents,excludeFlags);
}
public void exclude(final MagicGame game) {
final int size=excludePermanents.size();
for (int index=0,flag=1;index<size;index++,flag<<=1) {
final MagicPermanent permanent=excludePermanents.get(index);
final boolean excludeFromCombat=(excludeFlags&flag)==0;
if (excludeFromCombat) {
game.doAction(ChangeStateAction.Set(permanent,MagicPermanentState.ExcludeFromCombat));
game.doAction(ChangeStateAction.Clear(permanent,MagicPermanentState.ExcludeManaSource));
} else {
game.doAction(ChangeStateAction.Clear(permanent,MagicPermanentState.ExcludeFromCombat));
game.doAction(ChangeStateAction.Set(permanent,MagicPermanentState.ExcludeManaSource));
}
}
}
@Override
public String toString() {
final StringBuilder buffer=new StringBuilder();
for (int index=0,flag=1;index<excludePermanents.size();index++,flag<<=1) {
if (buffer.length()>0) {
buffer.append(", ");
}
final boolean combat=(excludeFlags&flag)==0;
buffer.append(excludePermanents.get(index)).append('=').append(combat?"C":"M");
}
return buffer.toString();
}
@Override
public long getId() {
final long[] keys = new long[excludePermanents.size() + 1];
int idx = 0;
for (final MagicPermanent permanent : excludePermanents) {
keys[idx] = permanent.getStateId();
idx++;
}
keys[idx] = excludeFlags;
idx++;
return MurmurHash3.hash(keys);
}
}