package magic.model.target; import magic.model.MagicAbility; import magic.model.MagicGame; import magic.model.MagicPermanent; import magic.model.MagicPlayer; public class MagicLifelinkTargetPicker extends MagicTargetPicker<MagicPermanent> { private static final MagicLifelinkTargetPicker INSTANCE = new MagicLifelinkTargetPicker(); private static final int ATTACKING_UNBLOCKED = 5<<8; private static final int BLOCKED_OR_BLOCKING = 4<<8; private static final int CAN_TAP = 3<<8; private static final int DOUBLE_STRIKE = 2<<8; private static final int FIRST_STRIKE = 1<<8; private MagicLifelinkTargetPicker() {} public static MagicLifelinkTargetPicker create() { return INSTANCE; } @Override protected int getTargetScore(final MagicGame game,final MagicPlayer player,final MagicPermanent permanent) { int score = 0; // no score for ability overlap or not being able to deal combat damage if (permanent.hasAbility(MagicAbility.Lifelink) || permanent.hasAbility(MagicAbility.CannotAttackOrBlock)) { return 0; } if (permanent.isAttacking()) { if (!permanent.isBlocked()) { // unblocked attacker has the highest chance of gaining life score = ATTACKING_UNBLOCKED; } else { // possible to not gain life when blocker has first strike score = BLOCKED_OR_BLOCKING; } } else if (permanent.isBlocking()) { // possible to not gain life when attacker has first strike score = BLOCKED_OR_BLOCKING; } else if (permanent.canTap()) { // can be in combat later or possibly use a damage ability score = CAN_TAP; } if (permanent.hasAbility(MagicAbility.DoubleStrike)) { // chance to deal combat damage twice score += DOUBLE_STRIKE; } if (permanent.hasAbility(MagicAbility.FirstStrike)) { // higher chance to deal combat damage score += FIRST_STRIKE; } return permanent.getPower() + score; } }