- Renamed TriggerFlippedCoin

- Move GuiDialog.flipCoin to FlipCoin effect
- Added Krark's Thumb
This commit is contained in:
swordshine
2013-06-13 12:25:58 +00:00
parent 4d98a07361
commit 49a021115a
10 changed files with 122 additions and 51 deletions

3
.gitattributes vendored
View File

@@ -5962,6 +5962,7 @@ res/cardsfolder/k/krark_clan_ironworks.txt svneol=native#text/plain
res/cardsfolder/k/krark_clan_ogre.txt svneol=native#text/plain res/cardsfolder/k/krark_clan_ogre.txt svneol=native#text/plain
res/cardsfolder/k/krark_clan_shaman.txt svneol=native#text/plain res/cardsfolder/k/krark_clan_shaman.txt svneol=native#text/plain
res/cardsfolder/k/krark_clan_stoker.txt svneol=native#text/plain res/cardsfolder/k/krark_clan_stoker.txt svneol=native#text/plain
res/cardsfolder/k/krarks_thumb.txt -text
res/cardsfolder/k/krasis_incubation.txt -text res/cardsfolder/k/krasis_incubation.txt -text
res/cardsfolder/k/kraul_warrior.txt -text res/cardsfolder/k/kraul_warrior.txt -text
res/cardsfolder/k/krenko_mob_boss.txt -text res/cardsfolder/k/krenko_mob_boss.txt -text
@@ -14318,7 +14319,7 @@ src/main/java/forge/card/trigger/TriggerDevoured.java -text
src/main/java/forge/card/trigger/TriggerDiscarded.java svneol=native#text/plain src/main/java/forge/card/trigger/TriggerDiscarded.java svneol=native#text/plain
src/main/java/forge/card/trigger/TriggerDrawn.java svneol=native#text/plain src/main/java/forge/card/trigger/TriggerDrawn.java svneol=native#text/plain
src/main/java/forge/card/trigger/TriggerEvolved.java -text src/main/java/forge/card/trigger/TriggerEvolved.java -text
src/main/java/forge/card/trigger/TriggerFlipped.java -text src/main/java/forge/card/trigger/TriggerFlippedCoin.java -text
src/main/java/forge/card/trigger/TriggerHandler.java svneol=native#text/plain src/main/java/forge/card/trigger/TriggerHandler.java svneol=native#text/plain
src/main/java/forge/card/trigger/TriggerLandPlayed.java svneol=native#text/plain src/main/java/forge/card/trigger/TriggerLandPlayed.java svneol=native#text/plain
src/main/java/forge/card/trigger/TriggerLifeGained.java svneol=native#text/plain src/main/java/forge/card/trigger/TriggerLifeGained.java svneol=native#text/plain

View File

@@ -1,7 +1,7 @@
Name:Chance Encounter Name:Chance Encounter
ManaCost:2 R R ManaCost:2 R R
Types:Enchantment Types:Enchantment
T:Mode$ Flipped | ValidPlayer$ You | ValidResult$ Win | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you win a coin flip, put a luck counter on CARDNAME. T:Mode$ FlippedCoin | ValidPlayer$ You | ValidResult$ Win | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you win a coin flip, put a luck counter on CARDNAME.
SVar:TrigPutCounter:AB$ PutCounter | Cost$ 0 | CounterType$ LUCK | CounterNum$ 1 SVar:TrigPutCounter:AB$ PutCounter | Cost$ 0 | CounterType$ LUCK | CounterNum$ 1
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_GE10_LUCK | Execute$ TrigWin | TriggerDescription$ At the beginning of your upkeep, if CARDNAME has ten or more luck counters on it, you win the game. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_GE10_LUCK | Execute$ TrigWin | TriggerDescription$ At the beginning of your upkeep, if CARDNAME has ten or more luck counters on it, you win the game.
SVar:TrigWin:AB$ WinsGame | Cost$ 0 | Defined$ You SVar:TrigWin:AB$ WinsGame | Cost$ 0 | Defined$ You

View File

@@ -0,0 +1,6 @@
Name:Krark's Thumb
ManaCost:2
Types:Legendary Artifact
S:Mode$ Continuous | Affected$ You | AddKeyword$ If you would flip a coin, instead flip two coins and ignore one. | Description$ If you would flip a coin, instead flip two coins and ignore one.
SVar:Picture:http://www.wizards.com/global/images/magic/general/krarks_thumb.jpg
Oracle:If you would flip a coin, instead flip two coins and ignore one.

View File

