[Desktop] Display which DeckZone the unplayable cards are from

This commit is contained in:
Paco Ito
2022-01-27 05:08:33 +00:00
committed by Michael Kamensky
parent 93f42be5ec
commit 2493b08093
7 changed files with 68 additions and 11 deletions

View File

@@ -2077,18 +2077,23 @@ public class AiController {
return result;
}
public Collection<? extends PaperCard> complainCardsCantPlayWell(Deck myDeck) {
List<PaperCard> result = Lists.newArrayList();
public Map<DeckSection, List<? extends PaperCard>> complainCardsCantPlayWell(Deck myDeck) {
Map<DeckSection, List<? extends PaperCard>> complaints = new HashMap<>();
// When using simulation, AI should be able to figure out most cards.
if (!useSimulation) {
for (Entry<DeckSection, CardPool> ds : myDeck) {
List<PaperCard> result = Lists.newArrayList();
for (Entry<PaperCard, Integer> cp : ds.getValue()) {
if (cp.getKey().getRules().getAiHints().getRemAIDecks())
if (cp.getKey().getRules().getAiHints().getRemAIDecks()) {
result.add(cp.getKey());
}
}
if (!result.isEmpty()) {
complaints.put(ds.getKey(), result);
}
return result;
}
}
return complaints;
}
// this is where the computer cheats

View File

@@ -28,6 +28,7 @@ import forge.card.MagicColor;
import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostShard;
import forge.deck.Deck;
import forge.deck.DeckSection;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameObject;
@@ -1125,7 +1126,12 @@ public class PlayerControllerAi extends PlayerController {
}
@Override
public Collection<? extends PaperCard> complainCardsCantPlayWell(Deck myDeck) {
public void revealAISkipCards(String message, Map<Player, Map<DeckSection, List<? extends PaperCard>>> deckCards) {
// Ai won't understand that anyway
}
@Override
public Map<DeckSection, List<? extends PaperCard>> complainCardsCantPlayWell(Deck myDeck) {
return brains.complainCardsCantPlayWell(myDeck);
}

View File

@@ -40,6 +40,7 @@ import com.google.common.collect.Sets;
import forge.GameCommand;
import forge.StaticData;
import forge.card.CardStateName;
import forge.deck.DeckSection;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
@@ -1875,7 +1876,15 @@ public class GameAction {
}
}
public void revealUnplayableByAI(String title, Map<Player, Map<DeckSection, List<? extends PaperCard>>> unplayableCards) {
// Notify both players
for (Player p : game.getPlayers()) {
p.getController().revealAISkipCards(title, unplayableCards);
}
}
public void revealAnte(String title, Multimap<Player, PaperCard> removedAnteCards) {
// Notify both players
for (Player p : game.getPlayers()) {
p.getController().revealAnte(title, removedAnteCards);
}

View File

@@ -216,7 +216,7 @@ public class Match {
game.getTriggerHandler().clearDelayedTrigger();
// friendliness
Multimap<Player, PaperCard> rAICards = HashMultimap.create();
Map<Player, Map<DeckSection, List<? extends PaperCard>>> rAICards = new HashMap<>();
Multimap<Player, PaperCard> removedAnteCards = ArrayListMultimap.create();
final FCollectionView<Player> players = game.getPlayers();
@@ -315,9 +315,9 @@ public class Match {
player.shuffle(null);
if (isFirstGame) {
Collection<? extends PaperCard> cardsComplained = player.getController().complainCardsCantPlayWell(myDeck);
if (null != cardsComplained) {
rAICards.putAll(player, cardsComplained);
Map<DeckSection, List<? extends PaperCard>> cardsComplained = player.getController().complainCardsCantPlayWell(myDeck);
if (cardsComplained != null && !cardsComplained.isEmpty()) {
rAICards.put(player, cardsComplained);
}
} else {
//reset cards to fix weird issues on netplay nextgame client
@@ -334,7 +334,7 @@ public class Match {
final Localizer localizer = Localizer.getInstance();
if (!rAICards.isEmpty() && !rules.getGameType().isCardPoolLimited()) {
game.getAction().revealAnte(localizer.getMessage("lblAICantPlayCards"), rAICards);
game.getAction().revealUnplayableByAI(localizer.getMessage("lblAICantPlayCards"), rAICards);
}
if (!removedAnteCards.isEmpty()) {

View File

@@ -17,6 +17,7 @@ import forge.card.ICardFace;
import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostShard;
import forge.deck.Deck;
import forge.deck.DeckSection;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameObject;
@@ -238,10 +239,11 @@ public abstract class PlayerController {
public abstract boolean chooseCardsPile(SpellAbility sa, CardCollectionView pile1, CardCollectionView pile2, String faceUp);
public abstract void revealAnte(String message, Multimap<Player, PaperCard> removedAnteCards);
public abstract void revealAISkipCards(String message, Map<Player, Map<DeckSection, List<? extends PaperCard>>> deckCards);
// These 2 are for AI
public CardCollectionView cheatShuffle(CardCollectionView list) { return list; }
public Collection<? extends PaperCard> complainCardsCantPlayWell(Deck myDeck) { return null; }
public Map<DeckSection, List<? extends PaperCard>> complainCardsCantPlayWell(Deck myDeck) { return null; }
public abstract void resetAtEndOfTurn(); // currently used by the AI to perform card memory cleanup

View File

@@ -19,6 +19,7 @@ import forge.card.MagicColor;
import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostShard;
import forge.deck.Deck;
import forge.deck.DeckSection;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameObject;
@@ -594,6 +595,11 @@ public class PlayerControllerForTests extends PlayerController {
// test this!
}
@Override
public void revealAISkipCards(final String message, final Map<DeckSection, List<? extends PaperCard>> removedUnplayableCards) {
// TODO test this!
}
@Override
public List<PaperCard> chooseCardsYouWonToAddToDeck(List<PaperCard> losses) {
// TODO Auto-generated method stub

View File

@@ -17,6 +17,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.Range;
@@ -2088,6 +2089,34 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
}
}
@Override
public void revealAISkipCards(final String message, final Map<Player, Map<DeckSection, List<? extends PaperCard>>> unplayable) {
for (Player p : unplayable.keySet()) {
final Map<DeckSection, List<? extends PaperCard>> removedUnplayableCards = unplayable.get(p);
final List<String> labels = new ArrayList<>();
for (final DeckSection s: removedUnplayableCards.keySet()) {
labels.add("=== " + getLocalizedDeckSection(s) + " ===");
labels.addAll(removedUnplayableCards.get(s).stream().map(a -> a.toString()).collect(Collectors.toList()));
}
getGui().reveal(localizer.getMessage("lblActionFromPlayerDeck", message, Lang.getInstance().getPossessedObject(MessageUtil.mayBeYou(player, p), "")),
ImmutableList.copyOf(labels));
}
}
private String getLocalizedDeckSection(DeckSection d) {
switch (d) {
case Avatar: return localizer.getMessage("lblAvatar");
case Commander: return localizer.getMessage("lblCommanderDeck");
case Main: return localizer.getMessage("lblMainDeck");
case Sideboard: return localizer.getMessage("lblSideboard");
case Planes: return localizer.getMessage("lblPlanarDeck");
case Schemes: return localizer.getMessage("lblSchemeDeck");
case Conspiracy: return /* TODO localise */ "Conspiracy";
case Dungeon: return /* TODO localise */ "Dungeon";
default: return /* TODO better handling */ "UNKNOWN";
}
}
@Override
public List<PaperCard> chooseCardsYouWonToAddToDeck(final List<PaperCard> losses) {
return getGui().many(localizer.getMessage("lblSelectCardstoAddtoYourDeck"), localizer.getMessage("lblAddTheseToMyDeck"), 0, losses.size(), losses, null);