Merge remote-tracking branch 'core/master' into rollback_Phase_dev

# Conflicts:
#	forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java
#	forge-gui-mobile/src/forge/screens/match/MatchController.java
#	forge-gui/src/main/java/forge/gamemodes/net/server/NetGuiGame.java
#	forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java
This commit is contained in:
Anthony Calosa
2021-03-18 17:19:08 +08:00
1479 changed files with 10644 additions and 8016 deletions

View File

@@ -1,5 +1,14 @@
package forge.game;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import forge.card.CardStateName;
import forge.card.MagicColor;
import forge.card.mana.ManaAtom;
@@ -16,13 +25,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Expressions;
import java.util.*;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
/**
* Base class for Triggers,ReplacementEffects and StaticAbilities.
*
@@ -159,15 +161,32 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView,
* a {@link forge.game.card.Card} object.
* @return a boolean.
*/
public static boolean matchesValid(final Object o, final String[] valids, final Card srcCard) {
public boolean matchesValid(final Object o, final String[] valids, final Card srcCard) {
if (o instanceof GameObject) {
final GameObject c = (GameObject) o;
return c.isValid(valids, srcCard.getController(), srcCard, null);
return c.isValid(valids, srcCard.getController(), srcCard, this);
} else if (o instanceof Iterable<?>) {
for (Object o2 : (Iterable<?>)o) {
if (matchesValid(o2, valids, srcCard)) {
return true;
}
}
}
return false;
}
public boolean matchesValid(final Object o, final String[] valids) {
return matchesValid(o, valids, getHostCard());
}
public boolean matchesValidParam(String param, final Object o) {
if (hasParam(param) && !matchesValid(o, getParam(param).split(","))) {
return false;
}
return true;
}
/**
* Sets the suppressed.
*
@@ -312,7 +331,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView,
list.addAll(p.getCardsIn(presentZone));
}
}
list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard(), null);
list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard(), this);
final String rightString = presentCompare.substring(2);
@@ -349,7 +368,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView,
}
}
list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard(), null);
list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard(), this);
final String rightString = presentCompare.substring(2);
int right = AbilityUtils.calculateAmount(getHostCard(), rightString, this);
@@ -361,32 +380,29 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView,
}
if (params.containsKey("CheckDefinedPlayer")) {
SpellAbility mockAbility = this.getHostCard().getFirstSpellAbility();
mockAbility.setActivatingPlayer(hostController);
final String sIsPresent = params.get("CheckDefinedPlayer");
int playersize = AbilityUtils.getDefinedPlayers(game.getCardState(this.getHostCard()), sIsPresent,
mockAbility).size();
int playersize = AbilityUtils.getDefinedPlayers(getHostCard(), sIsPresent, this).size();
String comparator = "GE1";
if (params.containsKey("DefinedPlayerCompare")) {
comparator = params.get("DefinedPlayerCompare");
}
final String svarOperator = comparator.substring(0, 2);
final String svarOperand = comparator.substring(2);
final int operandValue = AbilityUtils.calculateAmount(game.getCardState(this.getHostCard()), svarOperand, this);
final int operandValue = AbilityUtils.calculateAmount(getHostCard(), svarOperand, this);
if (!Expressions.compare(playersize, svarOperator, operandValue)) {
return false;
}
}
if (params.containsKey("CheckSVar")) {
final int sVar = AbilityUtils.calculateAmount(game.getCardState(this.getHostCard()), params.get("CheckSVar"), this);
final int sVar = AbilityUtils.calculateAmount(getHostCard(), params.get("CheckSVar"), this);
String comparator = "GE1";
if (params.containsKey("SVarCompare")) {
comparator = params.get("SVarCompare");
}
final String svarOperator = comparator.substring(0, 2);
final String svarOperand = comparator.substring(2);
final int operandValue = AbilityUtils.calculateAmount(game.getCardState(this.getHostCard()), svarOperand, this);
final int operandValue = AbilityUtils.calculateAmount(getHostCard(), svarOperand, this);
if (!Expressions.compare(sVar, svarOperator, operandValue)) {
return false;
}

View File

@@ -14,7 +14,7 @@ import forge.util.Expressions;
public class ForgeScript {
public static boolean cardStateHasProperty(CardState cardState, String property, Player sourceController,
Card source, SpellAbility spellAbility) {
Card source, CardTraitBase spellAbility) {
final boolean isColorlessSource = cardState.getCard().hasKeyword("Colorless Damage Source", cardState);
final ColorSet colors = cardState.getCard().determineColor(cardState);
@@ -125,7 +125,7 @@ public class ForgeScript {
public static boolean spellAbilityHasProperty(SpellAbility sa, String property, Player sourceController,
Card source, SpellAbility spellAbility) {
Card source, CardTraitBase spellAbility) {
if (property.equals("ManaAbility")) {
return sa.isManaAbility();
} else if (property.equals("nonManaAbility")) {

View File

@@ -17,6 +17,17 @@
*/
package forge.game;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.ArrayListMultimap;
@@ -27,11 +38,19 @@ import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.collect.Table;
import com.google.common.eventbus.EventBus;
import forge.card.CardRarity;
import forge.card.CardStateName;
import forge.card.CardType.Supertype;
import forge.game.ability.AbilityKey;
import forge.game.card.*;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CardUtil;
import forge.game.card.CardView;
import forge.game.card.CounterType;
import forge.game.combat.Combat;
import forge.game.event.Event;
import forge.game.event.GameEventGameOutcome;
@@ -39,7 +58,11 @@ import forge.game.phase.Phase;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.phase.Untap;
import forge.game.player.*;
import forge.game.player.IGameEntitiesFactory;
import forge.game.player.Player;
import forge.game.player.PlayerCollection;
import forge.game.player.PlayerView;
import forge.game.player.RegisteredPlayer;
import forge.game.replacement.ReplacementHandler;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
@@ -54,10 +77,6 @@ import forge.util.Aggregates;
import forge.util.MyRandom;
import forge.util.Visitor;
import java.util.*;
import org.apache.commons.lang3.tuple.Pair;
/**
* Represents the state of a <i>single game</i>, a new instance is created for each game.
*/
@@ -1042,15 +1061,15 @@ public class Game {
}
}
public int getCounterAddedThisTurn(CounterType cType, String validPlayer, String validCard, Card source, Player sourceController, SpellAbility spellAbility) {
public int getCounterAddedThisTurn(CounterType cType, String validPlayer, String validCard, Card source, Player sourceController, CardTraitBase ctb) {
int result = 0;
if (!countersAddedThisTurn.containsRow(cType)) {
return result;
}
for (Map.Entry<Player, List<Pair<Card, Integer>>> e : countersAddedThisTurn.row(cType).entrySet()) {
if (e.getKey().isValid(validPlayer.split(","), sourceController, source, spellAbility)) {
if (e.getKey().isValid(validPlayer.split(","), sourceController, source, ctb)) {
for (Pair<Card, Integer> p : e.getValue()) {
if (p.getKey().isValid(validCard.split(","), sourceController, source, spellAbility)) {
if (p.getKey().isValid(validCard.split(","), sourceController, source, ctb)) {
result += p.getValue();
}
}

View File

@@ -17,8 +17,25 @@
*/
package forge.game;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.tuple.ImmutablePair;
import com.google.common.base.Predicate;
import com.google.common.collect.*;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import forge.GameCommand;
import forge.StaticData;
import forge.card.CardStateName;
@@ -27,8 +44,23 @@ import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.ability.effects.AttachEffect;
import forge.game.card.*;
import forge.game.event.*;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView;
import forge.game.card.CardFactory;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CardUtil;
import forge.game.card.CardZoneTable;
import forge.game.card.CounterEnumType;
import forge.game.card.CounterType;
import forge.game.event.GameEventCardChangeZone;
import forge.game.event.GameEventCardDestroyed;
import forge.game.event.GameEventCardStatsChanged;
import forge.game.event.GameEventCardTapped;
import forge.game.event.GameEventFlipCoin;
import forge.game.event.GameEventGameStarted;
import forge.game.event.GameEventScry;
import forge.game.keyword.KeywordInterface;
import forge.game.mulligan.MulliganService;
import forge.game.player.GameLossReason;
@@ -47,12 +79,13 @@ import forge.game.zone.PlayerZoneBattlefield;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.item.PaperCard;
import forge.util.*;
import forge.util.Aggregates;
import forge.util.Expressions;
import forge.util.MyRandom;
import forge.util.ThreadUtil;
import forge.util.Visitor;
import forge.util.collect.FCollection;
import forge.util.collect.FCollectionView;
import org.apache.commons.lang3.tuple.ImmutablePair;
import java.util.*;
/**
* Methods for common actions performed during a game.
@@ -362,10 +395,6 @@ public class GameAction {
}
}
zoneFrom.remove(c);
if (!zoneTo.is(ZoneType.Exile) && !zoneTo.is(ZoneType.Stack)) {
c.setExiledWith(null);
c.setExiledBy(null);
}
// cleanup Encoding
if (c.hasEncodedCard()) {
@@ -379,6 +408,16 @@ public class GameAction {
e.removeEncodedCard(c);
}
}
if (!zoneTo.is(ZoneType.Exile) && !zoneTo.is(ZoneType.Stack)) {
Card with = c.getExiledWith();
if (with != null) {
with.removeUntilLeavesBattlefield(c);
}
c.setExiledWith(null);
c.setExiledBy(null);
}
}
// if an adventureCard is put from Stack somewhere else, need to reset to Original State
@@ -1143,7 +1182,7 @@ public class GameAction {
}
if (c.hasKeyword("The number of loyalty counters on CARDNAME is equal to the number of Beebles you control.")) {
int beeble = CardLists.getValidCardCount(game.getCardsIn(ZoneType.Battlefield), "Beeble.YouCtrl", c.getController(), c);
int beeble = CardLists.getValidCardCount(game.getCardsIn(ZoneType.Battlefield), "Beeble.YouCtrl", c.getController(), c, null);
int loyal = c.getCounters(CounterEnumType.LOYALTY);
if (loyal < beeble) {
GameEntityCounterTable counterTable = new GameEntityCounterTable();

View File

@@ -17,6 +17,10 @@
*/
package forge.game;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
@@ -27,8 +31,13 @@ import forge.card.mana.ManaCostParser;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.card.*;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView;
import forge.game.card.CardFactoryUtil;
import forge.game.card.CardPlayOption;
import forge.game.card.CardPlayOption.PayManaCost;
import forge.game.card.CounterType;
import forge.game.cost.Cost;
import forge.game.keyword.Keyword;
import forge.game.keyword.KeywordInterface;
@@ -37,7 +46,14 @@ import forge.game.player.PlayerController;
import forge.game.replacement.ReplacementEffect;
import forge.game.replacement.ReplacementHandler;
import forge.game.replacement.ReplacementLayer;
import forge.game.spellability.*;
import forge.game.spellability.AbilityManaPart;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.AlternativeCost;
import forge.game.spellability.OptionalCost;
import forge.game.spellability.OptionalCostValue;
import forge.game.spellability.Spell;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityRestriction;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
import forge.game.trigger.TriggerType;
@@ -45,10 +61,6 @@ import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.TextUtil;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
/**
* <p>

View File

@@ -17,6 +17,12 @@
*/
package forge.game;
import java.util.Map;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.card.CardCollection;
@@ -37,12 +43,6 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.collect.FCollection;
import java.util.Map;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
public abstract class GameEntity extends GameObject implements IIdentifiable {
protected final int id;

View File

@@ -10,7 +10,6 @@ import com.google.common.collect.Table;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.card.CounterType;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
public class GameEntityCounterTable extends ForwardingTable<GameEntity, CounterType, Integer> {
@@ -63,7 +62,7 @@ public class GameEntityCounterTable extends ForwardingTable<GameEntity, CounterT
return result;
}
public Map<GameEntity, Integer> filterTable(CounterType type, String valid, Card host, SpellAbility sa) {
public Map<GameEntity, Integer> filterTable(CounterType type, String valid, Card host, CardTraitBase sa) {
Map<GameEntity, Integer> result = Maps.newHashMap();
for (Map.Entry<GameEntity, Integer> e : column(type).entrySet()) {

View File

@@ -17,6 +17,24 @@
*/
package forge.game;
import java.io.File;
import java.io.FilenameFilter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
@@ -36,13 +54,6 @@ import forge.util.FileUtil;
import forge.util.storage.StorageBase;
import forge.util.storage.StorageReaderRecursiveFolderWithUserFolder;
import java.io.File;
import java.io.FilenameFilter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Map.Entry;
public class GameFormat implements Comparable<GameFormat> {
private final String name;

View File

@@ -17,13 +17,13 @@
*/
package forge.game;
import forge.game.event.IGameEventVisitor;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import forge.game.event.IGameEventVisitor;
/**
* <p>
* GameLog class.

View File

@@ -22,7 +22,7 @@ public abstract class GameObject {
* @param spellAbility
* @return true, if is valid
*/
public boolean isValid(final String[] restrictions, final Player sourceController, final Card source, SpellAbility spellAbility) {
public boolean isValid(final String[] restrictions, final Player sourceController, final Card source, CardTraitBase spellAbility) {
for (final String restriction : restrictions) {
if (this.isValid(restriction, sourceController, source, spellAbility)) {
return true;
@@ -43,7 +43,7 @@ public abstract class GameObject {
* @param spellAbility
* @return true, if is valid
*/
public boolean isValid(final String restriction, final Player sourceController, final Card source, SpellAbility spellAbility) {
public boolean isValid(final String restriction, final Player sourceController, final Card source, CardTraitBase spellAbility) {
return false;
}
@@ -59,7 +59,7 @@ public abstract class GameObject {
* @param spellAbility
* @return true, if successful
*/
public boolean hasProperty(final String property, final Player sourceController, final Card source, SpellAbility spellAbility) {
public boolean hasProperty(final String property, final Player sourceController, final Card source, CardTraitBase spellAbility) {
return false;
}
}

View File

@@ -21,7 +21,6 @@ import com.google.common.base.Predicate;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
/**
@@ -33,7 +32,7 @@ import forge.game.spellability.SpellAbility;
*/
public final class GameObjectPredicates {
public static final Predicate<GameObject> restriction(final String[] restrictions, final Player sourceController, final Card source, final SpellAbility spellAbility) {
public static final Predicate<GameObject> restriction(final String[] restrictions, final Player sourceController, final Card source, final CardTraitBase spellAbility) {
return new Predicate<GameObject>() {
@Override
public boolean apply(final GameObject c) {

View File

@@ -17,7 +17,15 @@
*/
package forge.game;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.google.common.collect.Lists;
import forge.LobbyPlayer;
import forge.game.player.Player;
import forge.game.player.PlayerOutcome;
@@ -26,10 +34,6 @@ import forge.game.player.PlayerView;
import forge.game.player.RegisteredPlayer;
import forge.item.PaperCard;
import java.io.Serializable;
import java.util.*;
import java.util.Map.Entry;
/**
* <p>
* GameInfo class.

View File

@@ -5,6 +5,7 @@ import java.util.Set;
import com.google.common.base.Enums;
import com.google.common.base.Function;
import forge.StaticData;
import forge.deck.CardPool;
import forge.deck.Deck;

View File

@@ -1,6 +1,9 @@
package forge.game;
import java.util.List;
import com.google.common.collect.Iterables;
import forge.LobbyPlayer;
import forge.deck.Deck;
import forge.game.GameOutcome.AnteResult;
@@ -19,8 +22,6 @@ import forge.trackable.TrackableObject;
import forge.trackable.TrackableProperty;
import forge.util.collect.FCollectionView;
import java.util.List;
public class GameView extends TrackableObject {
private static final long serialVersionUID = 8522884512960961528L;

View File

@@ -1,6 +1,22 @@
package forge.game;
import com.google.common.collect.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multiset;
import com.google.common.eventbus.EventBus;
import forge.LobbyPlayer;
@@ -20,12 +36,9 @@ import forge.game.trigger.Trigger;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
import forge.item.PaperCard;
import forge.util.Localizer;
import forge.util.MyRandom;
import forge.util.collect.FCollectionView;
import forge.util.Localizer;
import java.util.*;
import java.util.Map.Entry;
public class Match {
private final List<RegisteredPlayer> players;

View File

@@ -1,13 +1,13 @@
package forge.game;
import forge.game.ability.AbilityKey;
import forge.game.player.Player;
import forge.game.trigger.TriggerType;
import java.util.Map;
import com.google.common.collect.ImmutableList;
import forge.game.ability.AbilityKey;
import forge.game.player.Player;
import forge.game.trigger.TriggerType;
/**
* Represents the planar dice for Planechase games.
*

View File

@@ -17,19 +17,18 @@
*/
package forge.game;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView;
import forge.game.player.Player;
import forge.game.staticability.StaticAbility;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView;
import forge.game.player.Player;
import forge.game.staticability.StaticAbility;
/**
* <p>
* StaticEffect class.

View File

@@ -1,13 +1,13 @@
package forge.game.ability;
import java.util.Map;
import forge.game.card.Card;
import forge.game.cost.Cost;
import forge.game.spellability.AbilityActivated;
import forge.game.spellability.AbilityManaPart;
import forge.game.spellability.TargetRestrictions;
import java.util.Map;
public class AbilityApiBased extends AbilityActivated {
private final SpellAbilityEffect effect;

View File

@@ -17,9 +17,13 @@
*/
package forge.game.ability;
import java.util.List;
import java.util.Map;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.card.CardStateName;
import forge.game.CardTraitBase;
import forge.game.IHasSVars;
@@ -27,15 +31,16 @@ import forge.game.ability.effects.CharmEffect;
import forge.game.card.Card;
import forge.game.card.CardState;
import forge.game.cost.Cost;
import forge.game.spellability.*;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityCondition;
import forge.game.spellability.SpellAbilityRestriction;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.FileSection;
import io.sentry.Sentry;
import io.sentry.event.BreadcrumbBuilder;
import java.util.List;
import java.util.Map;
/**
* <p>
* AbilityFactory class.

View File

@@ -61,6 +61,7 @@ public enum AbilityKey {
EffectOnly("EffectOnly"),
Exploited("Exploited"),
Explorer("Explorer"),
ExtraTurn("ExtraTurn"),
Event("Event"),
Fighter("Fighter"),
Fighters("Fighters"),

View File

@@ -1,5 +1,15 @@
package forge.game.ability;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
@@ -18,9 +28,15 @@ import forge.game.CardTraitBase;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameObject;
import forge.game.TriggerReplacementBase;
import forge.game.ability.AbilityFactory.AbilityRecordType;
import forge.game.card.*;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView;
import forge.game.card.CardFactoryUtil;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CardUtil;
import forge.game.card.CounterType;
import forge.game.cost.Cost;
import forge.game.keyword.Keyword;
import forge.game.keyword.KeywordInterface;
@@ -30,7 +46,13 @@ import forge.game.mana.ManaCostBeingPaid;
import forge.game.player.Player;
import forge.game.player.PlayerCollection;
import forge.game.player.PlayerPredicates;
import forge.game.spellability.*;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.Spell;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityRestriction;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.spellability.SpellPermanent;
import forge.game.spellability.TargetChoices;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
@@ -42,15 +64,6 @@ import forge.util.collect.FCollectionView;
import io.sentry.Sentry;
import io.sentry.event.BreadcrumbBuilder;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class AbilityUtils {
private final static ImmutableList<String> cmpList = ImmutableList.of("LT", "LE", "EQ", "GE", "GT", "NE");
@@ -86,7 +99,7 @@ public class AbilityUtils {
// But then we only need update one function at a time once the casting is
// everywhere.
// Probably will move to One function solution sometime in the future
public static CardCollection getDefinedCards(final Card hostCard, final String def, final SpellAbility sa) {
public static CardCollection getDefinedCards(final Card hostCard, final String def, final CardTraitBase sa) {
CardCollection cards = new CardCollection();
String defined = (def == null) ? "Self" : applyAbilityTextChangeEffects(def, sa); // default to Self
final String[] incR = defined.split("\\.", 2);
@@ -101,7 +114,11 @@ public class AbilityUtils {
c = game.getCardState(hostCard);
}
else if (defined.equals("OriginalHost")) {
c = sa.getRootAbility().getOriginalHost();
if (sa instanceof SpellAbility) {
c = ((SpellAbility)sa).getRootAbility().getOriginalHost();
} else {
c = sa.getOriginalHost();
}
}
else if (defined.equals("EffectSource")) {
if (hostCard.isEmblem() || hostCard.getType().hasSubtype("Effect")) {
@@ -129,10 +146,12 @@ public class AbilityUtils {
}
else if (defined.equals("Enchanted")) {
c = hostCard.getEnchantingCard();
if ((c == null) && (sa != null) && (sa.getRootAbility() != null)
&& (sa.getRootAbility().getPaidList("Sacrificed") != null)
&& !sa.getRootAbility().getPaidList("Sacrificed").isEmpty()) {
c = sa.getRootAbility().getPaidList("Sacrificed").get(0).getEnchantingCard();
if (c == null && sa instanceof SpellAbility) {
SpellAbility root = ((SpellAbility)sa).getRootAbility();
CardCollection sacrificed = root.getPaidList("Sacrificed");
if (sacrificed != null && !sacrificed.isEmpty()) {
c = sacrificed.getFirst().getEnchantingCard();
}
}
}
else if (defined.endsWith("OfLibrary")) {
@@ -144,26 +163,26 @@ public class AbilityUtils {
return cards;
}
}
else if (defined.equals("Targeted")) {
final SpellAbility saTargeting = sa.getSATargetingCard();
else if (defined.equals("Targeted") && sa instanceof SpellAbility) {
final SpellAbility saTargeting = ((SpellAbility)sa).getSATargetingCard();
if (saTargeting != null) {
Iterables.addAll(cards, saTargeting.getTargets().getTargetCards());
}
}
else if (defined.equals("ThisTargetedCard")) { // do not add parent targeted
if (sa != null && sa.getTargets() != null) {
Iterables.addAll(cards, sa.getTargets().getTargetCards());
else if (defined.equals("ThisTargetedCard") && sa instanceof SpellAbility) { // do not add parent targeted
if (((SpellAbility)sa).getTargets() != null) {
Iterables.addAll(cards, ((SpellAbility)sa).getTargets().getTargetCards());
}
}
else if (defined.equals("ParentTarget")) {
final SpellAbility parent = sa.getParentTargetingCard();
else if (defined.equals("ParentTarget") && sa instanceof SpellAbility) {
final SpellAbility parent = ((SpellAbility)sa).getParentTargetingCard();
if (parent != null) {
Iterables.addAll(cards, parent.getTargets().getTargetCards());
}
}
else if (defined.startsWith("Triggered") && (sa != null)) {
final SpellAbility root = sa.getRootAbility();
else if (defined.startsWith("Triggered") && sa instanceof SpellAbility) {
final SpellAbility root = ((SpellAbility)sa).getRootAbility();
if (defined.contains("LKICopy")) { //Triggered*LKICopy
int lkiPosition = defined.indexOf("LKICopy");
AbilityKey type = AbilityKey.fromString(defined.substring(9, lkiPosition));
@@ -192,8 +211,8 @@ public class AbilityUtils {
}
}
}
else if (defined.startsWith("Replaced") && (sa != null)) {
final SpellAbility root = sa.getRootAbility();
else if (defined.startsWith("Replaced") && sa instanceof SpellAbility) {
final SpellAbility root = ((SpellAbility)sa).getRootAbility();
AbilityKey type = AbilityKey.fromString(defined.substring(8));
final Object crd = root.getReplacingObject(type);
@@ -239,8 +258,8 @@ public class AbilityUtils {
cards.add((Card) o);
}
}
} else if (defined.equals("DelayTriggerRememberedLKI")) {
SpellAbility root = sa.getRootAbility();
} else if (defined.equals("DelayTriggerRememberedLKI") && sa instanceof SpellAbility) {
SpellAbility root = ((SpellAbility)sa).getRootAbility();
if (root != null) {
for (Object o : root.getTriggerRemembered()) {
if (o instanceof Card) {
@@ -250,8 +269,8 @@ public class AbilityUtils {
} else {
System.err.println("Warning: couldn't find trigger SA in the chain of SpellAbility " + sa);
}
} else if (defined.equals("DelayTriggerRemembered")) {
SpellAbility root = sa.getRootAbility();
} else if (defined.equals("DelayTriggerRemembered") && sa instanceof SpellAbility) {
SpellAbility root = ((SpellAbility)sa).getRootAbility();
if (root != null) {
for (Object o : root.getTriggerRemembered()) {
if (o instanceof Card) {
@@ -313,31 +332,36 @@ public class AbilityUtils {
}
} else {
CardCollection list = null;
if (defined.startsWith("SacrificedCards")) {
list = sa.getRootAbility().getPaidList("SacrificedCards");
} else if (defined.startsWith("Sacrificed")) {
list = sa.getRootAbility().getPaidList("Sacrificed");
} else if (defined.startsWith("Revealed")) {
list = sa.getRootAbility().getPaidList("Revealed");
} else if (defined.startsWith("DiscardedCards")) {
list = sa.getRootAbility().getPaidList("DiscardedCards");
} else if (defined.startsWith("Discarded")) {
list = sa.getRootAbility().getPaidList("Discarded");
} else if (defined.startsWith("ExiledCards")) {
list = sa.getRootAbility().getPaidList("ExiledCards");
} else if (defined.startsWith("Exiled")) {
list = sa.getRootAbility().getPaidList("Exiled");
} else if (defined.startsWith("Milled")) {
list = sa.getRootAbility().getPaidList("Milled");
} else if (defined.startsWith("TappedCards")) {
list = sa.getRootAbility().getPaidList("TappedCards");
} else if (defined.startsWith("Tapped")) {
list = sa.getRootAbility().getPaidList("Tapped");
} else if (defined.startsWith("UntappedCards")) {
list = sa.getRootAbility().getPaidList("UntappedCards");
} else if (defined.startsWith("Untapped")) {
list = sa.getRootAbility().getPaidList("Untapped");
} else if (defined.startsWith("Valid ")) {
if (sa instanceof SpellAbility) {
SpellAbility root = ((SpellAbility)sa).getRootAbility();
if (defined.startsWith("SacrificedCards")) {
list = root.getPaidList("SacrificedCards");
} else if (defined.startsWith("Sacrificed")) {
list = root.getPaidList("Sacrificed");
} else if (defined.startsWith("Revealed")) {
list = root.getPaidList("Revealed");
} else if (defined.startsWith("DiscardedCards")) {
list = root.getPaidList("DiscardedCards");
} else if (defined.startsWith("Discarded")) {
list = root.getPaidList("Discarded");
} else if (defined.startsWith("ExiledCards")) {
list = root.getPaidList("ExiledCards");
} else if (defined.startsWith("Exiled")) {
list = root.getPaidList("Exiled");
} else if (defined.startsWith("Milled")) {
list = root.getPaidList("Milled");
} else if (defined.startsWith("TappedCards")) {
list = root.getPaidList("TappedCards");
} else if (defined.startsWith("Tapped")) {
list = root.getPaidList("Tapped");
} else if (defined.startsWith("UntappedCards")) {
list = root.getPaidList("UntappedCards");
} else if (defined.startsWith("Untapped")) {
list = root.getPaidList("Untapped");
}
}
if (defined.startsWith("Valid ")) {
String validDefined = defined.substring("Valid ".length());
list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), validDefined.split(","), hostCard.getController(), hostCard, sa);
} else if (defined.startsWith("ValidAll ")) {
@@ -348,8 +372,6 @@ public class AbilityUtils {
String zone = s[0].substring("Valid".length());
String validDefined = s[1];
list = CardLists.getValidCards(game.getCardsIn(ZoneType.smartValueOf(zone)), validDefined.split(","), hostCard.getController(), hostCard, sa);
} else {
return cards;
}
if (list != null) {
@@ -806,7 +828,7 @@ public class AbilityUtils {
* a {@link forge.game.spellability.SpellAbility} object.
* @return a {@link java.util.ArrayList} object.
*/
public static FCollection<GameObject> getDefinedObjects(final Card card, final String def, final SpellAbility sa) {
public static FCollection<GameObject> getDefinedObjects(final Card card, final String def, final CardTraitBase sa) {
final FCollection<GameObject> objects = new FCollection<>();
final String defined = (def == null) ? "Self" : def;
@@ -816,7 +838,7 @@ public class AbilityUtils {
return objects;
}
public static FCollection<GameEntity> getDefinedEntities(final Card card, final String def, final SpellAbility sa) {
public static FCollection<GameEntity> getDefinedEntities(final Card card, final String def, final CardTraitBase sa) {
final FCollection<GameEntity> objects = new FCollection<>();
final String defined = (def == null) ? "Self" : def;
@@ -965,32 +987,32 @@ public class AbilityUtils {
* a {@link forge.game.spellability.SpellAbility} object.
* @return a {@link java.util.ArrayList} object.
*/
public static PlayerCollection getDefinedPlayers(final Card card, final String def, final SpellAbility sa) {
public static PlayerCollection getDefinedPlayers(final Card card, final String def, final CardTraitBase sa) {
final PlayerCollection players = new PlayerCollection();
final String defined = (def == null) ? "You" : applyAbilityTextChangeEffects(def, sa);
final Game game = card == null ? null : card.getGame();
final Player player = sa == null ? card.getController() : sa.getActivatingPlayer();
final Player player = sa instanceof SpellAbility ? ((SpellAbility)sa).getActivatingPlayer() : card.getController();
if (defined.equals("TargetedOrController")) {
players.addAll(getDefinedPlayers(card, "Targeted", sa));
players.addAll(getDefinedPlayers(card, "TargetedController", sa));
}
else if (defined.equals("Targeted") || defined.equals("TargetedPlayer")) {
final SpellAbility saTargeting = sa.getSATargetingPlayer();
else if ((defined.equals("Targeted") || defined.equals("TargetedPlayer")) && sa instanceof SpellAbility) {
final SpellAbility saTargeting = ((SpellAbility)sa).getSATargetingPlayer();
if (saTargeting != null) {
players.addAll(saTargeting.getTargets().getTargetPlayers());
}
}
else if (defined.equals("ParentTarget")) {
final SpellAbility parent = sa.getParentTargetingPlayer();
else if (defined.equals("ParentTarget") && sa instanceof SpellAbility) {
final SpellAbility parent = ((SpellAbility)sa).getParentTargetingPlayer();
if (parent != null) {
players.addAll(parent.getTargets().getTargetPlayers());
}
}
else if (defined.equals("ThisTargetedPlayer")) { // do not add parent targeted
if (sa != null && sa.getTargets() != null) {
Iterables.addAll(players, sa.getTargets().getTargetPlayers());
else if (defined.equals("ThisTargetedPlayer") && sa instanceof SpellAbility) { // do not add parent targeted
if (((SpellAbility)sa).getTargets() != null) {
Iterables.addAll(players, ((SpellAbility)sa).getTargets().getTargetPlayers());
}
}
else if (defined.equals("TargetedController")) {
@@ -1006,11 +1028,11 @@ public class AbilityUtils {
players.add(c.getOwner());
}
}
else if (defined.equals("TargetedAndYou")) {
final SpellAbility saTargeting = sa.getSATargetingPlayer();
else if (defined.equals("TargetedAndYou") && sa instanceof SpellAbility) {
final SpellAbility saTargeting = ((SpellAbility)sa).getSATargetingPlayer();
if (saTargeting != null) {
players.addAll(saTargeting.getTargets().getTargetPlayers());
players.add(sa.getActivatingPlayer());
players.add(((SpellAbility)sa).getActivatingPlayer());
}
}
else if (defined.equals("ParentTargetedController")) {
@@ -1024,8 +1046,8 @@ public class AbilityUtils {
else if (defined.startsWith("Remembered")) {
addPlayer(card.getRemembered(), defined, players);
}
else if (defined.startsWith("DelayTriggerRemembered")) {
SpellAbility root = sa.getRootAbility();
else if (defined.startsWith("DelayTriggerRemembered") && sa instanceof SpellAbility) {
SpellAbility root = ((SpellAbility)sa).getRootAbility();
if (root != null) {
addPlayer(root.getTriggerRemembered(), defined, players);
} else {
@@ -1042,12 +1064,12 @@ public class AbilityUtils {
players.add(rem.getOwner());
}
}
else if (defined.startsWith("Triggered")) {
else if (defined.startsWith("Triggered") && sa instanceof SpellAbility) {
String defParsed = defined.endsWith("AndYou") ? defined.substring(0, defined.indexOf("AndYou")) : defined;
if (defined.endsWith("AndYou")) {
players.add(sa.getActivatingPlayer());
players.add(((SpellAbility)sa).getActivatingPlayer());
}
final SpellAbility root = sa.getRootAbility();
final SpellAbility root = ((SpellAbility)sa).getRootAbility();
Object o = null;
if (defParsed.endsWith("Controller")) {
String triggeringType = defParsed.substring(9);
@@ -1108,8 +1130,8 @@ public class AbilityUtils {
players.addAll(player.getOpponents());
players.removeAll(getDefinedPlayers(card, defined.substring(6), sa));
}
else if (defined.startsWith("Replaced")) {
final SpellAbility root = sa.getRootAbility();
else if (defined.startsWith("Replaced") && sa instanceof SpellAbility) {
final SpellAbility root = ((SpellAbility)sa).getRootAbility();
Object o = null;
if (defined.endsWith("Controller")) {
String replacingType = defined.substring(8);
@@ -1252,7 +1274,7 @@ public class AbilityUtils {
* @return a {@link java.util.ArrayList} object.
*/
public static FCollection<SpellAbility> getDefinedSpellAbilities(final Card card, final String def,
final SpellAbility sa) {
final CardTraitBase sa) {
final FCollection<SpellAbility> sas = new FCollection<>();
final String defined = (def == null) ? "Self" : applyAbilityTextChangeEffects(def, sa); // default to Self
final Game game = card.getGame();
@@ -1261,14 +1283,14 @@ public class AbilityUtils {
// TODO - this probably needs to be fleshed out a bit, but the basics
// work
if (defined.equals("Self")) {
s = sa;
if (defined.equals("Self") && sa instanceof SpellAbility) {
s = (SpellAbility)sa;
}
else if (defined.equals("Parent")) {
s = sa.getRootAbility();
else if (defined.equals("Parent") && sa instanceof SpellAbility) {
s = ((SpellAbility)sa).getRootAbility();
}
else if (defined.equals("Targeted")) {
final SpellAbility saTargeting = sa.getSATargetingSA();
else if (defined.equals("Targeted") && sa instanceof SpellAbility) {
final SpellAbility saTargeting = ((SpellAbility)sa).getSATargetingSA();
if (saTargeting != null) {
for (SpellAbility targetSpell : saTargeting.getTargets().getTargetSpells()) {
SpellAbilityStackInstance stackInstance = game.getStack().getInstanceFromSpellAbility(targetSpell);
@@ -1284,8 +1306,8 @@ public class AbilityUtils {
}
}
}
else if (defined.startsWith("Triggered")) {
final SpellAbility root = sa.getRootAbility();
else if (defined.startsWith("Triggered") && sa instanceof SpellAbility) {
final SpellAbility root = ((SpellAbility)sa).getRootAbility();
final String triggeringType = defined.substring(9);
final Object o = root.getTriggeringObject(AbilityKey.fromString(triggeringType));
@@ -1584,6 +1606,7 @@ public class AbilityUtils {
final String s2 = AbilityUtils.applyAbilityTextChangeEffects(s, ctb);
final String[] l = s2.split("/");
final String expr = CardFactoryUtil.extractOperators(s2);
final Player player = ctb instanceof SpellAbility ? ((SpellAbility)ctb).getActivatingPlayer() : ctb.getHostCard().getController();
final String[] sq;
sq = l[0].split("\\.");
@@ -1781,13 +1804,6 @@ public class AbilityUtils {
}
}
if (l[0].startsWith("CountersAddedThisTurn")) {
final String[] parts = l[0].split(" ");
CounterType cType = CounterType.getType(parts[1]);
return CardFactoryUtil.doXMath(game.getCounterAddedThisTurn(cType, parts[2], parts[3], c, sa.getActivatingPlayer(), sa), expr, c);
}
if (sq[0].startsWith("CastTotalManaSpent")) {
return CardFactoryUtil.doXMath(c.getCastSA() != null ? c.getCastSA().getTotalManaSpent() : 0, expr, c);
}
@@ -1804,12 +1820,13 @@ public class AbilityUtils {
return CardFactoryUtil.doXMath(v, expr, c);
}
}
if (ctb instanceof TriggerReplacementBase) {
if (ctb instanceof CardTraitBase) {
if (l[0].startsWith("CountersAddedThisTurn")) {
final String[] parts = l[0].split(" ");
CounterType cType = CounterType.getType(parts[1]);
return CardFactoryUtil.doXMath(game.getCounterAddedThisTurn(cType, parts[2], parts[3], c, ctb.getHostCard().getController(), null), expr, c);
return CardFactoryUtil.doXMath(game.getCounterAddedThisTurn(cType, parts[2], parts[3], c, player, ctb), expr, c);
}
}
}

View File

@@ -1,12 +1,12 @@
package forge.game.ability;
import forge.game.ability.effects.*;
import forge.util.ReflectionUtil;
import java.util.HashMap;
import java.util.Map;
import forge.game.ability.effects.*;
import forge.util.ReflectionUtil;
/**
* TODO: Write javadoc for this type.
*
@@ -153,9 +153,9 @@ public enum ApiType {
SetLife (LifeSetEffect.class),
SetState (SetStateEffect.class),
Shuffle (ShuffleEffect.class),
SkipPhase (SkipPhaseEffect.class),
SkipTurn (SkipTurnEffect.class),
StoreSVar (StoreSVarEffect.class),
StoreMap (StoreMapEffect.class),
Subgame (SubgameEffect.class),
Surveil (SurveilEffect.class),
SwitchBlock (SwitchBlockEffect.class),

View File

@@ -4,22 +4,23 @@ import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import forge.card.MagicColor;
import forge.util.TextUtil;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Table;
import forge.GameCommand;
import forge.card.CardType;
import forge.card.MagicColor;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameObject;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardFactoryUtil;
import forge.game.card.CardZoneTable;
import forge.game.combat.Combat;
import forge.game.player.Player;
import forge.game.player.PlayerCollection;
@@ -35,6 +36,7 @@ import forge.game.zone.ZoneType;
import forge.util.CardTranslation;
import forge.util.Lang;
import forge.util.Localizer;
import forge.util.TextUtil;
import forge.util.collect.FCollection;
/**
@@ -613,4 +615,32 @@ public abstract class SpellAbilityEffect {
}
return combatChanged;
}
protected static GameCommand untilHostLeavesPlayCommand(final CardZoneTable triggerList, final Card hostCard) {
final Game game = hostCard.getGame();
hostCard.addUntilLeavesBattlefield(triggerList.allCards());
return new GameCommand() {
private static final long serialVersionUID = 1L;
@Override
public void run() {
CardZoneTable untilTable = new CardZoneTable();
for (Table.Cell<ZoneType, ZoneType, CardCollection> cell : triggerList.cellSet()) {
for (Card c : cell.getValue()) {
// better check if card didn't changed zones again?
Card newCard = c.getZone().getCards().get(c);
if (newCard == null || !newCard.equalsWithTimestamp(c)) {
continue;
}
// no cause there?
Card movedCard = game.getAction().moveTo(cell.getRowKey(), newCard, null);
untilTable.put(cell.getColumnKey(), cell.getRowKey(), movedCard);
}
}
untilTable.triggerChangesZoneAll(game);
}
};
}
}

View File

@@ -1,5 +1,7 @@
package forge.game.ability;
import java.util.Map;
import forge.game.ability.effects.ChangeZoneAllEffect;
import forge.game.ability.effects.ChangeZoneEffect;
import forge.game.card.Card;
@@ -7,8 +9,6 @@ import forge.game.cost.Cost;
import forge.game.spellability.AbilityStatic;
import forge.game.spellability.TargetRestrictions;
import java.util.Map;
public class StaticAbilityApiBased extends AbilityStatic {
private final SpellAbilityEffect effect;

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.Map;
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.SpellAbilityEffect;
@@ -8,10 +10,8 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import forge.util.CardTranslation;
import java.util.Map;
import forge.util.Localizer;
public class AbandonEffect extends SpellAbilityEffect {

View File

@@ -1,5 +1,12 @@
package forge.game.ability.effects;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.card.CardLists;
@@ -7,16 +14,9 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.collect.FCollection;
import forge.util.Lang;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import java.util.List;
import forge.util.collect.FCollection;
public class ActivateAbilityEffect extends SpellAbilityEffect {
@Override

View File

@@ -1,9 +1,16 @@
package forge.game.ability.effects;
import java.util.ArrayList;
import java.util.List;
import forge.game.ability.AbilityFactory;
import forge.game.ability.SpellAbilityEffect;
import forge.game.phase.ExtraPhase;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
/**
* TODO: Write javadoc for this type.
@@ -13,32 +20,55 @@ public class AddPhaseEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
boolean isTopsy = sa.getActivatingPlayer().hasKeyword("The phases of your turn are reversed.");
PhaseHandler phaseHandler = sa.getActivatingPlayer().getGame().getPhaseHandler();
PhaseType extra = PhaseType.smartValueOf(sa.getParam("ExtraPhase"));
PhaseType currentPhase = phaseHandler.getPhase();
PhaseType after;
// Check for World at War - may need to be moved to SpellAbilityCondition later?
if (sa.hasParam("BeforeFirstPostCombatMainEnd")) {
if (!phaseHandler.beforeFirstPostCombatMainEnd()) {
return;
}
}
PhaseType afterPhase;
if (sa.hasParam("AfterPhase")) {
after = PhaseType.smartValueOf(sa.getParam("AfterPhase"));
afterPhase = PhaseType.smartValueOf(sa.getParam("AfterPhase"));
}
else {
// If "AfterPhase" param is missing it means the added Phase comes after this Phase
after = phaseHandler.getPhase();
// If "AfterPhase" param is missing it means the added Phase comes afterPhase this Phase
afterPhase = currentPhase;
}
phaseHandler.addExtraPhase(after, extra);
// The original next phase following afterPhase
PhaseType nextPhase = PhaseType.getNext(afterPhase, isTopsy);
List<PhaseType> extraPhaseList = new ArrayList<>();
// Insert ExtraPhase
String extra = sa.getParam("ExtraPhase");
if (extra.equals("Beginning")) {
extraPhaseList.addAll(PhaseType.PHASE_GROUPS.get(0));
} else if (extra.equals("Combat")) {
extraPhaseList.addAll(PhaseType.PHASE_GROUPS.get(2));
} else { // Currently no effect will add End Phase
extraPhaseList.add(PhaseType.smartValueOf(extra));
}
// Insert FollowedBy
if (sa.hasParam("FollowedBy")) {
String followedBy = sa.getParam("FollowedBy");
PhaseType followingExtra;
if ("ThisPhase".equals(followedBy)) {
followingExtra = phaseHandler.getPhase();
} else {
followingExtra = PhaseType.smartValueOf(followedBy);
}
PhaseType followingAfter = extra.equals(PhaseType.COMBAT_BEGIN) ? PhaseType.COMBAT_END : extra;
if (sa.hasParam("AdditionalBeginningPhase")) {
followingAfter = extra.equals(PhaseType.UNTAP) ? PhaseType.DRAW : extra;
}
phaseHandler.addExtraPhase(followingAfter, followingExtra);
// Currently all FollowedBy are Main2 phase, which has no step
PhaseType followingExtra = PhaseType.smartValueOf(sa.getParam("FollowedBy"));
extraPhaseList.add(followingExtra);
}
ExtraPhase extraPhase = phaseHandler.addExtraPhase(afterPhase, extraPhaseList, nextPhase);
if (sa.hasParam("ExtraPhaseDelayedTrigger")) {
final Trigger delTrig = TriggerHandler.parseTrigger(sa.getSVar(sa.getParam("ExtraPhaseDelayedTrigger")), sa.getHostCard(), true);
SpellAbility overridingSA = AbilityFactory.getAbility(sa.getSVar(sa.getParam("ExtraPhaseDelayedTriggerExcute")), sa.getHostCard());
overridingSA.setActivatingPlayer(sa.getActivatingPlayer());
delTrig.setOverridingAbility(overridingSA);
extraPhase.addTrigger(delTrig);
}
}
}

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.List;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
@@ -10,8 +12,6 @@ import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
import forge.util.Localizer;
import java.util.List;
public class AddTurnEffect extends SpellAbilityEffect {
@Override
@@ -57,6 +57,7 @@ public class AddTurnEffect extends SpellAbilityEffect {
}
if (sa.hasParam("SkipUntap")) {
extra.setSkipUntap(true);
extra.setSkipUntapSA(sa);
}
if (sa.hasParam("NoSchemes")) {
extra.setCantSetSchemesInMotion(true);

View File

@@ -1,5 +1,11 @@
package forge.game.ability.effects;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.google.common.collect.ImmutableList;
import forge.GameCommand;
import forge.card.CardType;
import forge.game.Game;
@@ -12,12 +18,6 @@ import forge.game.event.GameEventCardStatsChanged;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.google.common.collect.ImmutableList;
public class AnimateAllEffect extends AnimateEffectBase {
@Override

View File

@@ -1,5 +1,10 @@
package forge.game.ability.effects;
import java.util.Arrays;
import java.util.List;
import com.google.common.collect.Lists;
import forge.card.CardType;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
@@ -8,11 +13,6 @@ import forge.game.card.CardUtil;
import forge.game.event.GameEventCardStatsChanged;
import forge.game.spellability.SpellAbility;
import com.google.common.collect.Lists;
import java.util.Arrays;
import java.util.List;
public class AnimateEffect extends AnimateEffectBase {

View File

@@ -17,6 +17,10 @@
*/
package forge.game.ability.effects;
import java.util.List;
import com.google.common.collect.Lists;
import forge.GameCommand;
import forge.card.CardType;
import forge.card.mana.ManaCost;
@@ -37,10 +41,6 @@ import forge.game.staticability.StaticAbility;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
import java.util.List;
import com.google.common.collect.Lists;
public abstract class AnimateEffectBase extends SpellAbilityEffect {
public static void doAnimate(final Card c, final SpellAbility sa, final Integer power, final Integer toughness,
final CardType addType, final CardType removeType, final String colors,

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.List;
import forge.GameCommand;
import forge.game.Game;
import forge.game.GameEntity;
@@ -15,12 +17,10 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.collect.FCollection;
import forge.util.CardTranslation;
import forge.util.Lang;
import forge.util.Localizer;
import forge.util.CardTranslation;
import java.util.List;
import forge.util.collect.FCollection;
public class AttachEffect extends SpellAbilityEffect {
@Override
@@ -199,7 +199,7 @@ public class AttachEffect extends SpellAbilityEffect {
final FCollection<Player> players = new FCollection<>();
for (Player player : game.getPlayers()) {
if (player.isValid(tgt.getValidTgts(), aura.getActivatingPlayer(), source, null)) {
if (player.isValid(tgt.getValidTgts(), aura.getActivatingPlayer(), source, aura)) {
players.add(player);
}
}

View File

@@ -1,5 +1,9 @@
package forge.game.ability.effects;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.SpellAbilityEffect;
@@ -13,10 +17,6 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.collect.FCollectionView;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* TODO: Write javadoc for this type.
*
@@ -41,7 +41,7 @@ public class BalanceEffect extends SpellAbilityEffect {
for(int i = 0; i < players.size(); i++) {
// Find the minimum of each Valid per player
validCards.add(CardLists.getValidCards(players.get(i).getCardsIn(zone), valid, activator, source));
validCards.add(CardLists.getValidCards(players.get(i).getCardsIn(zone), valid, activator, source, sa));
min = Math.min(min, validCards.get(i).size());
}

View File

@@ -1,5 +1,12 @@
package forge.game.ability.effects;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.Lists;
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.SpellAbilityEffect;
@@ -8,13 +15,6 @@ import forge.game.event.GameEventCombatChanged;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.Map;
public class BecomesBlockedEffect extends SpellAbilityEffect {
@Override

View File

@@ -10,8 +10,8 @@ import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.util.collect.FCollection;
import forge.util.Localizer;
import forge.util.collect.FCollection;
public class BidLifeEffect extends SpellAbilityEffect {
@Override

View File

@@ -1,5 +1,12 @@
package forge.game.ability.effects;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
@@ -7,17 +14,11 @@ import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.combat.Combat;
import forge.game.event.GameEventCombatChanged;
import forge.game.Game;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.Lang;
import java.util.*;
import com.google.common.collect.Lists;
public class BlockEffect extends SpellAbilityEffect {
@Override

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.List;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -8,8 +10,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import java.util.List;
public class BondEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {

View File

@@ -1,5 +1,12 @@
package forge.game.ability.effects;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.Maps;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.ability.AbilityKey;
@@ -12,16 +19,9 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.spellability.TargetRestrictions;
import forge.util.collect.FCollectionView;
import forge.util.Localizer;
import forge.util.CardTranslation;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.Maps;
import java.util.List;
import java.util.Map;
import forge.util.Localizer;
import forge.util.collect.FCollectionView;
public class ChangeCombatantsEffect extends SpellAbilityEffect {

View File

@@ -1,5 +1,11 @@
package forge.game.ability.effects;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
@@ -15,12 +21,6 @@ import forge.game.zone.MagicStack;
import forge.util.Aggregates;
import forge.util.Localizer;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import java.util.ArrayList;
import java.util.List;
/**
* TODO: Write javadoc for this type.
*

View File

@@ -13,8 +13,8 @@ import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.event.GameEventCardStatsChanged;
import forge.game.spellability.SpellAbility;
import forge.util.TextUtil;
import forge.util.Localizer;
import forge.util.TextUtil;
public class ChangeTextEffect extends SpellAbilityEffect {

View File

@@ -1,5 +1,8 @@
package forge.game.ability.effects;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
@@ -8,18 +11,20 @@ import forge.game.GameActionUtil;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.*;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CardUtil;
import forge.game.card.CardZoneTable;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.TextUtil;
import forge.util.Localizer;
import java.util.List;
import java.util.Map;
import forge.util.TextUtil;
public class ChangeZoneAllEffect extends SpellAbilityEffect {
@Override
@@ -37,6 +42,11 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
//if host is not on the battlefield don't apply
if (sa.hasParam("UntilHostLeavesPlay") && !sa.getHostCard().isInPlay()) {
return;
}
final ZoneType destination = ZoneType.smartValueOf(sa.getParam("Destination"));
final List<ZoneType> origin = ZoneType.listValueOf(sa.getParam("Origin"));
@@ -74,7 +84,7 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
}
if (origin.contains(ZoneType.Library) && sa.hasParam("Search") && sa.getActivatingPlayer().canSearchLibraryWith(sa, null)) {
CardCollection libCards = CardLists.getValidCards(cards, "Card.inZoneLibrary", sa.getActivatingPlayer(), source);
CardCollection libCards = CardLists.getValidCards(cards, "Card.inZoneLibrary", sa.getActivatingPlayer(), source, sa);
CardCollection libCardsYouOwn = CardLists.filterControlledBy(libCards, sa.getActivatingPlayer());
if (!libCardsYouOwn.isEmpty()) { // Only searching one's own library would fire Archive Trap's altcost
sa.getActivatingPlayer().incLibrarySearched();
@@ -88,7 +98,7 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
game.getTriggerHandler().runTrigger(TriggerType.SearchedLibrary, runParams, false);
}
if (origin.contains(ZoneType.Hand) && sa.hasParam("Search")) {
CardCollection handCards = CardLists.filterControlledBy(CardLists.getValidCards(cards, "Card.inZoneHand", sa.getActivatingPlayer(), source),
CardCollection handCards = CardLists.filterControlledBy(CardLists.getValidCards(cards, "Card.inZoneHand", sa.getActivatingPlayer(), source, sa),
sa.getActivatingPlayer().getOpponents());
if (!handCards.isEmpty()) {
sa.getActivatingPlayer().getController().reveal(handCards, ZoneType.Hand, handCards.get(0).getOwner());
@@ -260,6 +270,10 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
triggerList.triggerChangesZoneAll(game);
if (sa.hasParam("UntilHostLeavesPlay")) {
source.addLeavesPlayCommand(untilHostLeavesPlayCommand(triggerList, source));
}
// if Shuffle parameter exists, and any amount of cards were owned by
// that player, then shuffle that library
if (sa.hasParam("Shuffle")) {
@@ -270,5 +284,4 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
}
}
}
}

View File

@@ -1,5 +1,11 @@
package forge.game.ability.effects;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
@@ -15,7 +21,15 @@ import forge.game.GameLogEntryType;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.*;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CardUtil;
import forge.game.card.CardView;
import forge.game.card.CardZoneTable;
import forge.game.card.CounterType;
import forge.game.event.GameEventCombatChanged;
import forge.game.player.DelayedReveal;
import forge.game.player.Player;
@@ -31,17 +45,12 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.CardTranslation;
import forge.util.Lang;
import forge.util.Localizer;
import forge.util.MessageUtil;
import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
import forge.util.Localizer;
import forge.util.CardTranslation;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class ChangeZoneEffect extends SpellAbilityEffect {
@@ -409,6 +418,11 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
//if host is not on the battlefield don't apply
if (sa.hasParam("UntilHostLeavesPlay") && !sa.getHostCard().isInPlay()) {
return;
}
if (isHidden(sa) && !sa.hasParam("Ninjutsu")) {
changeHiddenOriginResolve(sa);
} else {
@@ -578,7 +592,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
if (sa.hasParam("AttachedTo")) {
CardCollection list = AbilityUtils.getDefinedCards(hostCard, sa.getParam("AttachedTo"), sa);
if (list.isEmpty()) {
list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), sa.getParam("AttachedTo"), gameCard.getController(), gameCard);
list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), sa.getParam("AttachedTo"), gameCard.getController(), gameCard, sa);
}
if (!list.isEmpty()) {
Map<String, Object> params = Maps.newHashMap();
@@ -711,7 +725,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
movedCard.addCounter(cType, cAmount, player, true, counterTable);
}
if (sa.hasParam("ExileFaceDown")) {
if (sa.hasParam("ExileFaceDown") || sa.hasParam("FaceDown")) {
movedCard.turnFaceDown(true);
}
if (sa.hasParam("Foretold")) {
@@ -744,7 +758,6 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
}
}
if (remember != null) {
hostCard.addRemembered(movedCard);
// addRememberedFromCardState ?
@@ -797,9 +810,13 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
triggerList.triggerChangesZoneAll(game);
counterTable.triggerCountersPutAll(game);
if (sa.hasParam("AtEOT") && !triggerList.isEmpty()) {
registerDelayedTrigger(sa, sa.getParam("AtEOT"), triggerList.allCards());
}
if (sa.hasParam("UntilHostLeavesPlay")) {
hostCard.addLeavesPlayCommand(untilHostLeavesPlayCommand(triggerList, hostCard));
}
// for things like Gaea's Blessing
if (destination.equals(ZoneType.Library) && sa.hasParam("Shuffle") && "True".equals(sa.getParam("Shuffle"))) {
@@ -1096,7 +1113,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
}
if (totalcmc != null) {
if (totcmc >= 0) {
fetchList = CardLists.getValidCards(fetchList, "Card.cmcLE" + totcmc, source.getController(), source);
fetchList = CardLists.getValidCards(fetchList, "Card.cmcLE" + totcmc, source.getController(), source, sa);
}
}
@@ -1205,7 +1222,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
if (sa.hasParam("AttachedTo")) {
CardCollection list = AbilityUtils.getDefinedCards(source, sa.getParam("AttachedTo"), sa);
if (list.isEmpty()) {
list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), sa.getParam("AttachedTo"), c.getController(), c);
list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), sa.getParam("AttachedTo"), c.getController(), c, sa);
}
if (!list.isEmpty()) {
Card attachedTo = null;
@@ -1388,6 +1405,10 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
}
triggerList.triggerChangesZoneAll(game);
if (sa.hasParam("UntilHostLeavesPlay")) {
source.addLeavesPlayCommand(untilHostLeavesPlayCommand(triggerList, source));
}
// remove Controlled While Searching
if (controlTimestamp != null) {
player.removeController(controlTimestamp);

View File

@@ -1,5 +1,9 @@
package forge.game.ability.effects;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.google.common.collect.Lists;
import forge.game.ability.AbilityUtils;
@@ -12,10 +16,6 @@ import forge.util.Aggregates;
import forge.util.Lang;
import forge.util.collect.FCollection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class CharmEffect extends SpellAbilityEffect {
public static List<AbilitySub> makePossibleOptions(final SpellAbility sa) {

View File

@@ -1,5 +1,9 @@
package forge.game.ability.effects;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import forge.card.CardType;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
@@ -19,10 +23,6 @@ import forge.util.Aggregates;
import forge.util.Lang;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
public class ChooseCardEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {

View File

@@ -1,5 +1,11 @@
package forge.game.ability.effects;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
@@ -24,12 +30,6 @@ import forge.util.Aggregates;
import forge.util.ComparableOp;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class ChooseCardNameEffect extends SpellAbilityEffect {
@Override
@@ -99,7 +99,7 @@ public class ChooseCardNameEffect extends SpellAbilityEffect {
}
} else if (chooseFromDefined) {
CardCollection choices = AbilityUtils.getDefinedCards(host, sa.getParam("ChooseFromDefinedCards"), sa);
choices = CardLists.getValidCards(choices, valid, host.getController(), host);
choices = CardLists.getValidCards(choices, valid, host.getController(), host, sa);
List<ICardFace> faces = Lists.newArrayList();
// get Card
for (final Card c : choices) {

View File

@@ -1,5 +1,9 @@
package forge.game.ability.effects;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import forge.card.MagicColor;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -9,10 +13,6 @@ import forge.game.spellability.TargetRestrictions;
import forge.util.Lang;
import forge.util.Localizer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ChooseColorEffect extends SpellAbilityEffect {
@Override

View File

@@ -9,8 +9,8 @@ import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.player.PlayerController.BinaryChoiceType;
import forge.game.spellability.SpellAbility;
import forge.util.collect.FCollection;
import forge.util.Localizer;
import forge.util.collect.FCollection;
public class ChooseDirectionEffect extends SpellAbilityEffect {
@Override

View File

@@ -1,7 +1,10 @@
package forge.game.ability.effects;
import java.util.List;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -10,8 +13,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Aggregates;
import java.util.List;
public class ChooseGenericEffect extends SpellAbilityEffect {
@Override

View File

@@ -1,7 +1,12 @@
package forge.game.ability.effects;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -9,12 +14,8 @@ import forge.game.player.Player;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.MyRandom;
import forge.util.Localizer;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import forge.util.MyRandom;
public class ChooseNumberEffect extends SpellAbilityEffect {

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.List;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -8,10 +10,8 @@ import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.Aggregates;
import forge.util.collect.FCollectionView;
import forge.util.Localizer;
import java.util.List;
import forge.util.collect.FCollectionView;
public class ChoosePlayerEffect extends SpellAbilityEffect {

View File

@@ -1,5 +1,9 @@
package forge.game.ability.effects;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import forge.game.Game;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -10,14 +14,9 @@ import forge.game.card.CardLists;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
public class ChooseSourceEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {
@@ -36,7 +35,6 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
final Card host = sa.getHostCard();
final Game game = sa.getActivatingPlayer().getGame();
final TargetRestrictions tgt = sa.getTargetRestrictions();
final List<Player> tgtPlayers = getTargetPlayers(sa);
CardCollection stackSources = new CardCollection();
@@ -85,11 +83,11 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
}
if (sa.hasParam("Choices")) {
permanentSources = CardLists.getValidCards(permanentSources, sa.getParam("Choices"), host.getController(), host);
permanentSources = CardLists.getValidCards(permanentSources, sa.getParam("Choices"), host.getController(), host, sa);
stackSources = CardLists.getValidCards(stackSources, sa.getParam("Choices"), host.getController(), host);
referencedSources = CardLists.getValidCards(referencedSources, sa.getParam("Choices"), host.getController(), host);
commandZoneSources = CardLists.getValidCards(commandZoneSources, sa.getParam("Choices"), host.getController(), host);
stackSources = CardLists.getValidCards(stackSources, sa.getParam("Choices"), host.getController(), host, sa);
referencedSources = CardLists.getValidCards(referencedSources, sa.getParam("Choices"), host.getController(), host, sa);
commandZoneSources = CardLists.getValidCards(commandZoneSources, sa.getParam("Choices"), host.getController(), host, sa);
}
if (sa.hasParam("TargetControls")) {
permanentSources = CardLists.filterControlledBy(permanentSources, tgtPlayers.get(0));
@@ -133,7 +131,7 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
for (final Player p : tgtPlayers) {
final CardCollection chosen = new CardCollection();
if (tgt == null || p.canBeTargetedBy(sa)) {
if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) {
for (int i = 0; i < validAmount; i++) {
final String choiceTitle = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseSource") + " ";
Card o = null;

View File

@@ -1,15 +1,16 @@
package forge.game.ability.effects;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import forge.card.CardType;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ChooseTypeEffect extends SpellAbilityEffect {

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.Map;
import forge.game.GameAction;
import forge.game.GameLogEntryType;
import forge.game.ability.AbilityKey;
@@ -14,8 +16,6 @@ import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import java.util.Map;
public class ClashEffect extends SpellAbilityEffect {
/* (non-Javadoc)

View File

@@ -1,22 +1,25 @@
package forge.game.ability.effects;
import forge.GameCommand;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.*;
import forge.game.event.GameEventCardStatsChanged;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import forge.util.CardTranslation;
import java.util.Arrays;
import java.util.List;
import com.google.common.collect.Lists;
import forge.GameCommand;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardFactory;
import forge.game.card.CardLists;
import forge.game.event.GameEventCardStatsChanged;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.CardTranslation;
import forge.util.Localizer;
public class CloneEffect extends SpellAbilityEffect {
// TODO update this method
@@ -81,7 +84,7 @@ public class CloneEffect extends SpellAbilityEffect {
}
}
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host);
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host, sa);
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") + " ";
cardToCopy = activator.getController().chooseSingleEntityForEffect(choices, sa, title, false, null);

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.List;
import com.google.common.collect.Lists;
import forge.game.Game;
@@ -11,8 +13,6 @@ import forge.game.spellability.SpellAbility;
import forge.util.CardTranslation;
import forge.util.Localizer;
import java.util.List;
public class ControlExchangeEffect extends SpellAbilityEffect {

View File

@@ -1,5 +1,9 @@
package forge.game.ability.effects;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -9,10 +13,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
public class ControlExchangeVariantEffect extends SpellAbilityEffect {
@Override

View File

@@ -44,7 +44,7 @@ public class ControlGainVariantEffect extends SpellAbilityEffect {
}
CardCollection tgtCards = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield),
sa.getParam("AllValid"), source.getController(), source);
sa.getParam("AllValid"), source.getController(), source, sa);
if ("NextPlayerInChosenDirection".equals(controller) && (source.getChosenDirection() != null) ) {// Aminatou, the Fateshifter
for (final Player p : players) {

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.List;
import forge.GameCommand;
import forge.game.Game;
import forge.game.ability.SpellAbilityEffect;
@@ -8,8 +10,6 @@ import forge.game.spellability.SpellAbility;
import forge.util.Lang;
import forge.util.TextUtil;
import java.util.List;
/**
* TODO: Write javadoc for this type.
*

View File

@@ -1,6 +1,9 @@
package forge.game.ability.effects;
import java.util.List;
import com.google.common.collect.Iterables;
import forge.game.Game;
import forge.game.GameObject;
import forge.game.ability.SpellAbilityEffect;
@@ -10,8 +13,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.zone.ZoneType;
import java.util.List;
public class ControlSpellEffect extends SpellAbilityEffect {
/* (non-Javadoc)
* @see forge.card.abilityfactory.SpellEffect#getStackDescription(java.util.Map, forge.card.spellability.SpellAbility)

View File

@@ -1,5 +1,10 @@
package forge.game.ability.effects;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.mutable.MutableBoolean;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
@@ -22,15 +27,10 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.item.PaperCard;
import forge.util.Aggregates;
import forge.util.Localizer;
import forge.util.PredicateString.StringOp;
import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
import forge.util.PredicateString.StringOp;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.mutable.MutableBoolean;
import java.util.List;
public class CopyPermanentEffect extends TokenEffectBase {
@@ -136,7 +136,7 @@ public class CopyPermanentEffect extends TokenEffectBase {
// For Mimic Vat with mutated creature, need to choose one imprinted card
CardCollectionView choices = sa.hasParam("Defined") ? getDefinedCardsOrTargeted(sa) : game.getCardsIn(ZoneType.Battlefield);
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host);
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host, sa);
if (!choices.isEmpty()) {
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard");

View File

@@ -1,5 +1,9 @@
package forge.game.ability.effects;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
@@ -17,12 +21,8 @@ import forge.game.player.Player;
import forge.game.replacement.ReplacementType;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.util.Localizer;
import forge.util.CardTranslation;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import forge.util.Localizer;
public class CopySpellAbilityEffect extends SpellAbilityEffect {

View File

@@ -1,5 +1,11 @@
package forge.game.ability.effects;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import forge.game.Game;
import forge.game.GameLogEntryType;
import forge.game.ability.AbilityKey;
@@ -14,12 +20,6 @@ import forge.game.spellability.SpellPermanent;
import forge.game.trigger.TriggerType;
import forge.util.Localizer;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
public class CounterEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {

View File

@@ -1,5 +1,11 @@
package forge.game.ability.effects;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.game.Game;
import forge.game.GameEntityCounterTable;
import forge.game.ability.AbilityUtils;
@@ -13,14 +19,8 @@ import forge.game.player.Player;
import forge.game.player.PlayerController;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import forge.util.CardTranslation;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.util.Localizer;
import forge.util.TextUtil;
public class CountersMoveEffect extends SpellAbilityEffect {

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.List;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameEntityCounterTable;
@@ -13,10 +15,8 @@ import forge.game.player.PlayerController;
import forge.game.player.PlayerPredicates;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.collect.FCollection;
import forge.util.Localizer;
import java.util.List;
import forge.util.collect.FCollection;
public class CountersProliferateEffect extends SpellAbilityEffect {
@Override

View File

@@ -51,7 +51,7 @@ public class CountersPutAllEffect extends SpellAbilityEffect {
}
CardCollectionView cards = game.getCardsIn(zone);
cards = CardLists.getValidCards(cards, valid, host.getController(), sa.getHostCard());
cards = CardLists.getValidCards(cards, valid, host.getController(), sa.getHostCard(), sa);
if (sa.usesTargeting()) {
final Player pl = sa.getTargets().getFirstTargetedPlayer();

View File

@@ -1,5 +1,11 @@
package forge.game.ability.effects;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -18,10 +24,10 @@ import forge.game.card.CardCollection;
import forge.game.card.CardFactoryUtil;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CardPredicates.Presets;
import forge.game.card.CardUtil;
import forge.game.card.CounterEnumType;
import forge.game.card.CounterType;
import forge.game.card.CardPredicates.Presets;
import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
import forge.game.player.PlayerController;
@@ -32,14 +38,8 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.Localizer;
import forge.util.CardTranslation;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import forge.util.Localizer;
public class CountersPutEffect extends SpellAbilityEffect {
@Override

View File

@@ -1,5 +1,11 @@
package forge.game.ability.effects;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.game.Game;
import forge.game.GameEntityCounterTable;
import forge.game.ability.AbilityUtils;
@@ -15,12 +21,6 @@ import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.Localizer;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import java.util.List;
import java.util.Map;
/**
* API for adding to or subtracting from existing counters on a target.
*

View File

@@ -1,5 +1,9 @@
package forge.game.ability.effects;
import java.util.Map;
import com.google.common.collect.Lists;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
@@ -11,10 +15,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import java.util.Map;
import com.google.common.collect.Lists;
public class CountersRemoveAllEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {
@@ -52,7 +52,7 @@ public class CountersRemoveAllEffect extends SpellAbilityEffect {
final Game game = sa.getActivatingPlayer().getGame();
CardCollectionView cards = game.getCardsIn(zone);
cards = CardLists.getValidCards(cards, valid, sa.getHostCard().getController(), sa.getHostCard());
cards = CardLists.getValidCards(cards, valid, sa.getHostCard().getController(), sa.getHostCard(), sa);
if (sa.usesTargeting()) {
final Player pl = sa.getTargets().getFirstTargetedPlayer();

View File

@@ -1,5 +1,13 @@
package forge.game.ability.effects;
import java.util.Map;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.ability.AbilityUtils;
@@ -15,14 +23,6 @@ import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import java.util.Map;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
public class CountersRemoveEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.List;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameEntityCounterTable;
@@ -13,8 +15,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import java.util.List;
public class DamageAllEffect extends DamageBaseEffect {
/* (non-Javadoc)
* @see forge.game.ability.SpellAbilityEffect#getStackDescription(forge.game.spellability.SpellAbility)

View File

@@ -1,5 +1,9 @@
package forge.game.ability.effects;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
@@ -21,10 +25,6 @@ import forge.game.spellability.SpellAbility;
import forge.util.Lang;
import forge.util.Localizer;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class DamageDealEffect extends DamageBaseEffect {
/* (non-Javadoc)

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.List;
import forge.game.Game;
import forge.game.GameEntityCounterTable;
import forge.game.GameObject;
@@ -13,8 +15,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.collect.FCollectionView;
import java.util.List;
public class DamageEachEffect extends DamageBaseEffect {
/* (non-Javadoc)
@@ -66,7 +66,7 @@ public class DamageEachEffect extends DamageBaseEffect {
FCollectionView<Card> sources = game.getCardsIn(ZoneType.Battlefield);
if (sa.hasParam("ValidCards")) {
sources = CardLists.getValidCards(sources, sa.getParam("ValidCards"), card.getController(), card);
sources = CardLists.getValidCards(sources, sa.getParam("ValidCards"), card.getController(), card, sa);
}
final List<GameObject> tgts = getTargets(sa, "DefinedPlayers");

View File

@@ -1,13 +1,5 @@
package forge.game.ability.effects;
import forge.GameCommand;
import forge.card.MagicColor;
import forge.game.Game;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.keyword.KeywordInterface;
import forge.game.spellability.SpellAbility;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
@@ -16,6 +8,14 @@ import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.Lists;
import forge.GameCommand;
import forge.card.MagicColor;
import forge.game.Game;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.keyword.KeywordInterface;
import forge.game.spellability.SpellAbility;
public class DebuffEffect extends SpellAbilityEffect {
@Override

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.List;
import forge.GameCommand;
import forge.game.ability.SpellAbilityEffect;
import forge.game.phase.PhaseHandler;
@@ -8,8 +10,6 @@ import forge.game.spellability.SpellAbility;
import forge.util.Lang;
import forge.util.TextUtil;
import java.util.List;
public class DeclareCombatantsEffect extends SpellAbilityEffect {
@Override

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.Map;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
@@ -15,8 +17,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
import java.util.Map;
public class DelayedTriggerEffect extends SpellAbilityEffect {
/* (non-Javadoc)

View File

@@ -1,5 +1,11 @@
package forge.game.ability.effects;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Maps;
import forge.game.Game;
import forge.game.GameActionUtil;
import forge.game.ability.SpellAbilityEffect;
@@ -10,12 +16,6 @@ import forge.game.card.CardZoneTable;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Maps;
public class DestroyEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {

View File

@@ -1,5 +1,9 @@
package forge.game.ability.effects;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import forge.card.MagicColor;
import forge.game.Game;
import forge.game.GameActionUtil;
@@ -21,13 +25,11 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
import forge.util.CardTranslation;
import forge.util.Lang;
import forge.util.Localizer;
import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
import forge.util.Localizer;
import forge.util.CardTranslation;
import java.util.*;
public class DigEffect extends SpellAbilityEffect {
@@ -135,7 +137,7 @@ public class DigEffect extends SpellAbilityEffect {
}
else if (sa.hasParam("RevealValid")) {
final String revealValid = sa.getParam("RevealValid");
final CardCollection toReveal = CardLists.getValidCards(top, revealValid, host.getController(), host);
final CardCollection toReveal = CardLists.getValidCards(top, revealValid, host.getController(), host, sa);
if (!toReveal.isEmpty()) {
game.getAction().reveal(toReveal, host.getController());
if (sa.hasParam("RememberRevealed")) {

View File

@@ -1,5 +1,8 @@
package forge.game.ability.effects;
import java.util.Collections;
import java.util.Iterator;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
@@ -11,10 +14,8 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
import forge.util.Localizer;
import java.util.*;
import forge.util.MyRandom;
public class DigUntilEffect extends SpellAbilityEffect {

View File

@@ -1,29 +1,32 @@
package forge.game.ability.effects;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.game.Game;
import forge.game.GameActionUtil;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.*;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates.Presets;
import forge.game.card.CardZoneTable;
import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
import forge.game.player.PlayerPredicates;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.Aggregates;
import forge.util.TextUtil;
import forge.util.Lang;
import forge.util.Localizer;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.Map;
import forge.util.TextUtil;
public class DiscardEffect extends SpellAbilityEffect {
@@ -179,7 +182,7 @@ public class DiscardEffect extends SpellAbilityEffect {
if (!p.canDiscardBy(sa)) {
continue;
}
CardCollectionView dPHand = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), "Card.IsNotRemembered", p, source);
CardCollectionView dPHand = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), "Card.IsNotRemembered", p, source, sa);
if (dPHand.size() > 1) {
dPHand = GameActionUtil.orderCardsByTheirOwners(game, dPHand, ZoneType.Graveyard, sa);
}
@@ -207,7 +210,7 @@ public class DiscardEffect extends SpellAbilityEffect {
if (runDiscard) {
final String valid = sa.hasParam("DiscardValid") ? sa.getParam("DiscardValid") : "Card";
List<Card> list = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), valid, source.getController(), source);
List<Card> list = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), valid, source.getController(), source, sa);
list = CardLists.filter(list, Presets.NON_TOKEN);
CardCollection toDiscard = new CardCollection();
for (int i = 0; i < numCards; i++) {

View File

@@ -1,16 +1,16 @@
package forge.game.ability.effects;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.mana.Mana;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class DrainManaEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.List;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -10,8 +12,6 @@ import forge.game.spellability.TargetRestrictions;
import forge.util.Lang;
import forge.util.Localizer;
import java.util.List;
public class DrawEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {

View File

@@ -1,5 +1,12 @@
package forge.game.ability.effects;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.GameCommand;
import forge.ImageKeys;
import forge.game.Game;
@@ -21,13 +28,6 @@ import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.util.TextUtil;
import forge.util.collect.FCollection;

View File

@@ -8,8 +8,8 @@ import forge.game.card.CardCollectionView;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import forge.util.CardTranslation;
import forge.util.Localizer;
public class EncodeEffect extends SpellAbilityEffect {
@Override

View File

@@ -1,6 +1,8 @@
package forge.game.ability.effects;
import java.util.List;
import com.google.common.collect.Lists;
import forge.game.Game;
@@ -10,8 +12,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Localizer;
import java.util.List;
public class EndTurnEffect extends SpellAbilityEffect {
// *************************************************************************

View File

@@ -1,6 +1,9 @@
package forge.game.ability.effects;
import java.util.List;
import com.google.common.collect.Lists;
import forge.game.Game;
import forge.game.GameEntityCounterTable;
import forge.game.ability.AbilityKey;
@@ -17,8 +20,6 @@ import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.Localizer;
import java.util.List;
public class ExploreEffect extends SpellAbilityEffect {
/* (non-Javadoc)

View File

@@ -1,5 +1,8 @@
package forge.game.ability.effects;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import forge.game.Game;
@@ -12,11 +15,8 @@ import forge.game.player.Player;
import forge.game.replacement.ReplacementType;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.util.Localizer;
import forge.util.CardTranslation;
import java.util.List;
import java.util.Map;
import forge.util.Localizer;
public class FightEffect extends DamageBaseEffect {

View File

@@ -1,5 +1,10 @@
package forge.game.ability.effects;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import forge.game.GameObject;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
@@ -11,13 +16,8 @@ import forge.game.player.PlayerController;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.util.MyRandom;
import forge.util.Localizer;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import forge.util.MyRandom;
public class FlipCoinEffect extends SpellAbilityEffect {

View File

@@ -1,13 +1,13 @@
package forge.game.ability.effects;
import java.util.List;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.player.GameLossReason;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import java.util.List;
public class GameLossEffect extends SpellAbilityEffect {
/* (non-Javadoc)

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.Map;
import com.google.common.collect.Maps;
import forge.game.Game;
@@ -13,8 +15,6 @@ import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
import forge.game.trigger.TriggerType;
import java.util.Map;
public class ImmediateTriggerEffect extends SpellAbilityEffect {
/* (non-Javadoc)

View File

@@ -1,12 +1,12 @@
package forge.game.ability.effects;
import java.util.List;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import java.util.List;
public class LifeExchangeEffect extends SpellAbilityEffect {
// *************************************************************************

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.List;
import forge.game.Game;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -8,8 +10,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import java.util.List;
public class LifeExchangeVariantEffect extends SpellAbilityEffect {
// *************************************************************************

View File

@@ -1,14 +1,14 @@
package forge.game.ability.effects;
import java.util.List;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Lang;
import java.util.List;
public class LifeGainEffect extends SpellAbilityEffect {
/* (non-Javadoc)

View File

@@ -1,5 +1,8 @@
package forge.game.ability.effects;
import java.util.ArrayList;
import java.util.List;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.player.Player;
@@ -7,9 +10,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.Localizer;
import java.util.ArrayList;
import java.util.List;
public class LifeSetEffect extends SpellAbilityEffect {
/* (non-Javadoc)

View File

@@ -1,5 +1,11 @@
package forge.game.ability.effects;
import static forge.util.TextUtil.toManaString;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import forge.card.ColorSet;
import forge.card.MagicColor;
import forge.card.mana.ManaAtom;
@@ -18,12 +24,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import static forge.util.TextUtil.toManaString;
public class ManaEffect extends SpellAbilityEffect {
@Override

View File

@@ -1,5 +1,9 @@
package forge.game.ability.effects;
import java.util.Collection;
import org.apache.commons.lang3.StringUtils;
import forge.card.ColorSet;
import forge.card.MagicColor;
import forge.game.ability.AbilityUtils;
@@ -10,10 +14,6 @@ import forge.game.spellability.AbilityManaPart;
import forge.game.spellability.SpellAbility;
import forge.util.Localizer;
import java.util.Collection;
import org.apache.commons.lang3.StringUtils;
public class ManaReflectedEffect extends SpellAbilityEffect {
/* (non-Javadoc)

View File

@@ -33,7 +33,7 @@ public class ManifestEffect extends SpellAbilityEffect {
}
CardCollection choices = new CardCollection(game.getCardsIn(choiceZone));
if (sa.hasParam("Choices")) {
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, source);
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, source, sa);
}
if (choices.isEmpty()) {
continue;

View File

@@ -10,10 +10,9 @@ import forge.game.card.CardZoneTable;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.TextUtil;
import forge.util.Localizer;
import forge.util.TextUtil;
public class MillEffect extends SpellAbilityEffect {
@Override

View File

@@ -1,8 +1,13 @@
package forge.game.ability.effects;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -17,10 +22,6 @@ import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.Localizer;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class MultiplePilesEffect extends SpellAbilityEffect {
/* (non-Javadoc)
@@ -80,7 +81,7 @@ public class MultiplePilesEffect extends SpellAbilityEffect {
} else {
pool = new CardCollection(p.getCardsIn(zone));
}
pool = CardLists.getValidCards(pool, valid, source.getController(), source);
pool = CardLists.getValidCards(pool, valid, source.getController(), source, sa);
List<CardCollectionView> pileList = Lists.newArrayList();

View File

@@ -1,5 +1,7 @@
package forge.game.ability.effects;
import java.util.List;
import forge.game.GameEntity;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
@@ -10,8 +12,6 @@ import forge.game.player.PlayerCollection;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import java.util.List;
public class MustAttackEffect extends SpellAbilityEffect {
/* (non-Javadoc)

View File

@@ -1,5 +1,11 @@
package forge.game.ability.effects;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
@@ -11,12 +17,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
public class MustBlockEffect extends SpellAbilityEffect {
@Override
@@ -41,7 +41,7 @@ public class MustBlockEffect extends SpellAbilityEffect {
}
CardCollectionView choices = game.getCardsIn(ZoneType.Battlefield);
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host);
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host, sa);
if (!choices.isEmpty()) {
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") +" ";
Map<String, Object> params = Maps.newHashMap();

Some files were not shown because too many files have changed in this diff Show More