@@ -2,7 +2,6 @@ package forge.card.ability.effects;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import forge.Card; import forge.Card;
import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityFactory;
import forge.card.ability.AbilityUtils; import forge.card.ability.AbilityUtils;
@@ -12,6 +11,7 @@ import forge.card.spellability.SpellAbility;
import forge.card.trigger.TriggerType; import forge.card.trigger.TriggerType;
import forge.game.event.GameEventFlipCoin; import forge.game.event.GameEventFlipCoin;
import forge.game.player.Player; import forge.game.player.Player;
import forge.gui.GuiChoose;
import forge.gui.GuiDialog; import forge.gui.GuiDialog;
import forge.util.MyRandom; import forge.util.MyRandom;
@@ -38,6 +38,7 @@ public class FlipCoinEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) { public void resolve(SpellAbility sa) {
final Card host = sa.getSourceCard(); final Card host = sa.getSourceCard();
final Player player = host.getController(); final Player player = host.getController();
int flipMultiplier = 1; // For multiple copies of Krark's Thumb
final List<Player> playersToFlip = AbilityUtils.getDefinedPlayers(host, sa.getParam("Flipper"), sa); final List<Player> playersToFlip = AbilityUtils.getDefinedPlayers(host, sa.getParam("Flipper"), sa);
if (playersToFlip.isEmpty()) { if (playersToFlip.isEmpty()) {
@@ -52,20 +53,22 @@ public class FlipCoinEffect extends SpellAbilityEffect {
final boolean noCall = sa.hasParam("NoCall"); final boolean noCall = sa.hasParam("NoCall");
boolean victory = false; boolean victory = false;
if (!noCall) { if (!noCall) {
victory = GuiDialog.flipCoin(caller.get(0), host); flipMultiplier = getFilpMultiplier(caller.get(0));
victory = flipCoinCall(caller.get(0), host, flipMultiplier);
} }
// Run triggers // Run triggers
HashMap<String,Object> runParams = new HashMap<String,Object>(); HashMap<String,Object> runParams = new HashMap<String,Object>();
runParams.put("Player", caller.get(0)); runParams.put("Player", caller.get(0));
runParams.put("Result", (Boolean) victory); runParams.put("Result", (Boolean) victory);
player.getGame().getTriggerHandler().runTrigger(TriggerType.Flipped, runParams, false); player.getGame().getTriggerHandler().runTrigger(TriggerType.FlippedCoin, runParams, false);
final boolean rememberResult = sa.hasParam("RememberResult"); final boolean rememberResult = sa.hasParam("RememberResult");
for (final Player flipper : playersToFlip) { for (final Player flipper : playersToFlip) {
if (noCall) { if (noCall) {
final boolean resultIsHeads = FlipCoinEffect.flipCoinNoCall(sa.getSourceCard(), flipper); flipMultiplier = getFilpMultiplier(flipper);
final boolean resultIsHeads = FlipCoinEffect.flipCoinNoCall(sa.getSourceCard(), flipper, flipMultiplier);
if (rememberResult) { if (rememberResult) {
host.addFlipResult(flipper, resultIsHeads ? "Heads" : "Tails"); host.addFlipResult(flipper, resultIsHeads ? "Heads" : "Tails");
} }
@@ -126,19 +129,79 @@ public class FlipCoinEffect extends SpellAbilityEffect {
* *
* @param source the source card. * @param source the source card.
* @param flipper the player flipping the coin. * @param flipper the player flipping the coin.
* @param multiplier
* @return a boolean. * @return a boolean.
*/ */
public static boolean flipCoinNoCall(final Card source, final Player flipper) { public static boolean flipCoinNoCall(final Card source, final Player flipper, final int multiplier) {
final boolean resultIsHeads = MyRandom.getRandom().nextBoolean(); String[] results = new String[multiplier];
String result;
for (int i = 0; i < multiplier; i++) {
final boolean resultIsHeads = MyRandom.getRandom().nextBoolean();
flipper.getGame().fireEvent(new GameEventFlipCoin());
results[i] = resultIsHeads ? " heads." : " tails.";
}
if (multiplier == 1) {
result = results[0];
} else {
result = flipper.getController().chooseFilpResult(source, flipper, results, false);
}
final StringBuilder sb = new StringBuilder();
sb.append(flipper.getName());
sb.append("'s flip comes up");
sb.append(result);
GuiDialog.message(sb.toString(), source + " Flip result:");
return result.equals(" heads.");
}
flipper.getGame().fireEvent(new GameEventFlipCoin()); /**
final StringBuilder result = new StringBuilder(); * <p>
result.append(flipper.getName()); * flipCoinCall.
result.append("'s flip comes up"); * </p>
result.append(resultIsHeads ? " heads." : " tails."); *
GuiDialog.message(result.toString(), source + " Flip result:"); * @param caller
* a {@link forge.game.player.Player} object.
* @param source
* a {@link forge.Card} object.
* @param multiplier
* @return a boolean.
*/
public static boolean flipCoinCall(final Player caller, final Card source, final int multiplier) {
String choice;
final String[] choices = { "heads", "tails" };
String[] results = new String[multiplier];
for (int i = 0; i < multiplier; i++) {
// Play the Flip A Coin sound
caller.getGame().fireEvent(new GameEventFlipCoin());
final boolean flip = MyRandom.getRandom().nextBoolean();
if (caller.isHuman()) {
choice = GuiChoose.one(source.getName() + " - Call coin flip", choices);
} else {
choice = choices[MyRandom.getRandom().nextInt(2)];
}
final boolean winFlip = flip == choice.equals(choices[0]);
final String winMsg = winFlip ? " wins flip." : " loses flip.";
results[i] = winMsg;
}
String result;
if (multiplier == 1) {
result = results[0];
} else {
result = caller.getController().chooseFilpResult(source, caller, results, true);
}
return resultIsHeads; GuiDialog.message(source.getName() + " - " + caller + result, source.getName());
return result.equals(" wins flip.");
}
public static int getFilpMultiplier(final Player flipper) {
int i = 0;
for (String kw : flipper.getKeywords()) {
if (kw.startsWith("If you would flip a coin")) {
i++;
}
}
return 1 << i;
} }
} }

View File

@@ -28,7 +28,7 @@ import forge.card.spellability.SpellAbility;
* @author Forge * @author Forge
* @version $Id: TriggerFlipped.java 17802 2012-10-31 08:05:14Z Max mtg $ * @version $Id: TriggerFlipped.java 17802 2012-10-31 08:05:14Z Max mtg $
*/ */
public class TriggerFlipped extends Trigger { public class TriggerFlippedCoin extends Trigger {
/** /**
* <p> * <p>
@@ -42,7 +42,7 @@ public class TriggerFlipped extends Trigger {
* @param intrinsic * @param intrinsic
* the intrinsic * the intrinsic
*/ */
public TriggerFlipped(final java.util.Map<String, String> params, final Card host, final boolean intrinsic) { public TriggerFlippedCoin(final java.util.Map<String, String> params, final Card host, final boolean intrinsic) {
super(params, host, intrinsic); super(params, host, intrinsic);
} }

View File

@@ -21,7 +21,7 @@ public enum TriggerType {
Clashed(TriggerClashed.class), Clashed(TriggerClashed.class),
PayCumulativeUpkeep(TriggerPayCumulativeUpkeep.class), PayCumulativeUpkeep(TriggerPayCumulativeUpkeep.class),
Flipped(TriggerFlipped.class), FlippedCoin(TriggerFlippedCoin.class),
Attached(TriggerAttached.class), Attached(TriggerAttached.class),
Destroyed(TriggerDestroyed.class), Destroyed(TriggerDestroyed.class),
Devoured(TriggerDevoured.class), Devoured(TriggerDevoured.class),

View File

@@ -144,4 +144,6 @@ public abstract class PlayerController {
public abstract int chooseNumber(SpellAbility sa, String title, int min, int max); public abstract int chooseNumber(SpellAbility sa, String title, int min, int max);
public abstract String chooseFilpResult(Card source, Player flipper, String[] results, boolean call);
} }

View File

@@ -34,6 +34,7 @@ import forge.game.ai.ComputerUtilCombat;
import forge.game.ai.ComputerUtilCost; import forge.game.ai.ComputerUtilCost;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.Aggregates; import forge.util.Aggregates;
import forge.util.MyRandom;
/** /**
@@ -355,4 +356,26 @@ public class PlayerControllerAi extends PlayerController {
public int chooseNumber(SpellAbility sa, String title, int min, int max) { public int chooseNumber(SpellAbility sa, String title, int min, int max) {
return brains.chooseNumber(sa, title, min, max); return brains.chooseNumber(sa, title, min, max);
} }
/* (non-Javadoc)
* @see forge.game.player.PlayerController#chooseFilpResult(forge.Card, forge.game.player.Player, java.lang.String[], boolean)
*/
@Override
public String chooseFilpResult(Card source, Player flipper, String[] results, boolean call) {
if (call) {
// Win if possible
String result = " loses flip.";
for (String s : results) {
if (s.equals(" wins flip.")) {
result = s;
break;
}
}
return result;
} else {
// heads or tails, AI doesn't know which is better now
int i = MyRandom.getRandom().nextInt(results.length);
return results[i];
}
}
} }

View File

@@ -610,4 +610,13 @@ public class PlayerControllerHuman extends PlayerController {
} }
return result; return result;
} }
/* (non-Javadoc)
* @see forge.game.player.PlayerController#chooseFilpResult(forge.game.player.Player, java.lang.String[], boolean)
*/
@Override
public String chooseFilpResult(Card source, Player flipper, String[] results, boolean call) {
return GuiChoose.one(source.getName() + " - Choose a result", results);
}
} }

View File

@@ -80,37 +80,4 @@ public class GuiDialog {
}); });
} }
/**
* <p>
* flipACoin.
* </p>
*
* @param caller
* a {@link forge.game.player.Player} object.
* @param source
* a {@link forge.Card} object.
* @return a boolean.
*/
public static boolean flipCoin(final Player caller, final Card source) {
String choice;
final String[] choices = { "heads", "tails" };
final boolean flip = MyRandom.getRandom().nextBoolean();
if (caller.isHuman()) {
choice = GuiChoose.one(source.getName() + " - Call coin flip", choices);
} else {
choice = choices[MyRandom.getRandom().nextInt(2)];
}
final boolean winFlip = flip == choice.equals(choices[0]);
final String winMsg = winFlip ? " wins flip." : " loses flip.";
// Play the Flip A Coin sound
caller.getGame().fireEvent(new GameEventFlipCoin());
message(source.getName() + " - " + caller + winMsg, source.getName());
return winFlip;
}
} }