diff --git a/Mage.Tests/src/test/java/org/mage/test/utils/ExportJsonGameplayDataTest.java b/Mage.Tests/src/test/java/org/mage/test/utils/ExportJsonGameplayDataTest.java index 8702b02b2eb..b076f71635e 100644 --- a/Mage.Tests/src/test/java/org/mage/test/utils/ExportJsonGameplayDataTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/utils/ExportJsonGameplayDataTest.java @@ -13,12 +13,14 @@ import org.apache.log4j.Logger; import org.junit.Ignore; import org.junit.Test; +import java.io.*; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** - * @author JayDi85 + * @author JayDi85 & ZeldaZach */ public class ExportJsonGameplayDataTest { @@ -33,96 +35,103 @@ public class ExportJsonGameplayDataTest { List cards = new ArrayList<>(); Collection sets = Sets.getInstance().values(); for (ExpansionSet set : sets) { - if (!set.getCode().equals("GRN")) { - //continue; - } - for (ExpansionSet.SetCardInfo setInfo : set.getSetCardInfo()) { - if (cards.size() >= 10) { - //break; - } cards.add(CardImpl.createCard(setInfo.getCardClass(), new CardSetInfo(setInfo.getName(), set.getCode(), setInfo.getCardNumber(), setInfo.getRarity(), setInfo.getGraphicInfo()))); } - } - JsonObject res = new JsonObject(); + JsonObject res = new JsonObject(); - for (Card card : cards) { - try { - JsonObject resCard = new JsonObject(); - res.add(card.getName(), resCard); + for (Card card : cards) { + try { + JsonObject resCard = new JsonObject(); + res.add(card.getName(), resCard); - JsonArray resAbilities = new JsonArray(); - resCard.add("abilities", resAbilities); - for (Ability ability : card.getAbilities()) { - JsonObject resAbility = new JsonObject(); - resAbilities.add(resAbility); - - // basic - resAbility.addProperty("cost", ability.getManaCosts().getText()); - resAbility.addProperty("name", ability.toString()); - resAbility.addProperty("class", ability.getClass().getSimpleName()); - //resAbility.addProperty("rule", ability.getRule()); - - // modes - JsonArray resModes = new JsonArray(); - resAbility.add("modes", resModes); - for (Mode mode : ability.getModes().values()) { - JsonObject resMode = new JsonObject(); - resModes.add(resMode); + JsonArray resAbilities = new JsonArray(); + resCard.add("abilities", resAbilities); + for (Ability ability : card.getAbilities()) { + JsonObject resAbility = new JsonObject(); + resAbilities.add(resAbility); // basic - //resMode.addProperty("name", mode.toString()); + resAbility.addProperty("cost", ability.getManaCosts().getText()); + resAbility.addProperty("name", ability.toString()); + resAbility.addProperty("class", ability.getClass().getSimpleName()); + //resAbility.addProperty("rule", ability.getRule()); - // effects - JsonArray resEffects = new JsonArray(); - resMode.add("effects", resEffects); - for (Effect effect : mode.getEffects()) { - JsonObject resEffect = new JsonObject(); - resEffects.add(resEffect); + // modes + JsonArray resModes = new JsonArray(); + resAbility.add("modes", resModes); + for (Mode mode : ability.getModes().values()) { + JsonObject resMode = new JsonObject(); + resModes.add(resMode); - resEffect.addProperty("class", effect.getClass().getSimpleName()); - resEffect.addProperty("outcome", effect.getOutcome().toString()); - resEffect.addProperty("text", effect.getText(mode)); + // basic + //resMode.addProperty("name", mode.toString()); + + // effects + JsonArray resEffects = new JsonArray(); + resMode.add("effects", resEffects); + for (Effect effect : mode.getEffects()) { + JsonObject resEffect = new JsonObject(); + resEffects.add(resEffect); + + resEffect.addProperty("class", effect.getClass().getSimpleName()); + resEffect.addProperty("outcome", effect.getOutcome().toString()); + resEffect.addProperty("text", effect.getText(mode)); + } + if (resEffects.size() == 0) { + resMode.remove("effects"); + } + + // targets + JsonArray resTargets = new JsonArray(); + resMode.add("targets", resTargets); + for (Target target : mode.getTargets()) { + JsonObject resTarget = new JsonObject(); + resTargets.add(resTarget); + + resTarget.addProperty("name", target.getTargetName()); + resTarget.addProperty("class", target.getClass().getSimpleName()); + resTarget.addProperty("min", target.getMinNumberOfTargets()); + resTarget.addProperty("max", target.getMaxNumberOfTargets()); + } + if (resTargets.size() == 0) { + resMode.remove("targets"); + } + + if (resMode.get("effects") == null && resMode.get("targets") == null) { + resModes.remove(resMode); + } } - if (resEffects.size() == 0) { - resMode.remove("effects"); - } - - // targets - JsonArray resTargets = new JsonArray(); - resMode.add("targets", resTargets); - for (Target target : mode.getTargets()) { - JsonObject resTarget = new JsonObject(); - resTargets.add(resTarget); - - resTarget.addProperty("name", target.getTargetName()); - resTarget.addProperty("class", target.getClass().getSimpleName()); - resTarget.addProperty("min", target.getMinNumberOfTargets()); - resTarget.addProperty("max", target.getMaxNumberOfTargets()); - } - if (resTargets.size() == 0) { - resMode.remove("targets"); - } - - if (resMode.get("effects") == null && resMode.get("targets") == null) { - resModes.remove(resMode); + if (resModes.size() == 0) { + resAbility.remove("modes"); } } - if (resModes.size() == 0) { - resAbility.remove("modes"); - } + } catch (Throwable e) { + logger.error("Inner error for " + card.getName() + ": " + e.getMessage(), e); + break; } - } catch (Throwable e) { - logger.error("Inner error for " + card.getName() + ": " + e.getMessage(), e); - break; + } + + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + String filePath = System.getProperty("user.dir") + "/json/" + set.getCode() + ".json"; + File outputFile = new File(filePath); + final boolean mkdirs = outputFile.getParentFile().mkdirs(); + + try (Writer writer = + new BufferedWriter( + new OutputStreamWriter( + new FileOutputStream(outputFile, false), StandardCharsets.UTF_8 + ) + ) + ) { + writer.write(gson.toJson(res)); + System.out.println("Wrote " + set.getCode() + " to file"); + } catch (Exception e) { + e.printStackTrace(); } } - - Gson gson = new GsonBuilder() - .setPrettyPrinting() - .create(); - System.out.println(gson.toJson(res)); } -} +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenTargetEffect.java index 2d37250007d..f56de68edb2 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenTargetEffect.java @@ -69,6 +69,11 @@ public class CreateTokenTargetEffect extends OneShotEffect { return staticText; } StringBuilder sb = new StringBuilder(); + + if (mode.getTargets().isEmpty()) { + return ""; + } + sb.append("target ").append(mode.getTargets().get(0).getTargetName()); sb.append(" creates "); if (amount.toString().equals("1")) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java index 49d5651cbf7..41200f26f0f 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java @@ -32,7 +32,6 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR * Attention: This effect won't work with targets controlled by different * controllers If this is needed, the validForTurnNum has to be saved per * controller. - * */ public DontUntapInControllersNextUntapStepTargetEffect() { this(""); @@ -43,10 +42,9 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR } /** - * - * @param targetName used as target text for the generated rule text + * @param targetName used as target text for the generated rule text * @param onlyIfControlledByPlayer the effect only works if the permanent is - * controlled by that controller, null = it works for all players + * controlled by that controller, null = it works for all players */ public DontUntapInControllersNextUntapStepTargetEffect(String targetName, UUID onlyIfControlledByPlayer) { this(targetName, false, onlyIfControlledByPlayer); @@ -116,7 +114,7 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR } } } - + if (allHandled) { discard(); } @@ -149,8 +147,7 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR } else return targetName + " doesn't untap during its controller's next " + (twoSteps ? "two " : "") + "untap step" + (twoSteps ? "s" : ""); } else { - return "target " + (mode == null ? "creature" : mode.getTargets().get(0).getTargetName()) + " doesn't untap during its controller's next " + (twoSteps ? "two " : "") + "untap step" + (twoSteps ? "s" : ""); + return "target " + (mode == null || mode.getTargets().isEmpty() ? "creature" : mode.getTargets().get(0).getTargetName()) + " doesn't untap during its controller's next " + (twoSteps ? "two " : "") + "untap step" + (twoSteps ? "s" : ""); } } - -} +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java index 9a1190329d1..89253882c3c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java @@ -65,6 +65,11 @@ public class ReturnFromGraveyardToBattlefieldTargetEffect extends OneShotEffect return staticText; } StringBuilder sb = new StringBuilder(); + + if (mode.getTargets().isEmpty()) { + return ""; + } + Target target = mode.getTargets().get(0); sb.append("return "); if (target.getMaxNumberOfTargets() > 1) { @@ -80,4 +85,4 @@ public class ReturnFromGraveyardToBattlefieldTargetEffect extends OneShotEffect sb.append(" under your control"); return sb.toString(); } -} +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java b/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java index 93647512202..b76a0082d92 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java @@ -51,6 +51,10 @@ public class TapAllTargetPlayerControlsEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } + + if (mode.getTargets().isEmpty()) { + return ""; + } return "tap all " + filter.toString() + " target " + mode.getTargets().get(0).getTargetName() + " controls"; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/TapTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/TapTargetEffect.java index 29d10627a73..91537f95359 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/TapTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/TapTargetEffect.java @@ -54,6 +54,10 @@ public class TapTargetEffect extends OneShotEffect { return "tap " + staticText; } + if (mode.getTargets().isEmpty()) { + return ""; + } + Target target = mode.getTargets().get(0); if (target.getMaxNumberOfTargets() > 1) { if (target.getMaxNumberOfTargets() == target.getNumberOfTargets()) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java index 838996d2b89..a4043355277 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java @@ -65,8 +65,12 @@ public class UntapTargetEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } - Target target = mode.getTargets().get(0); + if (mode.getTargets().isEmpty()) { + return ""; + } + + Target target = mode.getTargets().get(0); StringBuilder sb = new StringBuilder(); sb.append("untap "); if (target.getNumberOfTargets() == 0) { @@ -84,4 +88,4 @@ public class UntapTargetEffect extends OneShotEffect { return sb.toString(); } -} +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainControlTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainControlTargetEffect.java index 993134026fa..e7fefa6dc04 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainControlTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainControlTargetEffect.java @@ -112,6 +112,11 @@ public class GainControlTargetEffect extends ContinuousEffectImpl { if (!staticText.isEmpty()) { return staticText; } + + if (mode.getTargets().isEmpty()) { + return ""; + } + Target target = mode.getTargets().get(0); StringBuilder sb = new StringBuilder("gain control of "); if (target.getMaxNumberOfTargets() > 1) { diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/EchoEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/EchoEffect.java index e2d20da03b4..76c04a4ab5b 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/EchoEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/EchoEffect.java @@ -80,6 +80,11 @@ public class EchoEffect extends OneShotEffect { @Override public String getText(Mode mode) { StringBuilder sb = new StringBuilder("sacrifice {this} unless you "); + + if (cost == null) { + return ""; + } + String costText = cost.getText(); if (costText.toLowerCase(Locale.ENGLISH).startsWith("discard")) { sb.append(costText.substring(0, 1).toLowerCase(Locale.ENGLISH));