mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
ChooseName now uses ICardFaces for selecting a CardName.
that now makes it working for naming an alternate state of a card.
This commit is contained in:
@@ -11,6 +11,7 @@ import forge.LobbyPlayer;
|
||||
import forge.ai.ability.ChangeZoneAi;
|
||||
import forge.ai.ability.ProtectAi;
|
||||
import forge.card.ColorSet;
|
||||
import forge.card.ICardFace;
|
||||
import forge.card.MagicColor;
|
||||
import forge.card.mana.ManaCost;
|
||||
import forge.card.mana.ManaCostShard;
|
||||
@@ -577,8 +578,8 @@ public class PlayerControllerAi extends PlayerController {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PaperCard chooseSinglePaperCard(SpellAbility sa, String message,
|
||||
Predicate<PaperCard> cpp, String name) {
|
||||
public ICardFace chooseSingleCardFace(SpellAbility sa, String message,
|
||||
Predicate<ICardFace> cpp, String name) {
|
||||
throw new UnsupportedOperationException("Should not be called for AI"); // or implement it if you know how
|
||||
}
|
||||
|
||||
@@ -831,7 +832,7 @@ public class PlayerControllerAi extends PlayerController {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String chooseCardName(SpellAbility sa, Predicate<PaperCard> cpp, String valid, String message) {
|
||||
public String chooseCardName(SpellAbility sa, Predicate<ICardFace> cpp, String valid, String message) {
|
||||
if (sa.hasParam("AILogic")) {
|
||||
final String logic = sa.getParam("AILogic");
|
||||
if (logic.equals("MostProminentInComputerDeck")) {
|
||||
@@ -850,7 +851,7 @@ public class PlayerControllerAi extends PlayerController {
|
||||
return ComputerUtilCard.getMostProminentCardName(cards);
|
||||
}
|
||||
} else {
|
||||
CardCollectionView list = CardLists.filterControlledBy(game.getCardsInGame(), player.getOpponent());
|
||||
CardCollectionView list = CardLists.filterControlledBy(game.getCardsInGame(), player.getOpponents());
|
||||
list = CardLists.filter(list, Predicates.not(Presets.LANDS));
|
||||
if (!list.isEmpty()) {
|
||||
return list.get(0).getName();
|
||||
@@ -889,4 +890,13 @@ public class PlayerControllerAi extends PlayerController {
|
||||
public void cancelAwaitNextInput() {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public String chooseCardName(SpellAbility sa, List<ICardFace> faces, String message) {
|
||||
ApiType api = sa.getApi();
|
||||
if (null == api) {
|
||||
throw new InvalidParameterException("SA is not api-based, this is not supported yet");
|
||||
}
|
||||
return SpellApiToAi.Converter.get(api).chooseCardName(player, sa, faces);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.util.List;
|
||||
|
||||
import com.google.common.collect.Iterables;
|
||||
|
||||
import forge.card.ICardFace;
|
||||
import forge.game.GameEntity;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.cost.Cost;
|
||||
@@ -269,6 +270,13 @@ public abstract class SpellAbilityAi {
|
||||
return Iterables.getFirst(options, null);
|
||||
}
|
||||
|
||||
public String chooseCardName(Player ai, SpellAbility sa, List<ICardFace> faces) {
|
||||
System.err.println("Warning: default (ie. inherited from base class) implementation of chooseCardName is used for " + this.getClass().getName() + ". Consider declaring an overloaded method");
|
||||
|
||||
final ICardFace face = Iterables.getFirst(faces, null);
|
||||
return face == null ? "" : face.getName();
|
||||
}
|
||||
|
||||
protected static boolean isUselessCreature(Player ai, Card c) {
|
||||
if (c == null) {
|
||||
return true;
|
||||
|
||||
@@ -1,14 +1,27 @@
|
||||
package forge.ai.ability;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import forge.StaticData;
|
||||
import forge.ai.ComputerUtil;
|
||||
import forge.ai.ComputerUtilCard;
|
||||
import forge.ai.ComputerUtilMana;
|
||||
import forge.ai.SpellAbilityAi;
|
||||
import forge.card.CardDb;
|
||||
import forge.card.CardRules;
|
||||
import forge.card.CardSplitType;
|
||||
import forge.card.CardStateName;
|
||||
import forge.card.ICardFace;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.card.CardUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.spellability.TargetRestrictions;
|
||||
import forge.item.PaperCard;
|
||||
|
||||
public class ChooseCardNameAi extends SpellAbilityAi {
|
||||
|
||||
@@ -68,4 +81,42 @@ public class ChooseCardNameAi extends SpellAbilityAi {
|
||||
return ComputerUtilCard.getBestAI(options);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String chooseCardName(Player ai, SpellAbility sa, List<ICardFace> faces) {
|
||||
// this function is only for "Alhammarret, High Arbiter"
|
||||
|
||||
if (faces.isEmpty()) {
|
||||
return "";
|
||||
} else if (faces.size() == 1) {
|
||||
return Iterables.getFirst(faces, null).getName();
|
||||
}
|
||||
|
||||
List<Card> cards = Lists.newArrayList();
|
||||
final CardDb cardDb = StaticData.instance().getCommonCards();
|
||||
|
||||
for (ICardFace face : faces) {
|
||||
final CardRules rules = cardDb.getRules(face.getName());
|
||||
boolean isOther = rules.getOtherPart() == face;
|
||||
final PaperCard paper = cardDb.getCard(rules.getName());
|
||||
final Card card = Card.fromPaperCard(paper, ai);
|
||||
|
||||
if (rules.getSplitType() == CardSplitType.Split) {
|
||||
Card copy = CardUtil.getLKICopy(card);
|
||||
// for calcing i need only one split side
|
||||
if (isOther) {
|
||||
copy.getCurrentState().copyFrom(card, card.getState(CardStateName.RightSplit));
|
||||
} else {
|
||||
copy.getCurrentState().copyFrom(card, card.getState(CardStateName.LeftSplit));
|
||||
}
|
||||
copy.updateStateForView();
|
||||
|
||||
cards.add(copy);
|
||||
} else if (!isOther) {
|
||||
// other can't be cast that way, not need to prevent that
|
||||
cards.add(card);
|
||||
}
|
||||
}
|
||||
|
||||
return ComputerUtilCard.getBestAI(cards).getName();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user