package magic.model.choice;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.MagicPlayer;
public class MagicCombatCreatureBuilder {
private static final Comparator<MagicCombatCreature> ATTACKER_COMPARATOR=new Comparator<MagicCombatCreature>() {
@Override
public int compare(final MagicCombatCreature attacker1,final MagicCombatCreature attacker2) {
final int adif=attacker1.attackerScore-attacker2.attackerScore;
if (adif!=0) {
return adif;
}
final int sdif=attacker1.score-attacker2.score;
if (sdif!=0) {
return sdif;
}
return attacker1.permanent.compareTo(attacker2.permanent);
}
};
private final MagicGame game;
private final MagicPlayer attackingPlayer;
private final MagicPlayer defendingPlayer;
private SortedSet<MagicCombatCreature> attackers;
private Set<MagicCombatCreature> blockers;
MagicCombatCreatureBuilder(final MagicGame game, final MagicPlayer attackingPlayer, final MagicPlayer defendingPlayer) {
this.game=game;
this.attackingPlayer=attackingPlayer;
this.defendingPlayer=defendingPlayer;
}
/** Must be called before building attackers. */
boolean buildBlockers() {
blockers=new HashSet<MagicCombatCreature>();
for (final MagicPermanent permanent : defendingPlayer.getPermanents()) {
if (permanent.canBlock()) {
blockers.add(new MagicCombatCreature(permanent));
}
}
return blockers.size()>0;
}
private MagicCombatCreature createAttacker(final MagicPermanent permanent) {
final MagicCombatCreature attacker=new MagicCombatCreature(permanent);
attacker.setAttacker(game,blockers);
return attacker;
}
boolean buildAttackers() {
attackers=new TreeSet<MagicCombatCreature>(ATTACKER_COMPARATOR);
for (final MagicPermanent permanent : attackingPlayer.getPermanents()) {
if (permanent.canAttack()) {
attackers.add(createAttacker(permanent));
}
}
return attackers.size()>0;
}
boolean buildBlockableAttackers() {
attackers=new TreeSet<MagicCombatCreature>(ATTACKER_COMPARATOR);
for (final MagicPermanent permanent : attackingPlayer.getPermanents()) {
if (permanent.isAttacking()&&permanent.canBeBlocked(defendingPlayer)) {
final MagicCombatCreature attacker=createAttacker(permanent);
if (attacker.candidateBlockers.length>0) {
attackers.add(attacker);
}
}
}
return attackers.size()>0;
}
SortedSet<MagicCombatCreature> getAttackers() {
return attackers;
}
Set<MagicCombatCreature> getBlockers() {
return blockers;
}
Set<MagicPermanent> getCandidateBlockers() {
final Set<MagicPermanent> candidateBlockers=new HashSet<MagicPermanent>();
for (final MagicCombatCreature attacker : attackers) {
for (final MagicCombatCreature blocker : attacker.candidateBlockers) {
candidateBlockers.add(blocker.permanent);
}
}
return candidateBlockers;
}
Set<MagicPermanent> getBlockableAttackers(final MagicPermanent blocker) {
final Set<MagicPermanent> blockableAttackers=new HashSet<MagicPermanent>();
for (final MagicCombatCreature attacker : attackers) {
for (final MagicCombatCreature candidateBlocker : attacker.candidateBlockers) {
if (candidateBlocker.permanent==blocker) {
blockableAttackers.add(attacker.permanent);
break;
}
}
}
return blockableAttackers;
}
}