- Added Goblin Game and Menacing Ogre

This commit is contained in:
swordshine
2014-05-24 16:54:05 +00:00
parent a4ee8d7b0a
commit eef787261a
6 changed files with 119 additions and 13 deletions

2
.gitattributes vendored
View File

@@ -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_flectomancer.txt -text
forge-gui/res/cardsfolder/g/goblin_flotilla.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_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_gardener.txt svneol=native#text/plain
forge-gui/res/cardsfolder/g/goblin_gaveleer.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 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_plunder.txt -text
forge-gui/res/cardsfolder/m/memory_sluice.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/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_hands.txt svneol=native#text/plain
forge-gui/res/cardsfolder/m/mending_touch.txt -text forge-gui/res/cardsfolder/m/mending_touch.txt -text
forge-gui/res/cardsfolder/m/meng_huo_barbarian_king.txt svneol=native#text/plain forge-gui/res/cardsfolder/m/meng_huo_barbarian_king.txt svneol=native#text/plain

View File

@@ -1312,38 +1312,36 @@ public class AiController {
if (player.getLife() < 5 || player.getCardsIn(ZoneType.Hand).size() >= player.getMaxHandSize()) { if (player.getLife() < 5 || player.getCardsIn(ZoneType.Hand).size() >= player.getMaxHandSize()) {
return min; return min;
} }
} } else if ("LoseLife".equals(logic)) {
else if ("LoseLife".equals(logic)) {
if (player.getLife() > 5) { if (player.getLife() > 5) {
return min; return min;
} }
} } else if ("Min".equals(logic)) {
else if ("Min".equals(logic)) {
return min; return min;
} } else if ("DigACard".equals(logic)) {
else if ("DigACard".equals(logic)) {
int random = MyRandom.getRandom().nextInt(Math.min(4, max)) + 1; int random = MyRandom.getRandom().nextInt(Math.min(4, max)) + 1;
if (player.getLife() < random + 5) { if (player.getLife() < random + 5) {
return min; return min;
} else { } else {
return random; return random;
} }
} } else if ("Damnation".equals(logic)) {
else if ("Damnation".equals(logic)) {
int chosenMax = player.getLife() - 1; int chosenMax = player.getLife() - 1;
int cardsInPlay = player.getCardsIn(ZoneType.Battlefield).size(); int cardsInPlay = player.getCardsIn(ZoneType.Battlefield).size();
return Math.min(chosenMax, cardsInPlay); return Math.min(chosenMax, cardsInPlay);
} } else if ("OptionalDraw".equals(logic)) {
else if ("OptionalDraw".equals(logic)) {
int cardsInHand = player.getCardsIn(ZoneType.Hand).size(); int cardsInHand = player.getCardsIn(ZoneType.Hand).size();
int maxDraw = Math.min(player.getMaxHandSize() + 2 - cardsInHand, max); int maxDraw = Math.min(player.getMaxHandSize() + 2 - cardsInHand, max);
int maxCheckLib = Math.min(maxDraw, player.getCardsIn(ZoneType.Library).size()); int maxCheckLib = Math.min(maxDraw, player.getCardsIn(ZoneType.Library).size());
return Math.max(min, maxCheckLib); return Math.max(min, maxCheckLib);
} } else if ("RepeatDraw".equals(logic)) {
else if ("RepeatDraw".equals(logic)) {
int remaining = player.getMaxHandSize() - player.getCardsIn(ZoneType.Hand).size() int remaining = player.getMaxHandSize() - player.getCardsIn(ZoneType.Hand).size()
+ MyRandom.getRandom().nextInt(3); + MyRandom.getRandom().nextInt(3);
return Math.max(remaining, min) / 2; 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; return max;
} }

View File

@@ -1,12 +1,19 @@
package forge.game.ability.effects; package forge.game.ability.effects;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect; import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions; import forge.game.spellability.TargetRestrictions;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random; import java.util.Random;
public class ChooseNumberEffect extends SpellAbilityEffect { 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 int max = sa.containsKey("Max") ? Integer.parseInt(sa.get("Max")) : 99;
final boolean random = sa.hasParam("Random"); final boolean random = sa.hasParam("Random");
final boolean anyNumber = sa.hasParam("ChooseAnyNumber"); final boolean anyNumber = sa.hasParam("ChooseAnyNumber");
final boolean secretlyChoose = sa.hasParam("SecretlyChoose");
final String sMin = sa.getParamOrDefault("Min", "0"); final String sMin = sa.getParamOrDefault("Min", "0");
final int min = AbilityUtils.calculateAmount(card, sMin, sa); final int min = AbilityUtils.calculateAmount(card, sMin, sa);
@@ -41,6 +49,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect {
final List<Player> tgtPlayers = getTargetPlayers(sa); final List<Player> tgtPlayers = getTargetPlayers(sa);
final TargetRestrictions tgt = sa.getTargetRestrictions(); final TargetRestrictions tgt = sa.getTargetRestrictions();
final Map<Player, Integer> chooseMap = new HashMap<Player, Integer>();
for (final Player p : tgtPlayers) { for (final Player p : tgtPlayers) {
if ((tgt == null) || p.canBeTargetedBy(sa)) { 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 // 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")) { if (sa.hasParam("Notify")) {
p.getGame().getAction().nofityOfValue(sa, card, p.getName() + " picked " + chosen, p); p.getGame().getAction().nofityOfValue(sa, card, p.getName() + " picked " + chosen, p);
} }
} }
} }
if (secretlyChoose) {
StringBuilder sb = new StringBuilder();
List<Player> highestNum = new ArrayList<Player>();
List<Player> lowestNum = new ArrayList<Player>();
int highest = 0;
int lowest = Integer.MAX_VALUE;
for (Entry<Player, Integer> 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);
}
}
}
} }
} }

View File

@@ -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.

View File

@@ -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.

View File

@@ -789,6 +789,9 @@ public class PlayerControllerHuman extends PlayerController {
} }
switch(sa.getApi()) { switch(sa.getApi()) {
case ChooseNumber: case ChooseNumber:
if (sa.hasParam("SecretlyChoose")) {
return value;
}
final boolean random = sa.hasParam("Random"); final boolean random = sa.hasParam("Random");
return String.format(random ? "Randomly chosen number for %s is %s" : "%s choses number: %s", mayBeYou(target), value); return String.format(random ? "Randomly chosen number for %s is %s" : "%s choses number: %s", mayBeYou(target), value);
case FlipACoin: case FlipACoin: