package magic.model.target; import magic.ai.ArtificialScoringSystem; import magic.model.MagicAbility; import magic.model.MagicGame; import magic.model.MagicPermanent; import magic.model.MagicPlayer; import magic.model.MagicAmount; import magic.model.MagicAmountFactory; import magic.model.event.MagicEvent; import magic.exception.GameException; /** Creature permanent or player. Can be your own creatures. */ public class MagicDamageTargetPicker extends MagicTargetPicker<MagicTarget> { private int amount; private final boolean noRegeration; private final MagicAmount count; public MagicDamageTargetPicker(final int aAmount, final boolean aNoRegeneration, final MagicAmount aCount) { amount = aAmount; noRegeration = aNoRegeneration; count = aCount; } public MagicDamageTargetPicker(final int amount, final boolean noRegeneration) { this(amount, noRegeneration, MagicAmountFactory.One); } public MagicDamageTargetPicker(final int amount) { this(amount, false); } // use by card script effect public MagicDamageTargetPicker(final MagicAmount count) { this(-1, false, count); } @Override protected void setEvent(final MagicEvent event) { if (amount < 0 || count.isConstant() == false) { amount = count.getAmount(event); } } @Override protected int getTargetScore(final MagicGame game,final MagicPlayer player,final MagicTarget target) { // Player if (target.isPlayer()) { final MagicPlayer targetPlayer=(MagicPlayer)target; final int actualAmount=amount-targetPlayer.getPreventDamage(); if (actualAmount<=0) { return 0; } final int life=targetPlayer.getLife(); final int score; if (life>actualAmount) { score=ArtificialScoringSystem.getLifeScore(life)-ArtificialScoringSystem.getLifeScore(life-actualAmount); } else { score=ArtificialScoringSystem.WIN_GAME_SCORE; } return targetPlayer==player?-score:score; } else if (target.isPermanent()) { // Permanent final MagicPermanent permanent=(MagicPermanent)target; if (permanent.hasAbility(MagicAbility.Indestructible)) { return 0; } if (permanent.isRegenerated()&&!noRegeration) { return 0; } final int actualAmount=amount-permanent.getPreventDamage(); if (actualAmount<=0) { return 0; } final int leftToughness=permanent.getToughness()-permanent.getDamage()-actualAmount; final int score=leftToughness<=0?permanent.getScore():20-leftToughness; return permanent.getController()==player?-score:score; } else { throw new GameException("target is neither MagicPlayer nor MagicPermanent", game); } } }