mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
from trunk
This commit is contained in:
@@ -6646,6 +6646,18 @@ public class Card extends GameEntity implements Comparable<Card> {
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} else if (restriction.equals("EachTopLibrary")) {
|
||||
final List<Card> list = new ArrayList<Card>();
|
||||
for (Player p : Singletons.getModel().getGame().getPlayers()) {
|
||||
final Card top = p.getCardsIn(ZoneType.Library).get(0);
|
||||
list.add(top);
|
||||
}
|
||||
for (Card c : list) {
|
||||
if (this.sharesCardTypeWith(c)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else if (property.startsWith("sharesNameWith")) {
|
||||
|
||||
@@ -1071,7 +1071,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
|
||||
|
||||
if (tgt != null) {
|
||||
if (!tgt.getTargetPlayers().isEmpty()) {
|
||||
player = tgt.getTargetPlayers().get(0);
|
||||
player = player != null ? player : tgt.getTargetPlayers().get(0);
|
||||
if (!player.canBeTargetedBy(sa)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import forge.card.spellability.SpellAbilityStackInstance;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.card.trigger.TriggerType;
|
||||
import forge.game.ai.ComputerUtilCard;
|
||||
import forge.game.player.AIPlayer;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.Zone;
|
||||
import forge.game.zone.ZoneType;
|
||||
@@ -523,7 +524,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
|
||||
if (decider == null) {
|
||||
decider = player;
|
||||
}
|
||||
if (decider.isComputer()) {
|
||||
if (decider instanceof AIPlayer) {
|
||||
ChangeZoneAi.hiddenOriginResolveAI(decider, sa, player);
|
||||
} else {
|
||||
changeHiddenOriginResolveHuman(sa, player);
|
||||
@@ -547,11 +548,12 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
|
||||
final Card card = sa.getSourceCard();
|
||||
final List<Card> movedCards = new ArrayList<Card>();
|
||||
final boolean defined = sa.hasParam("Defined");
|
||||
final boolean optional = sa.hasParam("Optional");
|
||||
|
||||
final Target tgt = sa.getTarget();
|
||||
if (tgt != null) {
|
||||
final ArrayList<Player> players = tgt.getTargetPlayers();
|
||||
player = players.get(0);
|
||||
player = player != null ? player : players.get(0);
|
||||
if (players.contains(player) && !player.canBeTargetedBy(sa)) {
|
||||
return;
|
||||
}
|
||||
@@ -595,6 +597,10 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
|
||||
int changeNum = sa.hasParam("ChangeNum") ? AbilityUtils.calculateAmount(card, sa.getParam("ChangeNum"),
|
||||
sa) : 1;
|
||||
|
||||
if (optional && !GuiDialog.confirm(card, "Search " + origin + "?")) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<Card> fetchList;
|
||||
if (defined) {
|
||||
fetchList = new ArrayList<Card>(AbilityUtils.getDefinedCards(card, sa.getParam("Defined"), sa));
|
||||
|
||||
@@ -83,5 +83,6 @@ public class TriggerDrawn extends Trigger {
|
||||
@Override
|
||||
public final void setTriggeringObjects(final SpellAbility sa) {
|
||||
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
|
||||
sa.setTriggeringObject("Player", this.getRunParams().get("Player"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -486,7 +486,7 @@ public class GameState {
|
||||
|
||||
public String getOrdinalPosition(Player player, Player startingPlayer) {
|
||||
int startPosition = roIngamePlayers.indexOf(startingPlayer);
|
||||
int position = roIngamePlayers.indexOf(player) + startPosition + 1;
|
||||
int position = (roIngamePlayers.indexOf(player) + startPosition) % roIngamePlayers.size() + 1;
|
||||
String[] sufixes = new String[] { "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th" };
|
||||
switch (position % 100) {
|
||||
case 11:
|
||||
|
||||
@@ -1393,6 +1393,7 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
|
||||
final HashMap<String, Object> runParams = new HashMap<String, Object>();
|
||||
runParams.put("Card", c);
|
||||
runParams.put("Number", this.numDrawnThisTurn);
|
||||
runParams.put("Player", this);
|
||||
game.getTriggerHandler().runTrigger(TriggerType.Drawn, runParams, false);
|
||||
}
|
||||
// lose:
|
||||
@@ -2490,7 +2491,7 @@ public abstract class Player extends GameEntity implements Comparable<Player> {
|
||||
} else if (property.startsWith("withMore")) {
|
||||
final String cardType = property.split("sThan")[0].substring(8);
|
||||
final List<Card> oppList = CardLists.filter(this.getCardsIn(ZoneType.Battlefield), CardPredicates.isType(cardType));
|
||||
final List<Card> yourList = CardLists.filter(source.getController().getCardsIn(ZoneType.Battlefield), CardPredicates.isType(cardType));
|
||||
final List<Card> yourList = CardLists.filter(sourceController.getCardsIn(ZoneType.Battlefield), CardPredicates.isType(cardType));
|
||||
if (oppList.size() <= yourList.size()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -404,7 +404,7 @@ public class CardDetailPanel extends FPanel {
|
||||
if ((card.hasKeyword("Play with the top card of your library revealed.") || card
|
||||
.hasKeyword("Players play with the top card of their libraries revealed."))
|
||||
&& (card.getController() != null)
|
||||
&& (card.isInZone(ZoneType.Battlefield) || (card.isType("Vanguard") && card.isInZone(ZoneType.Command)))
|
||||
&& (card.isInZone(ZoneType.Battlefield) || ((card.isType("Vanguard") || card.isType("Plane")) && card.isInZone(ZoneType.Command)))
|
||||
&& !card.getController().getZone(ZoneType.Library).isEmpty()) {
|
||||
area.append("\r\nTop card of your library: ");
|
||||
area.append(card.getController().getCardsIn(ZoneType.Library, 1));
|
||||
|
||||
Reference in New Issue
Block a user