diff --git a/.gitattributes b/.gitattributes index 25d892321b2..8ee79e91110 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7324,6 +7324,7 @@ res/cardsfolder/o/obstinate_familiar.txt -text res/cardsfolder/o/obzedat_ghost_council.txt -text res/cardsfolder/o/ocular_halo.txt svneol=native#text/plain res/cardsfolder/o/oculus.txt svneol=native#text/plain +res/cardsfolder/o/odds_ends.txt -text res/cardsfolder/o/odious_trow.txt svneol=native#text/plain res/cardsfolder/o/odylic_wraith.txt svneol=native#text/plain res/cardsfolder/o/off_balance.txt svneol=native#text/plain diff --git a/res/cardsfolder/o/odds_ends.txt b/res/cardsfolder/o/odds_ends.txt new file mode 100644 index 00000000000..90a6baf015f --- /dev/null +++ b/res/cardsfolder/o/odds_ends.txt @@ -0,0 +1,18 @@ +Name:Odds +ManaCost:U R +AlternateMode: Split +Types:Instant +A:SP$ FlipACoin | Cost$ U R | NoCall$ True | HeadsSubAbility$ OddCounter | TailsSubAbility$ OddCopy | TgtZone$ Stack | TargetType$ Spell | ValidTgts$ Instant,Sorcery | TgtPrompt$ Select target Instant or Sorcery spell | SpellDescription$ Flip a coin. If it comes up heads, counter target instant or sorcery spell. If it comes up tails, copy that spell and you may choose new targets for the copy. +SVar:OddCounter:DB$ Counter | Defined$ Targeted +SVar:OddCopy:DB$ CopySpellAbility | Defined$ Targeted +SVar:Picture:http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=107445&type=card +Oracle:Flip a coin. If it comes up heads, counter target instant or sorcery spell. If it comes up tails, copy that spell and you may choose new targets for the copy. + +ALTERNATE + +Name:Ends +ManaCost:3 R W +Types:Instant +A:SP$ Sacrifice | Cost$ 3 R W | ValidTgts$ Player | TgtPrompt$ Select target player to make sacrifice | Amount$ 2 | SacValid$ Creature.attacking | SpellDescription$ Target player sacrifices two attacking creatures. +Oracle:Target player sacrifices two attacking creatures. +SetInfo:DIS Rare diff --git a/src/main/java/forge/card/ability/AbilityUtils.java b/src/main/java/forge/card/ability/AbilityUtils.java index 94115041100..04b607e8500 100644 --- a/src/main/java/forge/card/ability/AbilityUtils.java +++ b/src/main/java/forge/card/ability/AbilityUtils.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import javax.swing.JOptionPane; + import org.apache.commons.lang3.StringUtils; import forge.Card; @@ -24,10 +26,12 @@ import forge.game.GameActionUtil; import forge.game.GameState; import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCost; +import forge.game.event.FlipCoinEvent; import forge.game.player.AIPlayer; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.util.Expressions; +import forge.util.MyRandom; /** * TODO: Write javadoc for this type. @@ -1253,4 +1257,28 @@ public class AbilityUtils { return CardFactoryUtil.xCount(c, s); } + /** + *
+ * flipACoin without call. + *
+ * + * @param source + * a {@link forge.Card} object. + * @return a boolean. + */ + public static boolean flipCoin(final Card source) { + final boolean resultIsHeads = MyRandom.getRandom().nextBoolean(); + + Singletons.getModel().getGame().getEvents().post(new FlipCoinEvent()); + final StringBuilder msgTitle = new StringBuilder(); + msgTitle.append(source); + msgTitle.append(" Flip result:"); + final StringBuilder result = new StringBuilder(); + result.append("Flip comes up"); + result.append(resultIsHeads ? " heads." : " tails."); + JOptionPane.showMessageDialog(null, result, msgTitle.toString(), JOptionPane.PLAIN_MESSAGE); + + return resultIsHeads; + } + } diff --git a/src/main/java/forge/card/ability/effects/FlipCoinEffect.java b/src/main/java/forge/card/ability/effects/FlipCoinEffect.java index 5def7233f56..7b4e436adf2 100644 --- a/src/main/java/forge/card/ability/effects/FlipCoinEffect.java +++ b/src/main/java/forge/card/ability/effects/FlipCoinEffect.java @@ -37,7 +37,11 @@ public class FlipCoinEffect extends SpellAbilityEffect { caller.add(player); } - final boolean victory = GuiDialog.flipCoin(caller.get(0), sa.getSourceCard()); + final boolean noCall = sa.hasParam("NoCall"); + boolean victory = false; + if (!noCall) { + victory = GuiDialog.flipCoin(caller.get(0), sa.getSourceCard()); + } // Run triggers // HashMap