mirror of
https://github.com/correl/mage.git
synced 2024-12-26 03:00:11 +00:00
AI updates, more cards will have the isRemoval bonus to their card rating
these weren't being picked up as removal spells and now are: * modal spells where one mode is a removal spell * spells that do a dynamic amount of damage, such as fireball * cards that reduce the toughness temporarily or permanently * cards that keep a creature tapped down * cards that exile a creature * cards that damage creatures that are attacking or blocking * enchantments that exile a creature when they etb * fight cards, and one sided fight cards the ai will now rate those types of cards higher as they are removal
This commit is contained in:
parent
bdf3394b84
commit
4f61afa62b
6 changed files with 69 additions and 30 deletions
|
@ -7,14 +7,25 @@ import mage.cards.Card;
|
||||||
import mage.constants.ColoredManaSymbol;
|
import mage.constants.ColoredManaSymbol;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.target.Target;
|
import mage.target.Target;
|
||||||
import mage.target.common.TargetAnyTarget;
|
|
||||||
import mage.target.common.TargetCreaturePermanent;
|
import mage.target.common.TargetCreaturePermanent;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import mage.abilities.Mode;
|
||||||
|
import mage.abilities.effects.common.DamageWithPowerTargetEffect;
|
||||||
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
|
import mage.abilities.effects.common.ExileTargetEffect;
|
||||||
|
import mage.abilities.effects.common.ExileUntilSourceLeavesEffect;
|
||||||
|
import mage.abilities.effects.common.FightTargetsEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||||
import mage.constants.Rarity;
|
import mage.constants.Rarity;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.target.TargetPermanent;
|
||||||
|
import mage.target.common.TargetAttackingCreature;
|
||||||
|
import mage.target.common.TargetAttackingOrBlockingCreature;
|
||||||
|
import mage.target.common.TargetPlayerOrPlaneswalker;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class responsible for reading ratings from resources and rating given cards.
|
* Class responsible for reading ratings from resources and rating given cards.
|
||||||
|
@ -54,7 +65,6 @@ public final class RateCard {
|
||||||
public static int rateCard(Card card, List<ColoredManaSymbol> allowedColors) {
|
public static int rateCard(Card card, List<ColoredManaSymbol> allowedColors) {
|
||||||
if (allowedColors == null && rated.containsKey(card.getName())) {
|
if (allowedColors == null && rated.containsKey(card.getName())) {
|
||||||
int rate = rated.get(card.getName());
|
int rate = rated.get(card.getName());
|
||||||
// log.info(card.getName() + " rate: " + rate);
|
|
||||||
return rate;
|
return rate;
|
||||||
}
|
}
|
||||||
int type;
|
int type;
|
||||||
|
@ -79,38 +89,66 @@ public final class RateCard {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int isRemoval(Card card) {
|
private static int isRemoval(Card card) {
|
||||||
if (card.getSubtype(null).contains(SubType.AURA) || card.isInstant() || card.isSorcery()) {
|
if (card.isEnchantment() || card.isInstant() || card.isSorcery()) {
|
||||||
|
|
||||||
for (Ability ability : card.getAbilities()) {
|
for (Ability ability : card.getAbilities()) {
|
||||||
for (Effect effect : ability.getEffects()) {
|
for (Effect effect : ability.getEffects()) {
|
||||||
|
if (isEffectRemoval(card, ability, effect) == 1){
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (Mode mode: ability.getModes().values() ){
|
||||||
|
for (Effect effect: mode.getEffects()){
|
||||||
|
if (isEffectRemoval(card, ability, effect) == 1){
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int isEffectRemoval(Card card, Ability ability, Effect effect){
|
||||||
if (effect.getOutcome() == Outcome.Removal) {
|
if (effect.getOutcome() == Outcome.Removal) {
|
||||||
log.debug("Found removal: " + card.getName());
|
log.debug("Found removal: " + card.getName());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (effect.getOutcome() == Outcome.Damage) {
|
//static List<Effect> removalEffects =[BoostTargetEffect,BoostEnchantedEffect]
|
||||||
if (effect instanceof DamageTargetEffect) {
|
if (effect instanceof BoostTargetEffect || effect instanceof BoostEnchantedEffect){
|
||||||
DamageTargetEffect damageEffect = (DamageTargetEffect) effect;
|
String text = effect.getText(null);
|
||||||
if (damageEffect.getAmount() > 1) {
|
if (text.contains("/-")){
|
||||||
|
// toughness reducer, aka removal
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (effect instanceof FightTargetsEffect || effect instanceof DamageWithPowerTargetEffect){
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (effect.getOutcome() == Outcome.Damage || effect instanceof DamageTargetEffect) {
|
||||||
for (Target target : ability.getTargets()) {
|
for (Target target : ability.getTargets()) {
|
||||||
if (target instanceof TargetCreaturePermanent || target instanceof TargetAnyTarget) {
|
if (!(target instanceof TargetPlayerOrPlaneswalker)){
|
||||||
log.debug("Found damage dealer: " + card.getName());
|
log.debug("Found damage dealer: " + card.getName());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
if (effect.getOutcome() == Outcome.DestroyPermanent ||
|
||||||
}
|
effect instanceof DestroyTargetEffect ||
|
||||||
if (effect.getOutcome() == Outcome.DestroyPermanent) {
|
effect instanceof ExileTargetEffect ||
|
||||||
|
effect instanceof ExileUntilSourceLeavesEffect) {
|
||||||
for (Target target : ability.getTargets()) {
|
for (Target target : ability.getTargets()) {
|
||||||
if (target instanceof TargetCreaturePermanent) {
|
if (target instanceof TargetCreaturePermanent ||
|
||||||
log.debug("Found destroyer: " + card.getName());
|
target instanceof TargetAttackingCreature ||
|
||||||
|
target instanceof TargetAttackingOrBlockingCreature ||
|
||||||
|
target instanceof TargetPermanent) {
|
||||||
|
log.debug("Found destroyer/exiler: " + card.getName());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ public final class JusticeStrike extends CardImpl {
|
||||||
class JusticeStrikeEffect extends OneShotEffect {
|
class JusticeStrikeEffect extends OneShotEffect {
|
||||||
|
|
||||||
public JusticeStrikeEffect() {
|
public JusticeStrikeEffect() {
|
||||||
super(Outcome.Benefit);
|
super(Outcome.Removal);
|
||||||
this.staticText = "Target creature deals damage to itself equal to its power.";
|
this.staticText = "Target creature deals damage to itself equal to its power.";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ public class DontUntapInControllersUntapStepEnchantedEffect extends ContinuousRu
|
||||||
}
|
}
|
||||||
|
|
||||||
public DontUntapInControllersUntapStepEnchantedEffect(String description) {
|
public DontUntapInControllersUntapStepEnchantedEffect(String description) {
|
||||||
super(Duration.WhileOnBattlefield, Outcome.Detriment, false, true);
|
super(Duration.WhileOnBattlefield, Outcome.Removal, false, true);
|
||||||
staticText = "Enchanted " + description + " doesn't untap during its controller's untap step";
|
staticText = "Enchanted " + description + " doesn't untap during its controller's untap step";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ import mage.players.Player;
|
||||||
public class ExileAndGainLifeEqualPowerTargetEffect extends OneShotEffect {
|
public class ExileAndGainLifeEqualPowerTargetEffect extends OneShotEffect {
|
||||||
|
|
||||||
public ExileAndGainLifeEqualPowerTargetEffect() {
|
public ExileAndGainLifeEqualPowerTargetEffect() {
|
||||||
super(Outcome.GainLife);
|
super(Outcome.Removal);
|
||||||
staticText = "Exile target creature. Its controller gains life equal to its power";
|
staticText = "Exile target creature. Its controller gains life equal to its power";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ import mage.util.CardUtil;
|
||||||
public class ExileUntilSourceLeavesEffect extends OneShotEffect {
|
public class ExileUntilSourceLeavesEffect extends OneShotEffect {
|
||||||
|
|
||||||
public ExileUntilSourceLeavesEffect(String targetName) {
|
public ExileUntilSourceLeavesEffect(String targetName) {
|
||||||
super(Outcome.Benefit);
|
super(Outcome.Removal);
|
||||||
this.staticText = "exile target " + targetName + " an opponent controls until {this} leaves the battlefield";
|
this.staticText = "exile target " + targetName + " an opponent controls until {this} leaves the battlefield";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ import mage.constants.AttachmentType;
|
||||||
import mage.constants.Duration;
|
import mage.constants.Duration;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.effects.RestrictionEffect;
|
import mage.abilities.effects.RestrictionEffect;
|
||||||
|
import mage.constants.Outcome;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
|
|
||||||
|
@ -14,7 +15,7 @@ import mage.game.permanent.Permanent;
|
||||||
public class CantAttackBlockAttachedEffect extends RestrictionEffect {
|
public class CantAttackBlockAttachedEffect extends RestrictionEffect {
|
||||||
|
|
||||||
public CantAttackBlockAttachedEffect(AttachmentType attachmentType) {
|
public CantAttackBlockAttachedEffect(AttachmentType attachmentType) {
|
||||||
super(Duration.WhileOnBattlefield);
|
super(Duration.WhileOnBattlefield, Outcome.Removal);
|
||||||
this.staticText = attachmentType.verb() + " creature can't attack or block";
|
this.staticText = attachmentType.verb() + " creature can't attack or block";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue