From 2b67c8c49768bbabb5bf2c150f9ce78bc3237d10 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 27 Jun 2022 23:46:15 -0400 Subject: [PATCH] DraftEffect.java --- .../game/ability/effects/DraftEffect.java | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java diff --git a/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java new file mode 100644 index 00000000000..fce1683f45e --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java @@ -0,0 +1,83 @@ +package forge.game.ability.effects; + +import forge.StaticData; +import forge.card.ICardFace; +import forge.game.Game; +import forge.game.ability.AbilityKey; +import forge.game.ability.AbilityUtils; +import forge.game.ability.SpellAbilityEffect; +import forge.game.card.Card; +import forge.game.card.CardCollection; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; +import forge.game.zone.ZoneType; +import forge.util.Localizer; + +import java.util.*; + + public class DraftEffect extends SpellAbilityEffect { + @Override + protected String getStackDescription(SpellAbility sa) { + final Card source = sa.getHostCard(); + final Player player = AbilityUtils.getDefinedPlayers(source, sa.getParam("Defined"), sa).get(0); + final ZoneType zone = ZoneType.smartValueOf(sa.getParamOrDefault("Zone", "Hand")); + + final StringBuilder sb = new StringBuilder(); + + sb.append(player).append(" drafts a card from ").append(source.getName()).append("'s spellbook"); + if (zone.equals("Hand")) { + sb.append("."); + } else if (zone.equals("Battlefield")) { + sb.append(" and puts it onto the battlefield."); + } else if (zone.equals("Exile")) { + sb.append(", then exiles it."); + } + + return sb.toString(); + } + + @Override + public void resolve(SpellAbility sa) { + Map moveParams = AbilityKey.newMap(); + moveParams.put(AbilityKey.LastStateBattlefield, sa.getLastStateBattlefield()); + moveParams.put(AbilityKey.LastStateGraveyard, sa.getLastStateGraveyard()); + final Card source = sa.getHostCard(); + final Player player = AbilityUtils.getDefinedPlayers(source, sa.getParam("Defined"), sa).get(0); + final Game game = player.getGame(); + final ZoneType zone = ZoneType.smartValueOf(sa.getParamOrDefault("Zone", "Hand")); + List spellbook = Arrays.asList(sa.getParam("Spellbook").split(",")); + String [] names = sa.getParam("Spellbook").split(","); + final int numToDraft = AbilityUtils.calculateAmount(source, + sa.getParamOrDefault("DraftNum", "1"), sa); + CardCollection drafted = new CardCollection(); + + for (int i = 0; i < numToDraft; i++) { + String chosen = ""; + Collections.shuffle(spellbook); + List faces = new ArrayList<>(); + for (String name : spellbook.subList(0, 3)) { + // Cardnames that include "," must use ";" instead in Spellbook$ (i.e. Tovolar; Dire Overlord) + name = name.replace(";", ","); + faces.add(StaticData.instance().getCommonCards().getFaceByName(name)); + } + chosen = player.getController().chooseCardName(sa, faces, + Localizer.getInstance().getMessage("lblChooseCardDraft")); + if (!chosen.equals("")) { + Card card = Card.fromPaperCard(StaticData.instance().getCommonCards().getUniqueByName(chosen), player); + card.setTokenCard(true); + game.getAction().moveTo(ZoneType.None, card, sa, moveParams); + drafted.add(card); + } + } + + for (final Card c : drafted) { + game.getAction().moveTo(zone, c, sa, moveParams); + if (sa.hasParam("RememberDrafted")) { + source.addRemembered(c); + } + } + if (zone.equals(ZoneType.Library)) { + player.shuffle(sa); + } + } + } \ No newline at end of file