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(", ");
}