From b2496e3d7f077f42e0d85fdd55f85d98240c3a2b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 5 Sep 2017 16:19:53 +0200 Subject: [PATCH 1/7] Fixed Vintage restricted list. --- .../Mage.Deck.Constructed/src/mage/deck/Vintage.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Vintage.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Vintage.java index 94c0fcf3e35..579418d5703 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Vintage.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Vintage.java @@ -94,7 +94,7 @@ public class Vintage extends Constructed { restricted.add("Memory Jar"); restricted.add("Merchant Scroll"); restricted.add("Mind's Desire"); - restricted.add("Monastery Mentory") + restricted.add("Monastery Mentory"); restricted.add("Mox Emerald"); restricted.add("Mox Jet"); restricted.add("Mox Pearl"); @@ -105,7 +105,7 @@ public class Vintage extends Constructed { restricted.add("Ponder"); restricted.add("Sol Ring"); restricted.add("Strip Mine"); - restricted.add("Thorn of Amethyst") + restricted.add("Thorn of Amethyst"); restricted.add("Time Vault"); restricted.add("Time Walk"); restricted.add("Timetwister"); From 27ad3329b6a699e16671ca555cb2bac93ec0852e Mon Sep 17 00:00:00 2001 From: Jeff Date: Tue, 5 Sep 2017 09:20:31 -0500 Subject: [PATCH 2/7] - Fixed Vintage.java missing semi-colons. --- .../Mage.Deck.Constructed/src/mage/deck/Vintage.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Vintage.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Vintage.java index 94c0fcf3e35..579418d5703 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Vintage.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Vintage.java @@ -94,7 +94,7 @@ public class Vintage extends Constructed { restricted.add("Memory Jar"); restricted.add("Merchant Scroll"); restricted.add("Mind's Desire"); - restricted.add("Monastery Mentory") + restricted.add("Monastery Mentory"); restricted.add("Mox Emerald"); restricted.add("Mox Jet"); restricted.add("Mox Pearl"); @@ -105,7 +105,7 @@ public class Vintage extends Constructed { restricted.add("Ponder"); restricted.add("Sol Ring"); restricted.add("Strip Mine"); - restricted.add("Thorn of Amethyst") + restricted.add("Thorn of Amethyst"); restricted.add("Time Vault"); restricted.add("Time Walk"); restricted.add("Timetwister"); From 0ce13bf676f8f7a0f9d4def87a91c0fed482686a Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 5 Sep 2017 16:20:58 +0200 Subject: [PATCH 3/7] * Grenzo, Havoc Raiser - Fixed that blocked the game. --- .../src/mage/cards/g/GrenzoHavocRaiser.java | 4 ++-- .../combat/AttacksIfAbleTargetEffect.java | 4 ++-- .../common/combat/CantAttackYouEffect.java | 14 +------------- .../common/combat/GoadTargetEffect.java | 19 +++++++++++++------ 4 files changed, 18 insertions(+), 23 deletions(-) diff --git a/Mage.Sets/src/mage/cards/g/GrenzoHavocRaiser.java b/Mage.Sets/src/mage/cards/g/GrenzoHavocRaiser.java index bf163641dcb..60786e5e2e6 100644 --- a/Mage.Sets/src/mage/cards/g/GrenzoHavocRaiser.java +++ b/Mage.Sets/src/mage/cards/g/GrenzoHavocRaiser.java @@ -54,7 +54,7 @@ import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.ExileZone; import mage.game.Game; -import mage.game.events.DamageEvent; +import mage.game.events.DamagedEvent; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.ManaPoolItem; @@ -125,7 +125,7 @@ class GrenzoHavocRaiserTriggeredAbility extends TriggeredAbilityImpl { Player damagedPlayer = game.getPlayer(event.getPlayerId()); Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId()); if (damagedPlayer != null && permanent != null - && ((DamageEvent) event).isCombatDamage() + && ((DamagedEvent) event).isCombatDamage() && getControllerId().equals(permanent.getControllerId())) { FilterCreaturePermanent filter = new FilterCreaturePermanent("creature " + damagedPlayer.getLogName() + " controls"); filter.add(new ControllerIdPredicate(damagedPlayer.getId())); diff --git a/Mage/src/main/java/mage/abilities/effects/common/combat/AttacksIfAbleTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/combat/AttacksIfAbleTargetEffect.java index cc9600fb9c2..6a5f2e3d903 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/combat/AttacksIfAbleTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/combat/AttacksIfAbleTargetEffect.java @@ -74,9 +74,9 @@ public class AttacksIfAbleTargetEffect extends RequirementEffect { return staticText; } if (this.duration == Duration.EndOfTurn) { - return new StringBuilder("Target ").append(mode.getTargets().get(0).getTargetName()).append(" attacks this turn if able").toString(); + return "Target " + mode.getTargets().get(0).getTargetName() + " attacks this turn if able"; } else { - return new StringBuilder("Target ").append(mode.getTargets().get(0).getTargetName()).append(" attacks each turn if able").toString(); + return "Target " + mode.getTargets().get(0).getTargetName() + " attacks each turn if able"; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackYouEffect.java b/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackYouEffect.java index 42907477df9..314897ecba0 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackYouEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackYouEffect.java @@ -40,15 +40,8 @@ import mage.game.permanent.Permanent; */ public class CantAttackYouEffect extends RestrictionEffect { - private boolean canAttackYouAnyway = false; - public CantAttackYouEffect(Duration duration) { - this(duration, false); - } - - public CantAttackYouEffect(Duration duration, boolean canAttackYouAnyway) { super(duration); - this.canAttackYouAnyway = canAttackYouAnyway; } public CantAttackYouEffect(final CantAttackYouEffect effect) { @@ -67,11 +60,6 @@ public class CantAttackYouEffect extends RestrictionEffect { @Override public boolean canAttack(Permanent attacker, UUID defenderId, Ability source, Game game) { - for (UUID player : game.getOpponents(source.getId())) { - if (attacker.canAttack(player, game)) { - return false; - } - } - return !canAttackYouAnyway; + return !defenderId.equals(source.getControllerId()); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/combat/GoadTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/combat/GoadTargetEffect.java index 8384f291b9f..5b5a7b55dd3 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/combat/GoadTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/combat/GoadTargetEffect.java @@ -33,6 +33,8 @@ import mage.abilities.effects.OneShotEffect; import mage.constants.Duration; import mage.constants.Outcome; import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.targetpointer.FixedTarget; /** @@ -63,12 +65,17 @@ public class GoadTargetEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - ContinuousEffect effect = new AttacksIfAbleTargetEffect(Duration.UntilYourNextTurn); - effect.setTargetPointer(new FixedTarget(getTargetPointer().getFirst(game, source))); - game.addEffect(effect, source); - effect = new CantAttackYouEffect(Duration.UntilYourNextTurn, true); - effect.setTargetPointer(new FixedTarget(getTargetPointer().getFirst(game, source))); - game.addEffect(effect, source); + Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source)); + Player controller = game.getPlayer(source.getControllerId()); + if (targetCreature != null && controller != null) { + ContinuousEffect effect = new AttacksIfAbleTargetEffect(Duration.UntilYourNextTurn); + effect.setTargetPointer(new FixedTarget(getTargetPointer().getFirst(game, source))); + game.addEffect(effect, source); + effect = new CantAttackYouEffect(Duration.UntilYourNextTurn); + effect.setTargetPointer(new FixedTarget(getTargetPointer().getFirst(game, source))); + game.addEffect(effect, source); + game.informPlayers(controller.getLogName() + " is goating " + targetCreature.getLogName()); + } return true; } } From 3af9bd894fb56a83357a00b4f2a1ce0203ad18d6 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 5 Sep 2017 16:31:44 +0200 Subject: [PATCH 4/7] * Vision Charm - Fixed bug that caused exception. --- Mage.Sets/src/mage/cards/v/VisionCharm.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Mage.Sets/src/mage/cards/v/VisionCharm.java b/Mage.Sets/src/mage/cards/v/VisionCharm.java index fea2422cbea..242851a45b9 100644 --- a/Mage.Sets/src/mage/cards/v/VisionCharm.java +++ b/Mage.Sets/src/mage/cards/v/VisionCharm.java @@ -102,6 +102,8 @@ class VisionCharmEffect extends ContinuousEffectImpl { public VisionCharmEffect(final VisionCharmEffect effect) { super(effect); + targetLandType = effect.targetLandType; + targetBasicLandType = effect.targetBasicLandType; } @Override @@ -120,8 +122,13 @@ class VisionCharmEffect extends ContinuousEffectImpl { choice = new ChoiceBasicLandType(); controller.choose(outcome, choice, game); targetBasicLandType = choice.getChoice(); + if (targetLandType == null || targetBasicLandType == null) { + this.discard(); + return; + } } else { this.discard(); + return; } FilterPermanent filter = new FilterLandPermanent(); filter.add(new SubtypePredicate(SubType.byDescription(targetLandType))); From 466e524d6ef461806fe7fd0dcffecab7c08531b9 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 5 Sep 2017 16:39:43 +0200 Subject: [PATCH 5/7] Fixed possible exception during draft player repplacement. --- .../main/java/mage/game/draft/DraftImpl.java | 48 +++++++++---------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/Mage/src/main/java/mage/game/draft/DraftImpl.java b/Mage/src/main/java/mage/game/draft/DraftImpl.java index 702ae547fe9..409bc796f0a 100644 --- a/Mage/src/main/java/mage/game/draft/DraftImpl.java +++ b/Mage/src/main/java/mage/game/draft/DraftImpl.java @@ -1,16 +1,16 @@ /* * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR @@ -20,14 +20,14 @@ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.game.draft; +import java.util.*; import mage.cards.Card; import mage.cards.ExpansionSet; import mage.game.draft.DraftOptions.TimingOption; @@ -36,8 +36,6 @@ import mage.game.events.TableEvent.EventType; import mage.players.Player; import mage.players.PlayerList; -import java.util.*; - /** * * @author BetaSteward_at_googlemail.com @@ -89,9 +87,9 @@ public abstract class DraftImpl implements Draft { DraftPlayer newDraftPlayer = new DraftPlayer(newPlayer); DraftPlayer oldDraftPlayer = players.get(oldPlayer.getId()); newDraftPlayer.setBooster(oldDraftPlayer.getBooster()); - Map newPlayers = new LinkedHashMap<>(); + Map newPlayers = new LinkedHashMap<>(); synchronized (players) { - for(Map.Entry entry :players.entrySet()) { + for (Map.Entry entry : players.entrySet()) { if (entry.getKey().equals(oldPlayer.getId())) { newPlayers.put(newPlayer.getId(), newDraftPlayer); } else { @@ -99,7 +97,7 @@ public abstract class DraftImpl implements Draft { } } players.clear(); - for (Map.Entry entry: newPlayers.entrySet()) { + for (Map.Entry entry : newPlayers.entrySet()) { players.put(entry.getKey(), entry.getValue()); } } @@ -109,7 +107,7 @@ public abstract class DraftImpl implements Draft { currentId = newPlayer.getId(); } table.clear(); - for(UUID playerId : players.keySet()) { + for (UUID playerId : players.keySet()) { table.add(playerId); } @@ -117,7 +115,9 @@ public abstract class DraftImpl implements Draft { } if (oldDraftPlayer.isPicking()) { newDraftPlayer.setPicking(); - newDraftPlayer.getPlayer().pickCard(newDraftPlayer.getBooster(), newDraftPlayer.getDeck(), this); + if (!newDraftPlayer.getBooster().isEmpty()) { + newDraftPlayer.getPlayer().pickCard(newDraftPlayer.getBooster(), newDraftPlayer.getDeck(), this); + } } return true; } @@ -143,7 +143,7 @@ public abstract class DraftImpl implements Draft { /** * Number of boosters that each player gets in this draft - * + * * @return */ @Override @@ -151,7 +151,6 @@ public abstract class DraftImpl implements Draft { return numberBoosters; } - @Override public List getSets() { return sets; @@ -219,10 +218,9 @@ public abstract class DraftImpl implements Draft { } } - protected void openBooster() { if (boosterNum < numberBoosters) { - for (DraftPlayer player: players.values()) { + for (DraftPlayer player : players.values()) { if (draftCube != null) { player.setBooster(draftCube.createBooster()); } else { @@ -237,25 +235,26 @@ public abstract class DraftImpl implements Draft { protected boolean pickCards() { cardNum++; - for (DraftPlayer player: players.values()) { + for (DraftPlayer player : players.values()) { if (player.getBooster().isEmpty()) { return false; } player.setPicking(); player.getPlayer().pickCard(player.getBooster(), player.getDeck(), this); } - synchronized(this) { + synchronized (this) { while (!donePicking()) { try { this.wait(); - } catch (InterruptedException ex) { } + } catch (InterruptedException ex) { + } } } return true; } protected boolean donePicking() { - if(isAbort()) { + if (isAbort()) { return true; } return players.values() @@ -304,14 +303,14 @@ public abstract class DraftImpl implements Draft { public boolean addPick(UUID playerId, UUID cardId, Set hiddenCards) { DraftPlayer player = players.get(playerId); if (player.isPicking()) { - for (Card card: player.booster) { + for (Card card : player.booster) { if (card.getId().equals(cardId)) { player.addPick(card, hiddenCards); player.booster.remove(card); break; } } - synchronized(this) { + synchronized (this) { this.notifyAll(); } } @@ -341,7 +340,7 @@ public abstract class DraftImpl implements Draft { @Override public void resetBufferedCards() { Set setsDone = new HashSet<>(); - for(ExpansionSet set: sets) { + for (ExpansionSet set : sets) { if (!setsDone.contains(set)) { set.removeSavedCards(); setsDone.add(set); @@ -350,5 +349,4 @@ public abstract class DraftImpl implements Draft { } - } From d5284ae226601b843ea0143e7c9bb80331623c51 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 5 Sep 2017 16:58:06 +0200 Subject: [PATCH 6/7] Fixed that some user data was not cleared as a user was disconnected. --- Mage.Server/src/main/java/mage/server/User.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Mage.Server/src/main/java/mage/server/User.java b/Mage.Server/src/main/java/mage/server/User.java index 985b8fc7086..e1f0abd8fd5 100644 --- a/Mage.Server/src/main/java/mage/server/User.java +++ b/Mage.Server/src/main/java/mage/server/User.java @@ -388,7 +388,7 @@ public class User { } else { // Table is missing after connection was lost during sideboard. // Means other players were removed or conceded the game? - logger.error("sideboarding id not found : " + entry.getKey()); + logger.debug(getName() + " reconnects during sideboarding but tableId not found: " + entry.getKey()); } } ServerMessagesUtil.instance.incReconnects(); @@ -450,12 +450,14 @@ public class User { TournamentManager.instance.quit(tournamentId, userId); } userTournaments.clear(); + constructing.clear(); logger.trace("REMOVE " + userName + " Tables " + tables.size()); for (Entry entry : tables.entrySet()) { logger.debug("-- leave tableId: " + entry.getValue().getId()); TableManager.instance.leaveTable(userId, entry.getValue().getId()); } tables.clear(); + sideboarding.clear(); logger.trace("REMOVE " + userName + " Game sessions: " + gameSessions.size()); for (GameSessionPlayer gameSessionPlayer : gameSessions.values()) { logger.debug("-- kill game session of gameId: " + gameSessionPlayer.getGameId()); From 1fe26f14090df7c98af80f825247fd9a4b4c8016 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 5 Sep 2017 11:33:43 -0400 Subject: [PATCH 7/7] Implemented Goring Ceratops --- .../src/mage/cards/g/GoringCeratops.java | 74 +++++++++++++++++++ Mage.Sets/src/mage/sets/Ixalan.java | 1 + 2 files changed, 75 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GoringCeratops.java diff --git a/Mage.Sets/src/mage/cards/g/GoringCeratops.java b/Mage.Sets/src/mage/cards/g/GoringCeratops.java new file mode 100644 index 00000000000..0a05aa811d2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GoringCeratops.java @@ -0,0 +1,74 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.g; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.DoubleStrikeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.StaticFilters; + +/** + * + * @author caldover + */ +public class GoringCeratops extends CardImpl { + + public GoringCeratops(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{W}{W}"); + + this.subtype.add("Dinosaur"); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Double Strike + this.addAbility(DoubleStrikeAbility.getInstance()); + + // Whenever Goring Ceratops attacks, other creatures you control gain double strike until end of turn. + Effect effect = new GainAbilityControlledEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE, true); + effect.setText("other creatures you control gain double strike"); + Ability ability = new AttacksTriggeredAbility(effect, false); + this.addAbility(ability); + } + + public GoringCeratops(final GoringCeratops card) { + super(card); + } + + @Override + public GoringCeratops copy() { + return new GoringCeratops(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Ixalan.java b/Mage.Sets/src/mage/sets/Ixalan.java index 2b7821d6421..867240b77ad 100644 --- a/Mage.Sets/src/mage/sets/Ixalan.java +++ b/Mage.Sets/src/mage/sets/Ixalan.java @@ -57,6 +57,7 @@ public class Ixalan extends ExpansionSet { cards.add(new SetCardInfo("Entrancing Melody", 55, Rarity.RARE, mage.cards.e.EntrancingMelody.class)); cards.add(new SetCardInfo("Gishath, Sun's Avatar", 222, Rarity.MYTHIC, mage.cards.g.GishathSunsAvatar.class)); cards.add(new SetCardInfo("Glacial Fortress", 255, Rarity.RARE, mage.cards.g.GlacialFortress.class)); + cards.add(new SetCardInfo("Goring Certatops", 13, Rarity.RARE, mage.cards.g.GoringCeratops.class)); cards.add(new SetCardInfo("Headwater Sentries", 58, Rarity.COMMON, mage.cards.h.HeadwaterSentries.class)); cards.add(new SetCardInfo("Herald of Secret Streams", 59, Rarity.RARE, mage.cards.h.HeraldOfSecretStreams.class)); cards.add(new SetCardInfo("Huatli, Dinosaur Knight", 285, Rarity.MYTHIC, mage.cards.h.HuatliDinosaurKnight.class));