From 022875f07a2a4f7404ecc24dadaca1f30ee1aa27 Mon Sep 17 00:00:00 2001 From: friarsol Date: Tue, 12 May 2020 21:26:41 -0400 Subject: [PATCH] Add "AI" for Companion choosing --- .../forge/ai/ability/ChooseCompanionAi.java | 28 +++++++++++++++++++ .../main/java/forge/game/ability/ApiType.java | 1 + .../effects/ChooseCompanionEffect.java | 12 ++++++++ .../main/java/forge/game/player/Player.java | 18 +++++++----- 4 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 forge-ai/src/main/java/forge/ai/ability/ChooseCompanionAi.java create mode 100644 forge-game/src/main/java/forge/game/ability/effects/ChooseCompanionEffect.java diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCompanionAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCompanionAi.java new file mode 100644 index 00000000000..7f6d1484608 --- /dev/null +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCompanionAi.java @@ -0,0 +1,28 @@ +package forge.ai.ability; + +import com.google.common.collect.Lists; +import forge.ai.SpellAbilityAi; +import forge.game.card.Card; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; + +import java.util.Collections; +import java.util.List; + +public class ChooseCompanionAi extends SpellAbilityAi { + + /* (non-Javadoc) + * @see forge.card.ability.SpellAbilityAi#chooseSingleCard(forge.card.spellability.SpellAbility, java.util.List, boolean) + */ + @Override + public Card chooseSingleCard(final Player ai, final SpellAbility sa, Iterable options, boolean isOptional, Player targetedPlayer) { + List cards = Lists.newArrayList(options); + if (cards.isEmpty()) { + return null; + } + + Collections.shuffle(cards); + return cards.get(0); + } +} + diff --git a/forge-game/src/main/java/forge/game/ability/ApiType.java b/forge-game/src/main/java/forge/game/ability/ApiType.java index c7fa2c0915f..43d71a75325 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -48,6 +48,7 @@ public enum ApiType { Clash (ClashEffect.class), Cleanup (CleanUpEffect.class), Clone (CloneEffect.class), + CompanionChoose (ChooseCompanionEffect.class), CopyPermanent (CopyPermanentEffect.class), CopySpellAbility (CopySpellAbilityEffect.class), ControlSpell (ControlSpellEffect.class), diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCompanionEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCompanionEffect.java new file mode 100644 index 00000000000..1282dc98b89 --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCompanionEffect.java @@ -0,0 +1,12 @@ +package forge.game.ability.effects; + +import forge.game.ability.SpellAbilityEffect; +import forge.game.spellability.SpellAbility; + +public class ChooseCompanionEffect extends SpellAbilityEffect { + + @Override + public void resolve(SpellAbility sa) { + // This isn't a real effect. Just need it for AI choosing. + } +} \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 7fcbeced8c6..1524b325539 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -20,7 +20,6 @@ package forge.game.player; import com.google.common.base.Function; import com.google.common.base.Predicates; import com.google.common.collect.*; - import forge.ImageKeys; import forge.LobbyPlayer; import forge.card.CardType; @@ -53,11 +52,7 @@ import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.item.IPaperCard; import forge.item.PaperCard; -import forge.util.Aggregates; -import forge.util.Lang; -import forge.util.Localizer; -import forge.util.MyRandom; -import forge.util.TextUtil; +import forge.util.*; import forge.util.collect.FCollection; import forge.util.collect.FCollectionView; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -2914,7 +2909,16 @@ public class Player extends GameEntity implements Comparable { CardCollectionView view = CardCollection.getView(legalCompanions); - return controller.chooseSingleEntityForEffect(view, null, Localizer.getInstance().getMessage("lblChooseACompanion"), true); + Card firstCompanion = legalCompanions.get(0); + SpellAbility fakeSa = AbilityFactory.getAbility( + AbilityFactory.AbilityRecordType.Spell, + ApiType.CompanionChoose, + new HashMap<>(), + firstCompanion.getFirstSpellAbility().getPayCosts(), + firstCompanion, + null + ); + return controller.chooseSingleEntityForEffect(view, fakeSa, Localizer.getInstance().getMessage("lblChooseACompanion"), true); } public boolean deckMatchesDeckRestriction(Card source, String restriction) {