Merge branch 'companion-ai' into 'master'

Add "AI" for Companion choosing

Closes #1406

See merge request core-developers/forge!2809
This commit is contained in:
Michael Kamensky
2020-05-13 05:16:08 +00:00
4 changed files with 52 additions and 7 deletions

View File

@@ -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<Card> options, boolean isOptional, Player targetedPlayer) {
List<Card> cards = Lists.newArrayList(options);
if (cards.isEmpty()) {
return null;
}
Collections.shuffle(cards);
return cards.get(0);
}
}

View File

@@ -48,6 +48,7 @@ public enum ApiType {
Clash (ClashEffect.class), Clash (ClashEffect.class),
Cleanup (CleanUpEffect.class), Cleanup (CleanUpEffect.class),
Clone (CloneEffect.class), Clone (CloneEffect.class),
CompanionChoose (ChooseCompanionEffect.class),
CopyPermanent (CopyPermanentEffect.class), CopyPermanent (CopyPermanentEffect.class),
CopySpellAbility (CopySpellAbilityEffect.class), CopySpellAbility (CopySpellAbilityEffect.class),
ControlSpell (ControlSpellEffect.class), ControlSpell (ControlSpellEffect.class),

View File

@@ -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.
}
}

View File

@@ -20,7 +20,6 @@ package forge.game.player;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
import com.google.common.collect.*; import com.google.common.collect.*;
import forge.ImageKeys; import forge.ImageKeys;
import forge.LobbyPlayer; import forge.LobbyPlayer;
import forge.card.CardType; import forge.card.CardType;
@@ -53,11 +52,7 @@ import forge.game.zone.Zone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.item.IPaperCard; import forge.item.IPaperCard;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.Aggregates; import forge.util.*;
import forge.util.Lang;
import forge.util.Localizer;
import forge.util.MyRandom;
import forge.util.TextUtil;
import forge.util.collect.FCollection; import forge.util.collect.FCollection;
import forge.util.collect.FCollectionView; import forge.util.collect.FCollectionView;
import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -2914,7 +2909,16 @@ public class Player extends GameEntity implements Comparable<Player> {
CardCollectionView view = CardCollection.getView(legalCompanions); 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) { public boolean deckMatchesDeckRestriction(Card source, String restriction) {