mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
- Improvements to Counter AI.
This commit is contained in:
@@ -53,11 +53,16 @@ public enum AiProps { /** */
|
|||||||
CHANCE_TO_TRADE_TO_SAVE_PLANESWALKER ("70"), /** */
|
CHANCE_TO_TRADE_TO_SAVE_PLANESWALKER ("70"), /** */
|
||||||
CHANCE_TO_TRADE_DOWN_TO_SAVE_PLANESWALKER ("0"), /** */
|
CHANCE_TO_TRADE_DOWN_TO_SAVE_PLANESWALKER ("0"), /** */
|
||||||
THRESHOLD_CHUMP_TO_SAVE_PLANESWALKER ("-1"), /** */
|
THRESHOLD_CHUMP_TO_SAVE_PLANESWALKER ("-1"), /** */
|
||||||
MIN_SPELL_CMC_TO_COUNTER ("0"),
|
MIN_SPELL_CMC_TO_COUNTER ("0"), /** */
|
||||||
|
CHANCE_TO_COUNTER_CMC_1 ("50"), /** */
|
||||||
|
CHANCE_TO_COUNTER_CMC_2 ("75"), /** */
|
||||||
|
CHANCE_TO_COUNTER_CMC_3 ("100"), /** */
|
||||||
ALWAYS_COUNTER_OTHER_COUNTERSPELLS ("true"), /** */
|
ALWAYS_COUNTER_OTHER_COUNTERSPELLS ("true"), /** */
|
||||||
ALWAYS_COUNTER_DAMAGE_SPELLS ("true"), /** */
|
ALWAYS_COUNTER_DAMAGE_SPELLS ("true"), /** */
|
||||||
ALWAYS_COUNTER_CMC_0_MANA_MAKING_PERMS ("true"), /** */
|
ALWAYS_COUNTER_CMC_0_MANA_MAKING_PERMS ("true"), /** */
|
||||||
ALWAYS_COUNTER_REMOVAL_SPELLS ("true"), /** */
|
ALWAYS_COUNTER_REMOVAL_SPELLS ("true"), /** */
|
||||||
|
ALWAYS_COUNTER_PUMP_SPELLS ("true"), /** */
|
||||||
|
ALWAYS_COUNTER_AURAS ("true"), /** */
|
||||||
ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS (""), /** */
|
ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS (""), /** */
|
||||||
ACTIVELY_DESTROY_ARTS_AND_NONAURA_ENCHS ("false"), /** */
|
ACTIVELY_DESTROY_ARTS_AND_NONAURA_ENCHS ("false"), /** */
|
||||||
PRIORITY_REDUCTION_FOR_STORM_SPELLS ("0"), /** */
|
PRIORITY_REDUCTION_FOR_STORM_SPELLS ("0"), /** */
|
||||||
|
|||||||
@@ -144,14 +144,31 @@ public class CounterAi extends SpellAbilityAi {
|
|||||||
boolean ctrCmc0ManaPerms = aic.getBooleanProperty(AiProps.ALWAYS_COUNTER_CMC_0_MANA_MAKING_PERMS);
|
boolean ctrCmc0ManaPerms = aic.getBooleanProperty(AiProps.ALWAYS_COUNTER_CMC_0_MANA_MAKING_PERMS);
|
||||||
boolean ctrDamageSpells = aic.getBooleanProperty(AiProps.ALWAYS_COUNTER_DAMAGE_SPELLS);
|
boolean ctrDamageSpells = aic.getBooleanProperty(AiProps.ALWAYS_COUNTER_DAMAGE_SPELLS);
|
||||||
boolean ctrRemovalSpells = aic.getBooleanProperty(AiProps.ALWAYS_COUNTER_REMOVAL_SPELLS);
|
boolean ctrRemovalSpells = aic.getBooleanProperty(AiProps.ALWAYS_COUNTER_REMOVAL_SPELLS);
|
||||||
|
boolean ctrPumpSpells = aic.getBooleanProperty(AiProps.ALWAYS_COUNTER_PUMP_SPELLS);
|
||||||
|
boolean ctrAuraSpells = aic.getBooleanProperty(AiProps.ALWAYS_COUNTER_AURAS);
|
||||||
boolean ctrOtherCounters = aic.getBooleanProperty(AiProps.ALWAYS_COUNTER_OTHER_COUNTERSPELLS);
|
boolean ctrOtherCounters = aic.getBooleanProperty(AiProps.ALWAYS_COUNTER_OTHER_COUNTERSPELLS);
|
||||||
|
int ctrChanceCMC1 = aic.getIntProperty(AiProps.CHANCE_TO_COUNTER_CMC_1);
|
||||||
|
int ctrChanceCMC2 = aic.getIntProperty(AiProps.CHANCE_TO_COUNTER_CMC_2);
|
||||||
|
int ctrChanceCMC3 = aic.getIntProperty(AiProps.CHANCE_TO_COUNTER_CMC_3);
|
||||||
String ctrNamed = aic.getProperty(AiProps.ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS);
|
String ctrNamed = aic.getProperty(AiProps.ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS);
|
||||||
|
boolean dontCounter = false;
|
||||||
|
|
||||||
|
if (tgtCMC == 1 && !MyRandom.percentTrue(ctrChanceCMC1)) {
|
||||||
|
dontCounter = true;
|
||||||
|
} else if (tgtCMC == 2 && !MyRandom.percentTrue(ctrChanceCMC2)) {
|
||||||
|
dontCounter = true;
|
||||||
|
} else if (tgtCMC == 3 && !MyRandom.percentTrue(ctrChanceCMC3)) {
|
||||||
|
dontCounter = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (tgtSA != null && tgtCMC < aic.getIntProperty(AiProps.MIN_SPELL_CMC_TO_COUNTER)) {
|
if (tgtSA != null && tgtCMC < aic.getIntProperty(AiProps.MIN_SPELL_CMC_TO_COUNTER)) {
|
||||||
boolean dontCounter = true;
|
dontCounter = true;
|
||||||
Card tgtSource = tgtSA.getHostCard();
|
Card tgtSource = tgtSA.getHostCard();
|
||||||
if ((tgtSource != null && tgtCMC == 0 && tgtSource.isPermanent() && !tgtSource.getManaAbilities().isEmpty() && ctrCmc0ManaPerms)
|
if ((tgtSource != null && tgtCMC == 0 && tgtSource.isPermanent() && !tgtSource.getManaAbilities().isEmpty() && ctrCmc0ManaPerms)
|
||||||
|| (tgtSA.getApi() == ApiType.DealDamage || tgtSA.getApi() == ApiType.LoseLife || tgtSA.getApi() == ApiType.DamageAll && ctrDamageSpells)
|
|| (tgtSA.getApi() == ApiType.DealDamage || tgtSA.getApi() == ApiType.LoseLife || tgtSA.getApi() == ApiType.DamageAll && ctrDamageSpells)
|
||||||
|| (tgtSA.getApi() == ApiType.Counter && ctrOtherCounters)
|
|| (tgtSA.getApi() == ApiType.Counter && ctrOtherCounters)
|
||||||
|
|| ((tgtSA.getApi() == ApiType.Pump || tgtSA.getApi() == ApiType.PumpAll) && ctrPumpSpells)
|
||||||
|
|| (tgtSA.getApi() == ApiType.Attach && ctrAuraSpells)
|
||||||
|| (tgtSA.getApi() == ApiType.Destroy || tgtSA.getApi() == ApiType.DestroyAll || tgtSA.getApi() == ApiType.Sacrifice
|
|| (tgtSA.getApi() == ApiType.Destroy || tgtSA.getApi() == ApiType.DestroyAll || tgtSA.getApi() == ApiType.Sacrifice
|
||||||
|| tgtSA.getApi() == ApiType.SacrificeAll && ctrRemovalSpells)) {
|
|| tgtSA.getApi() == ApiType.SacrificeAll && ctrRemovalSpells)) {
|
||||||
dontCounter = false;
|
dontCounter = false;
|
||||||
@@ -164,8 +181,8 @@ public class CounterAi extends SpellAbilityAi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// should not refrain from countering a CMC X spell if that's the only CMC
|
// should not refrain from countering a CMC X spell if that's the only CMC
|
||||||
// counterable with that particular counterspell type (e.g. Mental Misstep vs. CMC 1 spells)
|
// counterable with that particular counterspell type (e.g. Mental Misstep vs. CMC 1 spells)
|
||||||
if (sa.getParamOrDefault("ValidTgts", "").startsWith("Card.cmcEQ")) {
|
if (sa.getParamOrDefault("ValidTgts", "").startsWith("Card.cmcEQ")) {
|
||||||
int validTgtCMC = AbilityUtils.calculateAmount(source, sa.getParam("ValidTgts").substring(10), sa);
|
int validTgtCMC = AbilityUtils.calculateAmount(source, sa.getParam("ValidTgts").substring(10), sa);
|
||||||
@@ -173,12 +190,12 @@ public class CounterAi extends SpellAbilityAi {
|
|||||||
dontCounter = false;
|
dontCounter = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dontCounter) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dontCounter) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return toReturn;
|
return toReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -80,12 +80,17 @@ RESERVE_MANA_FOR_MAIN2_CHANCE=100
|
|||||||
# If enabled, the AI will target artifacts and non-aura enchantments with removal aggressively
|
# If enabled, the AI will target artifacts and non-aura enchantments with removal aggressively
|
||||||
ACTIVELY_DESTROY_ARTS_AND_NONAURA_ENCHS=true
|
ACTIVELY_DESTROY_ARTS_AND_NONAURA_ENCHS=true
|
||||||
|
|
||||||
# Counterspell timings
|
# Permission timings
|
||||||
MIN_SPELL_CMC_TO_COUNTER=2
|
MIN_SPELL_CMC_TO_COUNTER=2
|
||||||
|
CHANCE_TO_COUNTER_CMC_1=0
|
||||||
|
CHANCE_TO_COUNTER_CMC_2=50
|
||||||
|
CHANCE_TO_COUNTER_CMC_3=100
|
||||||
ALWAYS_COUNTER_OTHER_COUNTERSPELLS=true
|
ALWAYS_COUNTER_OTHER_COUNTERSPELLS=true
|
||||||
ALWAYS_COUNTER_DAMAGE_SPELLS=true
|
ALWAYS_COUNTER_DAMAGE_SPELLS=true
|
||||||
ALWAYS_COUNTER_CMC_0_MANA_MAKING_PERMS=true
|
ALWAYS_COUNTER_CMC_0_MANA_MAKING_PERMS=true
|
||||||
ALWAYS_COUNTER_REMOVAL_SPELLS=true
|
ALWAYS_COUNTER_REMOVAL_SPELLS=true
|
||||||
|
ALWAYS_COUNTER_PUMP_SPELLS=false
|
||||||
|
ALWAYS_COUNTER_AURAS=true
|
||||||
ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None
|
ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None
|
||||||
|
|
||||||
# Storm spell logic
|
# Storm spell logic
|
||||||
|
|||||||
@@ -80,12 +80,17 @@ RESERVE_MANA_FOR_MAIN2_CHANCE=100
|
|||||||
# If enabled, the AI will target artifacts and non-aura enchantments with removal aggressively
|
# If enabled, the AI will target artifacts and non-aura enchantments with removal aggressively
|
||||||
ACTIVELY_DESTROY_ARTS_AND_NONAURA_ENCHS=true
|
ACTIVELY_DESTROY_ARTS_AND_NONAURA_ENCHS=true
|
||||||
|
|
||||||
# Counterspell timings
|
# Permission timings
|
||||||
MIN_SPELL_CMC_TO_COUNTER=0
|
MIN_SPELL_CMC_TO_COUNTER=0
|
||||||
|
CHANCE_TO_COUNTER_CMC_1=30
|
||||||
|
CHANCE_TO_COUNTER_CMC_2=75
|
||||||
|
CHANCE_TO_COUNTER_CMC_3=100
|
||||||
ALWAYS_COUNTER_OTHER_COUNTERSPELLS=true
|
ALWAYS_COUNTER_OTHER_COUNTERSPELLS=true
|
||||||
ALWAYS_COUNTER_DAMAGE_SPELLS=true
|
ALWAYS_COUNTER_DAMAGE_SPELLS=true
|
||||||
ALWAYS_COUNTER_CMC_0_MANA_MAKING_PERMS=true
|
ALWAYS_COUNTER_CMC_0_MANA_MAKING_PERMS=true
|
||||||
ALWAYS_COUNTER_REMOVAL_SPELLS=true
|
ALWAYS_COUNTER_REMOVAL_SPELLS=true
|
||||||
|
ALWAYS_COUNTER_PUMP_SPELLS=true
|
||||||
|
ALWAYS_COUNTER_AURAS=true
|
||||||
ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None
|
ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None
|
||||||
|
|
||||||
# Storm spell logic
|
# Storm spell logic
|
||||||
|
|||||||
@@ -80,12 +80,17 @@ RESERVE_MANA_FOR_MAIN2_CHANCE=100
|
|||||||
# If enabled, the AI will target artifacts and non-aura enchantments with removal aggressively
|
# If enabled, the AI will target artifacts and non-aura enchantments with removal aggressively
|
||||||
ACTIVELY_DESTROY_ARTS_AND_NONAURA_ENCHS=true
|
ACTIVELY_DESTROY_ARTS_AND_NONAURA_ENCHS=true
|
||||||
|
|
||||||
# Counterspell timings
|
# Permission timings
|
||||||
MIN_SPELL_CMC_TO_COUNTER=2
|
MIN_SPELL_CMC_TO_COUNTER=2
|
||||||
|
CHANCE_TO_COUNTER_CMC_1=30
|
||||||
|
CHANCE_TO_COUNTER_CMC_2=75
|
||||||
|
CHANCE_TO_COUNTER_CMC_3=100
|
||||||
ALWAYS_COUNTER_OTHER_COUNTERSPELLS=true
|
ALWAYS_COUNTER_OTHER_COUNTERSPELLS=true
|
||||||
ALWAYS_COUNTER_DAMAGE_SPELLS=true
|
ALWAYS_COUNTER_DAMAGE_SPELLS=true
|
||||||
ALWAYS_COUNTER_CMC_0_MANA_MAKING_PERMS=true
|
ALWAYS_COUNTER_CMC_0_MANA_MAKING_PERMS=true
|
||||||
ALWAYS_COUNTER_REMOVAL_SPELLS=true
|
ALWAYS_COUNTER_REMOVAL_SPELLS=true
|
||||||
|
ALWAYS_COUNTER_PUMP_SPELLS=true
|
||||||
|
ALWAYS_COUNTER_AURAS=true
|
||||||
ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None
|
ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None
|
||||||
|
|
||||||
# Storm spell logic
|
# Storm spell logic
|
||||||
|
|||||||
@@ -80,12 +80,17 @@ RESERVE_MANA_FOR_MAIN2_CHANCE=100
|
|||||||
# If enabled, the AI will target artifacts and non-aura enchantments with removal aggressively
|
# If enabled, the AI will target artifacts and non-aura enchantments with removal aggressively
|
||||||
ACTIVELY_DESTROY_ARTS_AND_NONAURA_ENCHS=true
|
ACTIVELY_DESTROY_ARTS_AND_NONAURA_ENCHS=true
|
||||||
|
|
||||||
# Counterspell timings
|
# Permission timings
|
||||||
MIN_SPELL_CMC_TO_COUNTER=0
|
MIN_SPELL_CMC_TO_COUNTER=0
|
||||||
|
CHANCE_TO_COUNTER_CMC_1=80
|
||||||
|
CHANCE_TO_COUNTER_CMC_2=100
|
||||||
|
CHANCE_TO_COUNTER_CMC_3=100
|
||||||
ALWAYS_COUNTER_OTHER_COUNTERSPELLS=true
|
ALWAYS_COUNTER_OTHER_COUNTERSPELLS=true
|
||||||
ALWAYS_COUNTER_DAMAGE_SPELLS=true
|
ALWAYS_COUNTER_DAMAGE_SPELLS=true
|
||||||
ALWAYS_COUNTER_CMC_0_MANA_MAKING_PERMS=true
|
ALWAYS_COUNTER_CMC_0_MANA_MAKING_PERMS=true
|
||||||
ALWAYS_COUNTER_REMOVAL_SPELLS=true
|
ALWAYS_COUNTER_REMOVAL_SPELLS=true
|
||||||
|
ALWAYS_COUNTER_PUMP_SPELLS=true
|
||||||
|
ALWAYS_COUNTER_AURAS=true
|
||||||
ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None
|
ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None
|
||||||
|
|
||||||
# Storm spell logic
|
# Storm spell logic
|
||||||
|
|||||||
Reference in New Issue
Block a user