package magic.model.action;
import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.MagicPermanentList;
import magic.model.MagicPermanentState;
public class RemoveFromCombatAction extends MagicAction {
private final MagicPermanent permanent;
private boolean attacking;
private boolean blocking;
private MagicPermanentList blockingCreatures;
private MagicPermanent blockedCreature = MagicPermanent.NONE;
public RemoveFromCombatAction(final MagicPermanent permanent) {
this.permanent=permanent;
}
@Override
public void doAction(final MagicGame game) {
attacking=permanent.hasState(MagicPermanentState.Attacking);
blocking=permanent.hasState(MagicPermanentState.Blocking);
if (attacking) {
game.doAction(ChangeStateAction.Clear(permanent,MagicPermanentState.Attacking));
game.doAction(ChangeStateAction.Clear(permanent,MagicPermanentState.Blocked));
game.doAction(ChangeStateAction.Clear(permanent,MagicPermanentState.DealtFirstStrike));
blockingCreatures=new MagicPermanentList(permanent.getBlockingCreatures());
permanent.removeBlockingCreatures();
for (final MagicPermanent blockingCreature : blockingCreatures) {
blockingCreature.setBlockedCreature(MagicPermanent.NONE);
}
} else if (blocking) {
game.doAction(ChangeStateAction.Clear(permanent,MagicPermanentState.Blocking));
game.doAction(ChangeStateAction.Clear(permanent,MagicPermanentState.DealtFirstStrike));
blockedCreature=permanent.getBlockedCreature();
if (blockedCreature.isValid()) {
permanent.setBlockedCreature(MagicPermanent.NONE);
blockingCreatures=new MagicPermanentList(blockedCreature.getBlockingCreatures());
blockedCreature.removeBlockingCreature(permanent);
}
}
game.setStateCheckRequired();
}
@Override
public void undoAction(final MagicGame game) {
if (attacking) {
for (final MagicPermanent blockingCreature : blockingCreatures) {
permanent.addBlockingCreature(blockingCreature);
blockingCreature.setBlockedCreature(permanent);
}
} else if (blocking) {
permanent.setBlockedCreature(blockedCreature);
if (blockedCreature.isValid()) {
blockedCreature.setBlockingCreatures(blockingCreatures);
}
}
}
@Override
public String toString() {
return super.toString()+" ("+permanent.getName()+')';
}
}