From cd567a21dcc458e5f1c67890859d4abfc0090bf3 Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Sun, 21 Feb 2021 09:20:30 +0300 Subject: [PATCH 1/6] - Fix Multikicker for the AI --- forge-ai/src/main/java/forge/ai/ComputerUtil.java | 14 ++++++++++++-- .../main/java/forge/ai/ability/PermanentAi.java | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index e51e0d847a4..f925890191b 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -19,7 +19,10 @@ package forge.ai; import com.google.common.base.Predicate; import com.google.common.base.Predicates; -import com.google.common.collect.*; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; import forge.ai.ability.ChooseGenericEffectAi; import forge.ai.ability.ProtectAi; import forge.ai.ability.TokenAi; @@ -44,7 +47,10 @@ import forge.game.player.Player; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementLayer; import forge.game.replacement.ReplacementType; -import forge.game.spellability.*; +import forge.game.spellability.AbilitySub; +import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityStackInstance; +import forge.game.spellability.TargetRestrictions; import forge.game.staticability.StaticAbility; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; @@ -109,6 +115,10 @@ public class ComputerUtil { } final Cost cost = sa.getPayCosts(); + + // Remember the now-forgotten kicker cost? Why is this needed? + sa.getHostCard().setKickerMagnitude(source.getKickerMagnitude()); // the card will disappear + // TODO: update mana color conversion for Daxos of Meletis if (cost == null) { if (ComputerUtilMana.payManaCost(ai, sa)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java index f3ec36f837d..fbc05b92472 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java @@ -156,6 +156,7 @@ public class PermanentAi extends SpellAbilityAi { ManaCostBeingPaid mcbp = new ManaCostBeingPaid(mCost); if (!ComputerUtilMana.canPayManaCost(mcbp, sa, ai)) { card.setKickerMagnitude(i); + sa.setSVar("Multikicker", String.valueOf(i)); break; } card.setKickerMagnitude(i + 1); From 09d47eb3796a73d0fe2ef0322c0900c82205b85b Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Sun, 21 Feb 2021 09:21:58 +0300 Subject: [PATCH 2/6] - Remove a debug comment --- forge-ai/src/main/java/forge/ai/ComputerUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index f925890191b..1bb38cdb467 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -117,7 +117,7 @@ public class ComputerUtil { final Cost cost = sa.getPayCosts(); // Remember the now-forgotten kicker cost? Why is this needed? - sa.getHostCard().setKickerMagnitude(source.getKickerMagnitude()); // the card will disappear + sa.getHostCard().setKickerMagnitude(source.getKickerMagnitude()); // TODO: update mana color conversion for Daxos of Meletis if (cost == null) { From c62583226ed2f642aa10362fd3abe52971050d16 Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Sun, 21 Feb 2021 09:52:17 +0300 Subject: [PATCH 3/6] - Fix card name capitalization (checked against Scryfall) --- forge-gui/res/cardsfolder/s/saw_it_coming.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/saw_it_coming.txt b/forge-gui/res/cardsfolder/s/saw_it_coming.txt index c92c3bb8352..5bb90d98820 100644 --- a/forge-gui/res/cardsfolder/s/saw_it_coming.txt +++ b/forge-gui/res/cardsfolder/s/saw_it_coming.txt @@ -1,4 +1,4 @@ -Name:Saw it Coming +Name:Saw It Coming ManaCost:1 U U Types:Instant A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell | ValidTgts$ Card | SpellDescription$ Counter target spell. From e2258465db22d03aa1da66accb6adf2993d9433d Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Sun, 21 Feb 2021 10:00:36 +0300 Subject: [PATCH 4/6] - Syr Konrad AI fix and enablement. --- forge-gui/res/cardsfolder/s/syr_konrad_the_grim.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/s/syr_konrad_the_grim.txt b/forge-gui/res/cardsfolder/s/syr_konrad_the_grim.txt index 38077851e5e..e985024d117 100644 --- a/forge-gui/res/cardsfolder/s/syr_konrad_the_grim.txt +++ b/forge-gui/res/cardsfolder/s/syr_konrad_the_grim.txt @@ -5,6 +5,5 @@ PT:5/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigDmg | TriggerDescription$ Whenever another creature dies, or a creature card is put into a graveyard from anywhere than the battlefield, or a creature card leaves your graveyard, CARDNAME deals 1 damage to each opponent. T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Any | ValidCard$ Card.Creature+Other+YouOwn | TriggerZones$ Battlefield | Execute$ TrigDmg | Secondary$ True | TriggerDescription$ Whenever another creature dies, or a creature card is put into a graveyard from anywhere than the battlefield, or a creature card leaves your graveyard, CARDNAME deals 1 damage to each opponent. SVar:TrigDmg:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 1 -A:AB$ Mill | Cost$ 1 B | NumCards$ 1 | Defined$ Player | SpellDescription$ Each player mills a card. -AI:RemoveDeck:All +A:AB$ Mill | Cost$ 1 B | NumCards$ 1 | Defined$ Player | AILogic$ EndOfOppTurn | SpellDescription$ Each player mills a card. Oracle:Whenever another creature dies, or a creature card is put into a graveyard from anywhere other than the battlefield, or a creature card leaves your graveyard, Syr Konrad, the Grim deals 1 damage to each opponent.\n{1}{B}: Each player mills a card. From b619e24fc09103107fe9e0952f715fe4db7bc174 Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Sun, 21 Feb 2021 10:06:00 +0300 Subject: [PATCH 5/6] - Bone Splinters: the AI can use it, but prolly not the best one for random decks? --- forge-gui/res/cardsfolder/b/bone_splinters.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/b/bone_splinters.txt b/forge-gui/res/cardsfolder/b/bone_splinters.txt index 7cce439a522..00ed0903a9c 100644 --- a/forge-gui/res/cardsfolder/b/bone_splinters.txt +++ b/forge-gui/res/cardsfolder/b/bone_splinters.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Sorcery A:SP$ Destroy | Cost$ B Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. SVar:AICostPreference:SacCost$Creature.Token,Creature.cmcLE2 -AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bone_splinters.jpg Oracle:As an additional cost to cast this spell, sacrifice a creature.\nDestroy target creature. From b674f373e1d34290561dd39118f0107eb21c455d Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Sun, 21 Feb 2021 10:41:04 +0300 Subject: [PATCH 6/6] - Improve the AI hint for Bloodsoaked Altar --- forge-gui/res/cardsfolder/b/bloodsoaked_altar.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/b/bloodsoaked_altar.txt b/forge-gui/res/cardsfolder/b/bloodsoaked_altar.txt index ce386a4740e..85dc2f2e8e8 100644 --- a/forge-gui/res/cardsfolder/b/bloodsoaked_altar.txt +++ b/forge-gui/res/cardsfolder/b/bloodsoaked_altar.txt @@ -2,7 +2,7 @@ Name:Bloodsoaked Altar ManaCost:4 B B Types:Artifact A:AB$ Token | Cost$ T PayLife<2> Discard<1/Card> Sac<1/Creature> | LegacyImage$ b 5 5 demon flying m20 | TokenAmount$ 1 | TokenScript$ b_5_5_demon_flying | TokenOwner$ You | SorcerySpeed$ True | SpellDescription$ Create a 5/5 black Demon creature token with flying. Activate this ability only any time you could play a sorcery. -SVar:AIPreference:DiscardCost$Card +SVar:AIPreference:DiscardCost$Card | SacCost$Creature.Token,Creature.cmcLE3 DeckHas:Ability$Token AI:RemoveDeck:Random Oracle:{T}, Pay 2 life, Discard a card, Sacrifice a creature: Create a 5/5 black Demon creature token with flying. Activate this ability only any time you could play a sorcery.