Fix treating Battle as PW

This commit is contained in:
tool4EvEr
2023-04-26 20:03:12 +02:00
parent e907d2e17b
commit 49bf19948e
6 changed files with 31 additions and 13 deletions

View File

@@ -722,6 +722,11 @@ public class AiAttackController {
return pwNearUlti != null ? pwNearUlti : ComputerUtilCard.getBestPlaneswalkerAI(pwDefending); return pwNearUlti != null ? pwNearUlti : ComputerUtilCard.getBestPlaneswalkerAI(pwDefending);
} }
List<Card> battleDefending = c.getDefendingBattles();
if (!battleDefending.isEmpty()) {
// TODO filter for team ones
}
return prefDefender; return prefDefender;
} }

View File

@@ -1,14 +1,18 @@
package forge.ai.ability; package forge.ai.ability;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.ai.AiAttackController;
import forge.ai.ComputerUtil; import forge.ai.ComputerUtil;
import forge.ai.SpellAbilityAi; import forge.ai.SpellAbilityAi;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerCollection;
import forge.game.player.PlayerPredicates;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
@@ -31,7 +35,10 @@ public class ChoosePlayerAi extends SpellAbilityAi {
@Override @Override
public Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> choices, Map<String, Object> params) { public Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> choices, Map<String, Object> params) {
Player chosen = null; Player chosen = null;
if ("Curse".equals(sa.getParam("AILogic"))) { if (sa.hasParam("Protect")) {
chosen = new PlayerCollection(choices).min(PlayerPredicates.compareByLife());
}
else if ("Curse".equals(sa.getParam("AILogic"))) {
for (Player pc : choices) { for (Player pc : choices) {
if (pc.isOpponentOf(ai)) { if (pc.isOpponentOf(ai)) {
chosen = pc; chosen = pc;

View File

@@ -3160,7 +3160,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
// no Ability for this type yet, make a new one // no Ability for this type yet, make a new one
if (sa == null) { if (sa == null) {
sa = CardFactoryUtil.buildBasicLandAbility(state, c); sa = CardFactory.buildBasicLandAbility(state, c);
basicLandAbilities[i] = sa; basicLandAbilities[i] = sa;
} }

View File

@@ -380,6 +380,15 @@ public class CardFactory {
} }
} }
public static SpellAbility buildBasicLandAbility(final CardState state, byte color) {
String strcolor = MagicColor.toShortString(color);
String abString = "AB$ Mana | Cost$ T | Produced$ " + strcolor +
" | Secondary$ True | SpellDescription$ Add {" + strcolor + "}.";
SpellAbility sa = AbilityFactory.getAbility(abString, state);
sa.setIntrinsic(true); // always intrisic
return sa;
}
private static Card readCard(final CardRules rules, final IPaperCard paperCard, int cardId, Game game) { private static Card readCard(final CardRules rules, final IPaperCard paperCard, int cardId, Game game) {
final Card card = new Card(cardId, paperCard, game); final Card card = new Card(cardId, paperCard, game);

View File

@@ -89,15 +89,6 @@ import io.sentry.Sentry;
*/ */
public class CardFactoryUtil { public class CardFactoryUtil {
public static SpellAbility buildBasicLandAbility(final CardState state, byte color) {
String strcolor = MagicColor.toShortString(color);
String abString = "AB$ Mana | Cost$ T | Produced$ " + strcolor +
" | Secondary$ True | SpellDescription$ Add {" + strcolor + "}.";
SpellAbility sa = AbilityFactory.getAbility(abString, state);
sa.setIntrinsic(true); // always intrisic
return sa;
}
/** /**
* <p> * <p>
* abilityMorphDown. * abilityMorphDown.
@@ -3932,7 +3923,7 @@ public class CardFactoryUtil {
StringBuilder chooseSB = new StringBuilder(); StringBuilder chooseSB = new StringBuilder();
chooseSB.append("Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplacementResult$ Updated"); chooseSB.append("Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplacementResult$ Updated");
chooseSB.append(" | Description$ (As a Siege enters the battlefield, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)"); chooseSB.append(" | Description$ (As a Siege enters the battlefield, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)");
String chooseProtector = "DB$ ChoosePlayer | Defined$ You | Choices$ Opponent | Protect$ True | ChoiceTitle$ Choose an opponent to protect this battle | AILogic$ Curse"; String chooseProtector = "DB$ ChoosePlayer | Defined$ You | Choices$ Opponent | Protect$ True | ChoiceTitle$ Choose an opponent to protect this battle";
ReplacementEffect re = ReplacementHandler.parseReplacement(chooseSB.toString(), card, true); ReplacementEffect re = ReplacementHandler.parseReplacement(chooseSB.toString(), card, true);
re.setOverridingAbility(AbilityFactory.getAbility(chooseProtector, card)); re.setOverridingAbility(AbilityFactory.getAbility(chooseProtector, card));

View File

@@ -47,6 +47,8 @@ import forge.game.card.Card;
import forge.game.card.CardCollection; import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView; import forge.game.card.CardCollectionView;
import forge.game.card.CardDamageMap; import forge.game.card.CardDamageMap;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CardUtil; import forge.game.card.CardUtil;
import forge.game.keyword.Keyword; import forge.game.keyword.Keyword;
import forge.game.player.Player; import forge.game.player.Player;
@@ -231,7 +233,11 @@ public class Combat {
} }
public final CardCollection getDefendingPlaneswalkers() { public final CardCollection getDefendingPlaneswalkers() {
return new CardCollection(Iterables.filter(attackableEntries, Card.class)); return CardLists.filter(Iterables.filter(attackableEntries, Card.class), CardPredicates.isType("Planeswalker"));
}
public final CardCollection getDefendingBattles() {
return CardLists.filter(Iterables.filter(attackableEntries, Card.class), CardPredicates.isType("Battle"));
} }
public final Map<Card, GameEntity> getAttackersAndDefenders() { public final Map<Card, GameEntity> getAttackersAndDefenders() {