magarena/src/magic/model/MagicAmountFactory.java

214 lines
7.2 KiB
Java

package magic.model;
import magic.model.event.MagicEvent;
import magic.model.target.MagicTarget;
import magic.model.target.MagicTargetFilter;
import magic.model.target.MagicTargetFilterFactory;
import magic.model.target.MagicTargetHint;
public class MagicAmountFactory {
public static MagicAmount FromFilter(final MagicTargetFilter<MagicTarget> filter) {
return new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
return filter.filter(source, player, MagicTargetHint.None).size();
}
};
}
public static MagicAmount CounterOnSource(final MagicCounterType type) {
return new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
final MagicPermanent perm = (MagicPermanent)source;
return perm.getCounters(type);
}
};
}
public static MagicAmount CountersOnController(final MagicCounterType type) {
return new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
return source.getController().getCounters(type);
}
};
}
public static MagicAmount Devotion(final MagicColor color) {
return new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
return source.getController().getDevotion(color);
}
};
}
public static MagicAmount AllCountersOnSource =
new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
final MagicPermanent perm = (MagicPermanent)source;
int amount = 0;
for (final MagicCounterType counterType : MagicCounterType.values()) {
amount+=perm.getCounters(counterType);
}
return amount;
}
};
public static MagicAmount One =
new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
return 1;
}
@Override
public boolean isConstant() {
return true;
}
};
public static MagicAmount Constant(final int n) {
return new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
return n;
}
@Override
public boolean isConstant() {
return true;
}
};
}
public static MagicAmount Equipment =
new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
final MagicPermanent perm = (MagicPermanent)source;
return perm.getEquipmentPermanents().size();
}
};
public static MagicAmount Aura =
new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
final MagicPermanent perm = (MagicPermanent)source;
return perm.getAuraPermanents().size();
}
};
public static MagicAmount Domain =
new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
return player.getDomain();
}
};
public static MagicAmount SN_Power =
new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
final MagicPermanent perm = (MagicPermanent)source;
return perm.getPower();
}
};
public static MagicAmount SN_Toughness =
new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
final MagicPermanent perm = (MagicPermanent)source;
return perm.getToughness();
}
};
public static MagicAmount LifeTotal =
new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
return player.getLife();
}
};
public static MagicAmount ColorsOnPerms =
new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
int amount = 0;
for (final MagicColor color : MagicColor.values()) {
if (player.controlsPermanent(color)) {
amount++;
}
}
return amount;
}
};
public static MagicAmount XCost =
new MagicAmount() {
@Override
public int getAmount(final MagicEvent event) {
return event.getX();
}
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
throw new RuntimeException("getAmount(source, player) called on XCost");
}
};
public static MagicAmount NegXCost =
new MagicAmount() {
@Override
public int getAmount(final MagicEvent event) {
return -event.getX();
}
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
throw new RuntimeException("getAmount(source, player) called on NegXCost");
}
};
public static MagicAmount RN_Power =
new MagicAmount() {
@Override
public int getAmount(final MagicEvent event) {
return event.getRefPermanent().getPower();
}
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
throw new RuntimeException("getAmount(source, player) called on RNPower");
}
};
public static MagicAmount GreatestPower =
new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
return MagicTargetFilterFactory.CREATURE_YOU_CONTROL
.filter(source, player, MagicTargetHint.None)
.stream()
.mapToInt(it -> it.getPower())
.max()
.orElse(0);
}
};
public static MagicAmount HighestCMCPermanentsYouControl =
new MagicAmount() {
@Override
public int getAmount(final MagicSource source, final MagicPlayer player) {
return MagicTargetFilterFactory.PERMANENT_YOU_CONTROL
.filter(source, player, MagicTargetHint.None)
.stream()
.mapToInt(it -> it.getConvertedCost())
.max()
.orElse(0);
}
};
}