diff --git a/Mage.Common/src/main/java/mage/view/RevealedView.java b/Mage.Common/src/main/java/mage/view/RevealedView.java index 46c34b216d3..2a009dc7fa0 100644 --- a/Mage.Common/src/main/java/mage/view/RevealedView.java +++ b/Mage.Common/src/main/java/mage/view/RevealedView.java @@ -7,6 +7,7 @@ import java.io.Serializable; import mage.cards.Card; import mage.cards.Cards; import mage.game.Game; +import mage.game.permanent.PermanentCard; /** * @author BetaSteward_at_googlemail.com @@ -19,7 +20,11 @@ public class RevealedView implements Serializable { public RevealedView(String name, Cards cards, Game game) { this.name = name; for (Card card : cards.getCards(game)) { - this.cards.put(card.getId(), new CardView(card, game)); + if (card instanceof PermanentCard && card.isFaceDown(game)) { + this.cards.put(card.getId(), new CardView(card.getMainCard())); // do not use game param, so it will take default card + } else { + this.cards.put(card.getId(), new CardView(card, game)); + } } } diff --git a/Mage.Sets/src/mage/cards/h/HauntwoodsShrieker.java b/Mage.Sets/src/mage/cards/h/HauntwoodsShrieker.java new file mode 100644 index 00000000000..3d5f06f34e3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HauntwoodsShrieker.java @@ -0,0 +1,102 @@ +package mage.cards.h; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.keyword.ManifestDreadEffect; +import mage.cards.Card; +import mage.cards.CardsImpl; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterPermanent; +import mage.filter.predicate.card.FaceDownPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; + +/** + * + * @author Grath + */ +public final class HauntwoodsShrieker extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("face down creature"); + + static { + filter.add(FaceDownPredicate.instance); + } + + public HauntwoodsShrieker(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{G}"); + + this.subtype.add(SubType.BEAST); + this.subtype.add(SubType.MUTANT); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Whenever Hauntwoods Shrieker attacks, manifest dread. + this.addAbility(new AttacksTriggeredAbility(new ManifestDreadEffect())); + + // {1}{G}: Reveal target face-down permanent. If it's a creature card, you may turn it face up. + Ability ability = new SimpleActivatedAbility(new HauntwoodsShriekerEffect(), new ManaCostsImpl<>("{1}{G}")); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + private HauntwoodsShrieker(final HauntwoodsShrieker card) { + super(card); + } + + @Override + public HauntwoodsShrieker copy() { + return new HauntwoodsShrieker(this); + } +} + +class HauntwoodsShriekerEffect extends OneShotEffect { + + HauntwoodsShriekerEffect() { + super(Outcome.Benefit); + this.staticText = "Reveal target face-down permanent. If it's a creature card, you may turn it face up"; + } + + private HauntwoodsShriekerEffect(final HauntwoodsShriekerEffect effect) { + super(effect); + } + + @Override + public HauntwoodsShriekerEffect copy() { + return new HauntwoodsShriekerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + MageObject mageObject = game.getObject(source); + if (player == null || mageObject == null) { + return false; + } + Permanent faceDownPermanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (faceDownPermanent != null) { + Card trueCard = (Card)faceDownPermanent.getBasicMageObject(); + player.revealCards(source, new CardsImpl(faceDownPermanent), game); + if (trueCard.isCreature() && player.chooseUse( + faceDownPermanent.getControllerId() == source.getControllerId() ? Outcome.Benefit : Outcome.Detriment, + "Turn " + trueCard.getName() + " face up?", source, game)) { + return faceDownPermanent.turnFaceUp(source, game, source.getControllerId()); + } + } else { + return false; + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java b/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java index d1b61be1f1e..1e66450e904 100644 --- a/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java +++ b/Mage.Sets/src/mage/sets/DuskmournHouseOfHorror.java @@ -180,8 +180,8 @@ public final class DuskmournHouseOfHorror extends ExpansionSet { cards.add(new SetCardInfo("Hand That Feeds", 139, Rarity.COMMON, mage.cards.h.HandThatFeeds.class)); cards.add(new SetCardInfo("Hardened Escort", 16, Rarity.COMMON, mage.cards.h.HardenedEscort.class)); cards.add(new SetCardInfo("Haunted Screen", 250, Rarity.UNCOMMON, mage.cards.h.HauntedScreen.class)); - //cards.add(new SetCardInfo("Hauntwoods Shrieker", 182, Rarity.MYTHIC, mage.cards.h.HauntwoodsShrieker.class, NON_FULL_USE_VARIOUS)); - //cards.add(new SetCardInfo("Hauntwoods Shrieker", 349, Rarity.MYTHIC, mage.cards.h.HauntwoodsShrieker.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hauntwoods Shrieker", 182, Rarity.MYTHIC, mage.cards.h.HauntwoodsShrieker.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hauntwoods Shrieker", 349, Rarity.MYTHIC, mage.cards.h.HauntwoodsShrieker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Hedge Shredder", 183, Rarity.RARE, mage.cards.h.HedgeShredder.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Hedge Shredder", 320, Rarity.RARE, mage.cards.h.HedgeShredder.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Horrid Vigor", 184, Rarity.COMMON, mage.cards.h.HorridVigor.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/ManifestEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/ManifestEffect.java index aba3e39d53c..df1d492475b 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/ManifestEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/ManifestEffect.java @@ -58,7 +58,7 @@ import java.util.Set; * entering the battlefield, that card isn’t manifested. Its characteristics remain unmodified and it remains in * its previous zone. If it was face up, it remains face up. *

- * 701.34g TODO: need support it + * 701.34g * If a manifested permanent that’s represented by an instant or sorcery card would turn face up, its controller * reveals it and leaves it face down. Abilities that trigger whenever a permanent is turned face up won’t trigger. * diff --git a/Mage/src/main/java/mage/game/permanent/PermanentCard.java b/Mage/src/main/java/mage/game/permanent/PermanentCard.java index 639075bc7f5..b7ef957b100 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentCard.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentCard.java @@ -7,13 +7,11 @@ import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.keyword.NightboundAbility; import mage.abilities.keyword.TransformAbility; -import mage.cards.Card; -import mage.cards.LevelerCard; -import mage.cards.ModalDoubleFacedCard; -import mage.cards.SplitCard; +import mage.cards.*; import mage.constants.SpellAbilityType; import mage.game.Game; import mage.game.events.ZoneChangeEvent; +import mage.players.Player; import java.util.UUID; @@ -185,7 +183,10 @@ public class PermanentCard extends PermanentImpl { // 701.34g. If a manifested permanent that's represented by an instant or sorcery card would turn face up, // its controller reveals it and leaves it face down. Abilities that trigger whenever a permanent // is turned face up won't trigger. - // TODO: add reveal effect + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + player.revealCards(source, new CardsImpl(this), game); + } return false; } if (super.turnFaceUp(source, game, playerId)) { diff --git a/Mage/src/main/java/mage/players/Player.java b/Mage/src/main/java/mage/players/Player.java index aed45f3a4a7..5e8286c5b6e 100644 --- a/Mage/src/main/java/mage/players/Player.java +++ b/Mage/src/main/java/mage/players/Player.java @@ -628,6 +628,7 @@ public interface Player extends MageItem, Copyable { *

* Warning, if you use it from continuous effect, then check with extra call * isCanLookAtNextTopLibraryCard + * If you use revealCards with face-down permanents, they will be revealed face up. * * @param source * @param name diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index b853646cebb..4db86272845 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -1910,7 +1910,11 @@ public abstract class PlayerImpl implements Player, Serializable { int last = cards.size(); for (Card card : cards.getCards(game)) { current++; - sb.append(GameLog.getColoredObjectName(card)); // TODO: see same usage in OfferingAbility for hide card's id (is it needs for reveal too?!) + if (card instanceof PermanentCard && card.isFaceDown(game)) { + sb.append(GameLog.getColoredObjectName(card.getMainCard())); + } else { + sb.append(GameLog.getColoredObjectName(card)); // TODO: see same usage in OfferingAbility for hide card's id (is it needs for reveal too?!) + } if (current < last) { sb.append(", "); }