From f7a5217d6937e52482b67f1e23e212a1b9b577b5 Mon Sep 17 00:00:00 2001 From: moomarc Date: Tue, 2 Apr 2013 13:55:33 +0000 Subject: [PATCH] - Improved stack description for hidden origin ChangeZone abilities. Probably still room for improvement, but it should be way better than it was. --- .../ability/effects/ChangeZoneEffect.java | 123 ++++++++++++++---- 1 file changed, 97 insertions(+), 26 deletions(-) diff --git a/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java b/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java index b62c3962279..e71c092672b 100644 --- a/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java +++ b/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java @@ -64,10 +64,51 @@ public class ChangeZoneEffect extends SpellAbilityEffect { final Card host = sa.getSourceCard(); if (!(sa instanceof AbilitySub)) { - sb.append(host.getName()).append(" -"); + sb.append(" -"); } sb.append(" "); + + // Player whose cards will change zones + List fetchers = new ArrayList(); + if (sa.hasParam("DefinedPlayer")) { + fetchers = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("DefinedPlayer"), sa); + } + if (fetchers.isEmpty() && sa.hasParam("ValidTgts") && sa.getTarget() != null) { + fetchers = sa.getTarget().getTargetPlayers(); + } + if (fetchers.isEmpty()) { + fetchers.add(sa.getSourceCard().getController()); + } + + final StringBuilder fetcherSB = new StringBuilder(); + for (int i = 0; i < fetchers.size(); i++) { + fetcherSB.append(fetchers.get(i).getName()); + fetcherSB.append((i + 2) == fetchers.size() ? " and " : (i + 1) == fetchers.size() ? "" : ", "); + } + final String fetcherNames = fetcherSB.toString(); + + // Player who chooses the cards to move + List choosers = new ArrayList(); + if (sa.hasParam("Chooser")) { + choosers = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("Chooser"), sa); + } + if (choosers.isEmpty()) { + choosers.add(sa.getActivatingPlayer()); + } + + final StringBuilder chooserSB = new StringBuilder(); + for (int i = 0; i < choosers.size(); i++) { + chooserSB.append(choosers.get(i).getName()); + chooserSB.append((i + 2) == choosers.size() ? " and " : (i + 1) == choosers.size() ? "" : ", "); + } + final String chooserNames = chooserSB.toString(); + + String fetchPlayer = fetcherNames; + if (chooserNames.equals(fetcherNames)) { + fetchPlayer = fetchers.size() > 1 ? "their" : "his/her"; + } + String origin = ""; if (sa.hasParam("Origin")) { origin = sa.getParam("Origin"); @@ -91,49 +132,79 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } sb.append("."); } else if (origin.equals("Library")) { - sb.append("Search your library for ").append(num).append(" ").append(type).append(" and "); + sb.append(chooserNames); + sb.append(" search").append(choosers.size() > 1 ? " " : "es "); + sb.append(fetchPlayer); + sb.append("'s library for ").append(num).append(" ").append(type).append(" and "); - if (num == 1) { - sb.append("put that card "); + if (destination.equals("Exile")) { + if (num == 1) { + sb.append("exiles that card "); + } else { + sb.append("exiles those cards "); + } } else { - sb.append("put those cards "); + if (num == 1) { + sb.append("puts that card "); + } else { + sb.append("puts those cards "); + } + + if (destination.equals("Battlefield")) { + sb.append("onto the battlefield"); + if (sa.hasParam("Tapped")) { + sb.append(" tapped"); + } + if (sa.hasParam("GainControl")) { + sb.append(" under ").append(chooserNames).append("'s control"); + } + + sb.append("."); + + } + if (destination.equals("Hand")) { + sb.append("into its owner's hand."); + } + if (destination.equals("Graveyard")) { + sb.append("into its owners's graveyard."); + } + } + sb.append(" Then shuffle that library."); + } else if (origin.equals("Hand")) { + sb.append(chooserNames); + if (!chooserNames.equals(fetcherNames)) { + sb.append(" looks at " + fetcherNames + "'s hand and "); + sb.append(destination.equals("Exile") ? "exiles " : "puts "); + sb.append(num).append(" of those ").append(type).append(" card(s)"); + } else { + sb.append(destination.equals("Exile") ? " exiles " : " puts "); + sb.append(num).append(" ").append(type).append(" card(s) from"); + sb.append(fetchPlayer).append(" hand"); } if (destination.equals("Battlefield")) { - sb.append("onto the battlefield"); + sb.append(" onto the battlefield"); if (sa.hasParam("Tapped")) { sb.append(" tapped"); } - - sb.append("."); - - } - if (destination.equals("Hand")) { - sb.append("into your hand."); - } - if (destination.equals("Graveyard")) { - sb.append("into your graveyard."); - } - - sb.append(" Then shuffle your library."); - } else if (origin.equals("Hand")) { - sb.append("Put ").append(num).append(" ").append(type).append(" card(s) from your hand "); - - if (destination.equals("Battlefield")) { - sb.append("onto the battlefield."); + if (sa.hasParam("GainControl")) { + sb.append(" under ").append(chooserNames).append("'s control"); + } } if (destination.equals("Library")) { final int libraryPos = sa.hasParam("LibraryPosition") ? Integer.parseInt(sa.getParam("LibraryPosition")) : 0; if (libraryPos == 0) { - sb.append("on top"); + sb.append(" on top"); } if (libraryPos == -1) { - sb.append("on bottom"); + sb.append(" on the bottom"); } - sb.append(" of your library."); + sb.append(" of ").append(fetchPlayer).append("'s library"); } + + sb.append("."); } else if (origin.equals("Battlefield")) { // TODO Expand on this Description as more cards use it // for the non-targeted SAs when you choose what is returned on