package magic.model.choice;
import java.util.Arrays;
import java.util.LinkedList;
import magic.model.MagicGame;
import magic.model.MagicMappable;
import magic.model.MurmurHash3;
import magic.model.score.MagicScoreResult;
/** First creature in array is the attacker, the other creatures are blockers. */
@SuppressWarnings("serial")
public class MagicDeclareBlockersResult extends LinkedList<MagicCombatCreature[]> implements MagicMappable<MagicDeclareBlockersResult>, MagicScoreResult {
private final int position;
private final int score;
MagicDeclareBlockersResult(final int position,final int score) {
this.position=position;
this.score=score;
}
MagicDeclareBlockersResult(final MagicDeclareBlockersResult result,final int position,final int score) {
this(position,score);
for (final MagicCombatCreature[] creatures : result) {
add(Arrays.copyOf(creatures,creatures.length));
}
}
@Override
public MagicDeclareBlockersResult map(final MagicGame game) {
final MagicDeclareBlockersResult result=new MagicDeclareBlockersResult(position,score);
for (final MagicCombatCreature[] creatures : this) {
final int size=creatures.length;
final MagicCombatCreature[] mappedCreatures=new MagicCombatCreature[size];
for (int index=size-1;index>=0;index--) {
mappedCreatures[index]=new MagicCombatCreature(game,creatures[index]);
}
result.add(mappedCreatures);
}
return result;
}
@Override
public int getPosition() {
return position;
}
@Override
public int getScore() {
return score;
}
@Override
public String toString() {
final StringBuilder builder=new StringBuilder();
builder.append('S');
builder.append(score);
for (final MagicCombatCreature[] creatures : this) {
if (creatures.length>1) {
builder.append(' ');
builder.append(creatures[0].getName());
builder.append('=');
builder.append(creatures[1].getName());
builder.append(creatures.length > 2 ? "+" + (creatures.length-2) : "");
}
}
return builder.toString();
}
@Override
public long getId() {
int size = 0;
for (final MagicCombatCreature[] creatures : this) {
size += creatures.length;
}
final long[] keys = new long[size];
int idx = 0;
for (final MagicCombatCreature[] creatures : this) {
for (final MagicCombatCreature creature : creatures) {
keys[idx] = creature.permanent.getStateId();
idx++;
}
}
return MurmurHash3.hash(keys);
}
}