package magic.model.choice;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import magic.exception.UndoClickedException;
import magic.model.IUIGameController;
import magic.model.MagicAbility;
import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.MagicPermanentState;
import magic.model.MagicPlayer;
import magic.model.MagicRandom;
import magic.model.MagicSource;
import magic.model.event.MagicEvent;
import magic.translate.StringContext;
public class MagicDeclareAttackersChoice extends MagicChoice {
// translatable UI text (prefix with _S).
private static final String _S1 = "Declare attackers.";
@StringContext(eg = "{f} will be replaced by an icon. | represents a new line.")
private static final String _S2 = "Click on a creature to declare as attacker or remove it from combat.|Press {f} to continue.";
private static final MagicDeclareAttackersChoice INSTANCE = new MagicDeclareAttackersChoice();
private MagicDeclareAttackersChoice() {
super(_S1);
}
@Override
Collection<Object> getArtificialOptions(final MagicGame game, final MagicEvent event) {
final MagicPlayer player = event.getPlayer();
return MagicDeclareAttackersResultBuilder.buildResults(game,player);
}
@Override
public Object[] getSimulationChoiceResult(final MagicGame game, final MagicEvent event) {
final MagicPlayer player = event.getPlayer();
final MagicDeclareAttackersResult result = new MagicDeclareAttackersResult();
final MagicCombatCreatureBuilder builder = new MagicCombatCreatureBuilder(game,player,player.getOpponent());
builder.buildBlockers();
if (builder.buildAttackers()) {
for (final MagicCombatCreature attacker : builder.getAttackers()) {
if (attacker.hasAbility(MagicAbility.AttacksEachTurnIfAble) ||
MagicRandom.nextRNGInt(2) == 1) {
//creatures must attack OR
//creature has 50% chance of attacking
result.add(attacker.permanent);
}
}
}
return new Object[]{result};
}
@Override
public Object[] getPlayerChoiceResults(final IUIGameController controller, final MagicGame game, final MagicEvent event) throws UndoClickedException {
final MagicPlayer player = event.getPlayer();
final MagicSource source = event.getSource();
final MagicDeclareAttackersResult result=new MagicDeclareAttackersResult();
final MagicCombatCreatureBuilder builder=new MagicCombatCreatureBuilder(game,player,player.getOpponent());
builder.buildBlockers();
final Set<Object> validChoices=new HashSet<Object>();
if (builder.buildAttackers()) {
for (final MagicCombatCreature attacker : builder.getAttackers()) {
if (attacker.hasAbility(MagicAbility.AttacksEachTurnIfAble)) {
attacker.permanent.setState(MagicPermanentState.Attacking);
result.add(attacker.permanent);
} else {
validChoices.add(attacker.permanent);
}
}
}
if (validChoices.isEmpty() && MagicGame.canSkipSingleChoice()) {
return new Object[]{result};
}
controller.focusViewers(-1);
controller.showMessage(source, _S2);
controller.setValidChoices(validChoices,true);
controller.enableForwardButton();
controller.updateGameView();
try {
while (true) {
controller.waitForInput();
if (controller.isActionClicked()) {
break;
}
final MagicPermanent attacker = controller.getChoiceClicked();
if (attacker.isAttacking()) {
attacker.clearState(MagicPermanentState.Attacking);
result.remove(attacker);
} else {
attacker.setState(MagicPermanentState.Attacking);
result.add(attacker);
}
controller.updateGameView();
}
} finally {
// Cleanup
for (final MagicCombatCreature creature : builder.getAttackers()) {
creature.permanent.clearState(MagicPermanentState.Attacking);
}
}
game.snapshot();
return new Object[]{result};
}
public static MagicDeclareAttackersChoice getInstance() {
return INSTANCE;
}
}