mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 02:38: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_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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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()) {
|
||||
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:
|
||||
|
||||
Reference in New Issue
Block a user