From eef787261a6934d33a04d054ec2f2ab80294f27f Mon Sep 17 00:00:00 2001 From: swordshine Date: Sat, 24 May 2014 16:54:05 +0000 Subject: [PATCH] - Added Goblin Game and Menacing Ogre --- .gitattributes | 2 + .../src/main/java/forge/ai/AiController.java | 22 +++-- .../ability/effects/ChooseNumberEffect.java | 80 ++++++++++++++++++- forge-gui/res/cardsfolder/g/goblin_game.txt | 11 +++ forge-gui/res/cardsfolder/m/menacing_ogre.txt | 14 ++++ .../forge/player/PlayerControllerHuman.java | 3 + 6 files changed, 119 insertions(+), 13 deletions(-) create mode 100644 forge-gui/res/cardsfolder/g/goblin_game.txt create mode 100644 forge-gui/res/cardsfolder/m/menacing_ogre.txt diff --git a/.gitattributes b/.gitattributes index 19ff6854b60..cd256c0d83f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5954,6 +5954,7 @@ forge-gui/res/cardsfolder/g/goblin_firestarter.txt svneol=native#text/plain forge-gui/res/cardsfolder/g/goblin_flectomancer.txt -text forge-gui/res/cardsfolder/g/goblin_flotilla.txt -text forge-gui/res/cardsfolder/g/goblin_furrier.txt -text +forge-gui/res/cardsfolder/g/goblin_game.txt -text forge-gui/res/cardsfolder/g/goblin_gardener.txt svneol=native#text/plain forge-gui/res/cardsfolder/g/goblin_gaveleer.txt svneol=native#text/plain forge-gui/res/cardsfolder/g/goblin_general.txt svneol=native#text/plain @@ -8431,6 +8432,7 @@ forge-gui/res/cardsfolder/m/memory_lapse.txt svneol=native#text/plain forge-gui/res/cardsfolder/m/memory_plunder.txt -text forge-gui/res/cardsfolder/m/memory_sluice.txt -text forge-gui/res/cardsfolder/m/memorys_journey.txt -text +forge-gui/res/cardsfolder/m/menacing_ogre.txt -text forge-gui/res/cardsfolder/m/mending_hands.txt svneol=native#text/plain forge-gui/res/cardsfolder/m/mending_touch.txt -text forge-gui/res/cardsfolder/m/meng_huo_barbarian_king.txt svneol=native#text/plain diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 7f6d318f82b..853a8b1ea22 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1312,38 +1312,36 @@ public class AiController { if (player.getLife() < 5 || player.getCardsIn(ZoneType.Hand).size() >= player.getMaxHandSize()) { return min; } - } - else if ("LoseLife".equals(logic)) { + } else if ("LoseLife".equals(logic)) { if (player.getLife() > 5) { return min; } - } - else if ("Min".equals(logic)) { + } else if ("Min".equals(logic)) { return min; - } - else if ("DigACard".equals(logic)) { + } else if ("DigACard".equals(logic)) { int random = MyRandom.getRandom().nextInt(Math.min(4, max)) + 1; if (player.getLife() < random + 5) { return min; } else { return random; } - } - else if ("Damnation".equals(logic)) { + } else if ("Damnation".equals(logic)) { int chosenMax = player.getLife() - 1; int cardsInPlay = player.getCardsIn(ZoneType.Battlefield).size(); return Math.min(chosenMax, cardsInPlay); - } - else if ("OptionalDraw".equals(logic)) { + } else if ("OptionalDraw".equals(logic)) { int cardsInHand = player.getCardsIn(ZoneType.Hand).size(); int maxDraw = Math.min(player.getMaxHandSize() + 2 - cardsInHand, max); int maxCheckLib = Math.min(maxDraw, player.getCardsIn(ZoneType.Library).size()); return Math.max(min, maxCheckLib); - } - else if ("RepeatDraw".equals(logic)) { + } else if ("RepeatDraw".equals(logic)) { int remaining = player.getMaxHandSize() - player.getCardsIn(ZoneType.Hand).size() + MyRandom.getRandom().nextInt(3); return Math.max(remaining, min) / 2; + } else if ("LowestLoseLife".equals(logic)) { + return MyRandom.getRandom().nextInt(Math.min(player.getLife() / 3, player.getOpponent().getLife())) + 1; + } else if ("HighestGetCounter".equals(logic)) { + return MyRandom.getRandom().nextInt(3); } return max; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java index 7d8f6eca702..517f0cb9241 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java @@ -1,12 +1,19 @@ package forge.game.ability.effects; +import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.player.Player; +import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; + +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import java.util.Random; public class ChooseNumberEffect extends SpellAbilityEffect { @@ -33,6 +40,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect { //final int max = sa.containsKey("Max") ? Integer.parseInt(sa.get("Max")) : 99; final boolean random = sa.hasParam("Random"); final boolean anyNumber = sa.hasParam("ChooseAnyNumber"); + final boolean secretlyChoose = sa.hasParam("SecretlyChoose"); final String sMin = sa.getParamOrDefault("Min", "0"); final int min = AbilityUtils.calculateAmount(card, sMin, sa); @@ -41,6 +49,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect { final List tgtPlayers = getTargetPlayers(sa); final TargetRestrictions tgt = sa.getTargetRestrictions(); + final Map chooseMap = new HashMap(); for (final Player p : tgtPlayers) { if ((tgt == null) || p.canBeTargetedBy(sa)) { @@ -58,12 +67,81 @@ public class ChooseNumberEffect extends SpellAbilityEffect { } // don't notify here, because most scripts I've seen don't store that number in a long term } - card.setChosenNumber(chosen); + if (secretlyChoose) { + chooseMap.put(p, chosen); + } else { + card.setChosenNumber(chosen); + } if (sa.hasParam("Notify")) { p.getGame().getAction().nofityOfValue(sa, card, p.getName() + " picked " + chosen, p); } } } + if (secretlyChoose) { + StringBuilder sb = new StringBuilder(); + List highestNum = new ArrayList(); + List lowestNum = new ArrayList(); + int highest = 0; + int lowest = Integer.MAX_VALUE; + for (Entry ev : chooseMap.entrySet()) { + int num = ev.getValue(); + Player player = ev.getKey(); + sb.append(player).append(" chose ").append(num); + sb.append("\r\n"); + if (num > highest) { + highestNum.clear(); + highest = num; + } + if (num == highest) { + highestNum.add(player); + } + if (num < lowest) { + lowestNum.clear(); + lowest = num; + } + if (num == lowest) { + lowestNum.add(player); + } + } + card.getGame().getAction().nofityOfValue(sa, card, sb.toString(), null); + if (sa.hasParam("ChooseNumberSubAbility")) { + SpellAbility sub = AbilityFactory.getAbility(card.getSVar(sa.getParam("ChooseNumberSubAbility")), card); + sub.setActivatingPlayer(sa.getActivatingPlayer()); + ((AbilitySub) sub).setParent(sa); + for (Player p : chooseMap.keySet()) { + card.addRemembered(p); + card.setChosenNumber(chooseMap.get(p)); + AbilityUtils.resolve(sub); + card.clearRemembered(); + } + } + + if (sa.hasParam("Lowest")) { + SpellAbility action = AbilityFactory.getAbility(card.getSVar(sa.getParam("Lowest")), card); + action.setActivatingPlayer(sa.getActivatingPlayer()); + ((AbilitySub) action).setParent(sa); + for (Player p : lowestNum) { + card.addRemembered(p); + card.setChosenNumber(lowest); + AbilityUtils.resolve(action); + card.clearRemembered(); + } + } + if (sa.hasParam("Highest")) { + SpellAbility action = AbilityFactory.getAbility(card.getSVar(sa.getParam("Highest")), card); + action.setActivatingPlayer(sa.getActivatingPlayer()); + ((AbilitySub) action).setParent(sa); + for (Player p : highestNum) { + card.addRemembered(p); + card.setChosenNumber(highest); + AbilityUtils.resolve(action); + card.clearRemembered(); + } + if (sa.hasParam("RememberHighest")) { + card.getRemembered().addAll(highestNum); + } + } + } } } diff --git a/forge-gui/res/cardsfolder/g/goblin_game.txt b/forge-gui/res/cardsfolder/g/goblin_game.txt new file mode 100644 index 00000000000..4f41032b294 --- /dev/null +++ b/forge-gui/res/cardsfolder/g/goblin_game.txt @@ -0,0 +1,11 @@ +Name:Goblin Game +ManaCost:5 R R +Types:Sorcery +A:SP$ ChooseNumber | Defined$ Each | Cost$ 5 R R | Min$ 1 | SecretlyChoose$ True | ChooseNumberSubAbility$ DBLoseLife | Lowest$ DBLoseHalfLife | AILogic$ LowestLoseLife | SpellDescription$ Each player hides at least one item, then all players reveal them simultaneously. Each player loses life equal to the number of items he or she revealed. The player who revealed the fewest items then loses half his or her life, rounded up. If two or more players are tied for fewest, each loses half his or her life, rounded up. +SVar:DBLoseLife:DB$ LoseLife | Defined$ Remembered | References$ X | LifeAmount$ X +SVar:X:Count$ChosenNumber +SVar:DBLoseHalfLife:DB$ LoseLife | Defined$ Remembered | References$ Y | LifeAmount$ Y +SVar:Y:PlayerCountRemembered$LifeTotal/HalfUp +SVar:RemAIDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_game.jpg +Oracle:Each player hides at least one item, then all players reveal them simultaneously. Each player loses life equal to the number of items he or she revealed. The player who revealed the fewest items then loses half his or her life, rounded up. If two or more players are tied for fewest, each loses half his or her life, rounded up. diff --git a/forge-gui/res/cardsfolder/m/menacing_ogre.txt b/forge-gui/res/cardsfolder/m/menacing_ogre.txt new file mode 100644 index 00000000000..4422eaac6cd --- /dev/null +++ b/forge-gui/res/cardsfolder/m/menacing_ogre.txt @@ -0,0 +1,14 @@ +Name:Menacing Ogre +ManaCost:3 R R +Types:Creature Ogre +PT:3/3 +K:Trample +K:Haste +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChooseNumber | TriggerDescription$ When CARDNAME enters the battlefield, each player secretly chooses a number. Then those numbers are revealed. Each player with the highest number loses that much life. If you are one of those players, put two +1/+1 counters on CARDNAME. +SVar:TrigChooseNumber:AB$ ChooseNumber | Cost$ 0 | Defined$ Each | SecretlyChoose$ True | Highest$ DBLoseLife | AILogic$ HighestGetCounter | RememberHighest$ True | SubAbility$ DBPutCounter +SVar:DBLoseLife:DB$ LoseLife | Defined$ Remembered | References$ X | LifeAmount$ X +SVar:X:Count$ChosenNumber +SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | ConditionPlayerDefined$ Remembered | ConditionPlayerContains$ You | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:Picture:http://www.wizards.com/global/images/magic/general/menacing_ogre.jpg +Oracle:Trample, haste\nWhen Menacing Ogre enters the battlefield, each player secretly chooses a number. Then those numbers are revealed. Each player with the highest number loses that much life. If you are one of those players, put two +1/+1 counters on Menacing Ogre. diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 59a1abef6de..c7e8a63284c 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -789,6 +789,9 @@ public class PlayerControllerHuman extends PlayerController { } switch(sa.getApi()) { case ChooseNumber: + if (sa.hasParam("SecretlyChoose")) { + return value; + } final boolean random = sa.hasParam("Random"); return String.format(random ? "Randomly chosen number for %s is %s" : "%s choses number: %s", mayBeYou(target), value); case FlipACoin: