- 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_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

View File

@@ -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;
}

View File

@@ -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<Player> tgtPlayers = getTargetPlayers(sa);
final TargetRestrictions tgt = sa.getTargetRestrictions();
final Map<Player, Integer> chooseMap = new HashMap<Player, Integer>();
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<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()) {
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: