mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 03:08:02 +00:00
- Added Goblin Game and Menacing Ogre
This commit is contained in:
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
if (secretlyChoose) {
|
||||||
|
chooseMap.put(p, chosen);
|
||||||
|
} else {
|
||||||
card.setChosenNumber(chosen);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
11
forge-gui/res/cardsfolder/g/goblin_game.txt
Normal file
11
forge-gui/res/cardsfolder/g/goblin_game.txt
Normal 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.
|
||||||
14
forge-gui/res/cardsfolder/m/menacing_ogre.txt
Normal file
14
forge-gui/res/cardsfolder/m/menacing_ogre.txt
Normal 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.
|
||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user