mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 19:58:00 +00:00
Merge remote-tracking branch 'remotes/Forge/master' into ui-card-translation
This commit is contained in:
@@ -290,7 +290,6 @@ public class GameCopier {
|
|||||||
// TODO: Is this correct? Does it not duplicate keywords from enchantments and such?
|
// TODO: Is this correct? Does it not duplicate keywords from enchantments and such?
|
||||||
for (KeywordInterface kw : c.getHiddenExtrinsicKeywords())
|
for (KeywordInterface kw : c.getHiddenExtrinsicKeywords())
|
||||||
newCard.addHiddenExtrinsicKeyword(kw);
|
newCard.addHiddenExtrinsicKeyword(kw);
|
||||||
newCard.setExtrinsicKeyword(Lists.newArrayList(c.getExtrinsicKeyword()));
|
|
||||||
if (c.isTapped()) {
|
if (c.isTapped()) {
|
||||||
newCard.setTapped(true);
|
newCard.setTapped(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -204,7 +204,8 @@ public final class AbilityFactory {
|
|||||||
else if (api == ApiType.PermanentCreature || api == ApiType.PermanentNoncreature) {
|
else if (api == ApiType.PermanentCreature || api == ApiType.PermanentNoncreature) {
|
||||||
// If API is a permanent type, and creating AF Spell
|
// If API is a permanent type, and creating AF Spell
|
||||||
// Clear out the auto created SpellPemanent spell
|
// Clear out the auto created SpellPemanent spell
|
||||||
if (type == AbilityRecordType.Spell && !mapParams.containsKey("SubAbility")) {
|
if (type == AbilityRecordType.Spell
|
||||||
|
&& !mapParams.containsKey("SubAbility") && !mapParams.containsKey("NonBasicSpell")) {
|
||||||
hostCard.clearFirstSpell();
|
hostCard.clearFirstSpell();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -389,6 +390,10 @@ public final class AbilityFactory {
|
|||||||
sa.setBasicSpell(false);
|
sa.setBasicSpell(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mapParams.containsKey("Dash")) {
|
||||||
|
sa.setDash(true);
|
||||||
|
}
|
||||||
|
|
||||||
if (mapParams.containsKey("Outlast")) {
|
if (mapParams.containsKey("Outlast")) {
|
||||||
sa.setOutlast(true);
|
sa.setOutlast(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -238,7 +238,7 @@ public abstract class SpellAbilityEffect {
|
|||||||
}
|
}
|
||||||
sb.append(Lang.joinHomogenous(crds));
|
sb.append(Lang.joinHomogenous(crds));
|
||||||
if (location.equals("Hand")) {
|
if (location.equals("Hand")) {
|
||||||
sb.append("to your hand").append(" ");
|
sb.append(" to your hand");
|
||||||
}
|
}
|
||||||
sb.append(" at the ");
|
sb.append(" at the ");
|
||||||
if (combat) {
|
if (combat) {
|
||||||
|
|||||||
@@ -134,6 +134,9 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
|
|||||||
&& !sa.hasParam("Shuffle") && cards.size() >= 2 && !random) {
|
&& !sa.hasParam("Shuffle") && cards.size() >= 2 && !random) {
|
||||||
Player p = AbilityUtils.getDefinedPlayers(source, sa.getParamOrDefault("DefinedPlayer", "You"), sa).get(0);
|
Player p = AbilityUtils.getDefinedPlayers(source, sa.getParamOrDefault("DefinedPlayer", "You"), sa).get(0);
|
||||||
cards = (CardCollection) p.getController().orderMoveToZoneList(cards, destination);
|
cards = (CardCollection) p.getController().orderMoveToZoneList(cards, destination);
|
||||||
|
//the last card in this list will be the closest to the top, but we want the first card to be closest.
|
||||||
|
//so reverse it here before moving them to the library.
|
||||||
|
java.util.Collections.reverse(cards);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (destination == ZoneType.Graveyard) {
|
if (destination == ZoneType.Graveyard) {
|
||||||
|
|||||||
@@ -537,10 +537,10 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
|
|||||||
tgtC.getController().getZone(destination), tgtC, sa, null);
|
tgtC.getController().getZone(destination), tgtC, sa, null);
|
||||||
if (sa.hasParam("Unearth")) {
|
if (sa.hasParam("Unearth")) {
|
||||||
movedCard.setUnearthed(true);
|
movedCard.setUnearthed(true);
|
||||||
movedCard.addExtrinsicKeyword("Haste");
|
movedCard.addChangedCardKeywords(Lists.newArrayList("Haste"), null, false, false,
|
||||||
|
game.getNextTimestamp(), true);
|
||||||
registerDelayedTrigger(sa, "Exile", Lists.newArrayList(movedCard));
|
registerDelayedTrigger(sa, "Exile", Lists.newArrayList(movedCard));
|
||||||
addLeaveBattlefieldReplacement(movedCard, sa, "Exile");
|
addLeaveBattlefieldReplacement(movedCard, sa, "Exile");
|
||||||
movedCard.updateStateForView();
|
|
||||||
}
|
}
|
||||||
if (sa.hasParam("FaceDown")) {
|
if (sa.hasParam("FaceDown")) {
|
||||||
movedCard.turnFaceDown(true);
|
movedCard.turnFaceDown(true);
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ package forge.game.ability.effects;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import forge.GameCommand;
|
import forge.GameCommand;
|
||||||
import forge.card.mana.ManaCost;
|
import forge.card.mana.ManaCost;
|
||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
@@ -11,6 +13,7 @@ import forge.game.ability.SpellAbilityEffect;
|
|||||||
import forge.game.card.Card;
|
import forge.game.card.Card;
|
||||||
import forge.game.card.CardCollectionView;
|
import forge.game.card.CardCollectionView;
|
||||||
import forge.game.card.CardLists;
|
import forge.game.card.CardLists;
|
||||||
|
import forge.game.event.GameEventCardStatsChanged;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.spellability.Ability;
|
import forge.game.spellability.Ability;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
@@ -35,23 +38,26 @@ public class ControlGainEffect extends SpellAbilityEffect {
|
|||||||
if (tgts.isEmpty()) {
|
if (tgts.isEmpty()) {
|
||||||
sb.append(" (nothing)");
|
sb.append(" (nothing)");
|
||||||
} else {
|
} else {
|
||||||
for (final Card c : getDefinedCards(sa)) {
|
for (final Card c : tgts) {
|
||||||
sb.append(" ");
|
sb.append(" ");
|
||||||
if (c.isFaceDown()) {
|
if (c.isFaceDown()) {
|
||||||
sb.append("Face-down creature (").append(c.getId()).append(')');
|
sb.append("Face-down creature (").append(c.getId()).append(')');
|
||||||
} else {
|
} else {
|
||||||
sb.append(c);
|
sb.append(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sb.append(".");
|
sb.append(".");
|
||||||
|
|
||||||
|
if (sa.hasParam("Untap")) {
|
||||||
|
sb.append(" Untap it.");
|
||||||
|
}
|
||||||
|
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void doLoseControl(final Card c, final Card host,
|
private static void doLoseControl(final Card c, final Card host,
|
||||||
final boolean tapOnLose, final List<String> addedKeywords,
|
final boolean tapOnLose, final long tStamp) {
|
||||||
final long tStamp) {
|
|
||||||
if (null == c || c.hasKeyword("Other players can't gain control of CARDNAME.")) {
|
if (null == c || c.hasKeyword("Other players can't gain control of CARDNAME.")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -61,12 +67,6 @@ public class ControlGainEffect extends SpellAbilityEffect {
|
|||||||
if (tapOnLose) {
|
if (tapOnLose) {
|
||||||
c.tap();
|
c.tap();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null != addedKeywords) {
|
|
||||||
for (final String kw : addedKeywords) {
|
|
||||||
c.removeExtrinsicKeyword(kw);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // if
|
} // if
|
||||||
host.removeGainControlTargets(c);
|
host.removeGainControlTargets(c);
|
||||||
|
|
||||||
@@ -82,7 +82,7 @@ public class ControlGainEffect extends SpellAbilityEffect {
|
|||||||
final boolean remember = sa.hasParam("RememberControlled");
|
final boolean remember = sa.hasParam("RememberControlled");
|
||||||
final boolean forget = sa.hasParam("ForgetControlled");
|
final boolean forget = sa.hasParam("ForgetControlled");
|
||||||
final List<String> destroyOn = sa.hasParam("DestroyTgt") ? Arrays.asList(sa.getParam("DestroyTgt").split(",")) : null;
|
final List<String> destroyOn = sa.hasParam("DestroyTgt") ? Arrays.asList(sa.getParam("DestroyTgt").split(",")) : null;
|
||||||
final List<String> kws = sa.hasParam("AddKWs") ? Arrays.asList(sa.getParam("AddKWs").split(" & ")) : null;
|
final List<String> keywords = sa.hasParam("AddKWs") ? Arrays.asList(sa.getParam("AddKWs").split(" & ")) : null;
|
||||||
final List<String> lose = sa.hasParam("LoseControl") ? Arrays.asList(sa.getParam("LoseControl").split(",")) : null;
|
final List<String> lose = sa.hasParam("LoseControl") ? Arrays.asList(sa.getParam("LoseControl").split(",")) : null;
|
||||||
|
|
||||||
final List<Player> controllers = getDefinedPlayersOrTargeted(sa, "NewController");
|
final List<Player> controllers = getDefinedPlayersOrTargeted(sa, "NewController");
|
||||||
@@ -125,15 +125,22 @@ public class ControlGainEffect extends SpellAbilityEffect {
|
|||||||
tgtC.untap();
|
tgtC.untap();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null != kws) {
|
final List<String> kws = Lists.newArrayList();
|
||||||
for (final String kw : kws) {
|
if (null != keywords) {
|
||||||
tgtC.addExtrinsicKeyword(kw);
|
for (final String kw : keywords) {
|
||||||
if (kw.equals("Haste")) {
|
if (kw.startsWith("HIDDEN")) {
|
||||||
tgtC.updateStateForView(); // ensure that summoning sickness icon is removed
|
tgtC.addHiddenExtrinsicKeyword(kw);
|
||||||
|
} else {
|
||||||
|
kws.add(kw);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!kws.isEmpty()) {
|
||||||
|
tgtC.addChangedCardKeywords(kws, Lists.<String>newArrayList(), false, false, tStamp);
|
||||||
|
game.fireEvent(new GameEventCardStatsChanged(tgtC));
|
||||||
|
}
|
||||||
|
|
||||||
if (remember && !sa.getHostCard().isRemembered(tgtC)) {
|
if (remember && !sa.getHostCard().isRemembered(tgtC)) {
|
||||||
sa.getHostCard().addRemembered(tgtC);
|
sa.getHostCard().addRemembered(tgtC);
|
||||||
}
|
}
|
||||||
@@ -143,7 +150,7 @@ public class ControlGainEffect extends SpellAbilityEffect {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (lose != null) {
|
if (lose != null) {
|
||||||
final GameCommand loseControl = getLoseControlCommand(tgtC, tStamp, bTapOnLose, source, kws);
|
final GameCommand loseControl = getLoseControlCommand(tgtC, tStamp, bTapOnLose, source);
|
||||||
if (lose.contains("LeavesPlay")) {
|
if (lose.contains("LeavesPlay")) {
|
||||||
sa.getHostCard().addLeavesPlayCommand(loseControl);
|
sa.getHostCard().addLeavesPlayCommand(loseControl);
|
||||||
}
|
}
|
||||||
@@ -183,6 +190,26 @@ public class ControlGainEffect extends SpellAbilityEffect {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (keywords != null) {
|
||||||
|
// Add keywords only until end of turn
|
||||||
|
final GameCommand untilKeywordEOT = new GameCommand() {
|
||||||
|
private static final long serialVersionUID = -42244224L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (keywords.size() > 0) {
|
||||||
|
for (String kw : keywords) {
|
||||||
|
if (kw.startsWith("HIDDEN")) {
|
||||||
|
tgtC.removeHiddenExtrinsicKeyword(kw);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tgtC.removeChangedCardKeywords(tStamp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
game.getEndOfTurn().addUntil(untilKeywordEOT);
|
||||||
|
}
|
||||||
|
|
||||||
game.getAction().controllerChangeZoneCorrection(tgtC);
|
game.getAction().controllerChangeZoneCorrection(tgtC);
|
||||||
} // end foreach target
|
} // end foreach target
|
||||||
}
|
}
|
||||||
@@ -236,14 +263,13 @@ public class ControlGainEffect extends SpellAbilityEffect {
|
|||||||
* @return a {@link forge.GameCommand} object.
|
* @return a {@link forge.GameCommand} object.
|
||||||
*/
|
*/
|
||||||
private static GameCommand getLoseControlCommand(final Card c,
|
private static GameCommand getLoseControlCommand(final Card c,
|
||||||
final long tStamp, final boolean bTapOnLose, final Card hostCard,
|
final long tStamp, final boolean bTapOnLose, final Card hostCard) {
|
||||||
final List<String> kws) {
|
|
||||||
final GameCommand loseControl = new GameCommand() {
|
final GameCommand loseControl = new GameCommand() {
|
||||||
private static final long serialVersionUID = 878543373519872418L;
|
private static final long serialVersionUID = 878543373519872418L;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
doLoseControl(c, hostCard, bTapOnLose, kws, tStamp);
|
doLoseControl(c, hostCard, bTapOnLose, tStamp);
|
||||||
c.getSVars().remove("SacMe");
|
c.getSVars().remove("SacMe");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -83,10 +83,6 @@ public class DigEffect extends SpellAbilityEffect {
|
|||||||
|
|
||||||
boolean changeAll = false;
|
boolean changeAll = false;
|
||||||
boolean allButOne = false;
|
boolean allButOne = false;
|
||||||
final List<String> keywords = new ArrayList<String>();
|
|
||||||
if (sa.hasParam("Keywords")) {
|
|
||||||
keywords.addAll(Arrays.asList(sa.getParam("Keywords").split(" & ")));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sa.hasParam("ChangeNum")) {
|
if (sa.hasParam("ChangeNum")) {
|
||||||
if (sa.getParam("ChangeNum").equalsIgnoreCase("All")) {
|
if (sa.getParam("ChangeNum").equalsIgnoreCase("All")) {
|
||||||
@@ -307,9 +303,6 @@ public class DigEffect extends SpellAbilityEffect {
|
|||||||
else {
|
else {
|
||||||
c = game.getAction().moveTo(zone, c, sa);
|
c = game.getAction().moveTo(zone, c, sa);
|
||||||
if (destZone1.equals(ZoneType.Battlefield)) {
|
if (destZone1.equals(ZoneType.Battlefield)) {
|
||||||
for (final String kw : keywords) {
|
|
||||||
c.addExtrinsicKeyword(kw);
|
|
||||||
}
|
|
||||||
if (sa.hasParam("Tapped")) {
|
if (sa.hasParam("Tapped")) {
|
||||||
c.setTapped(true);
|
c.setTapped(true);
|
||||||
}
|
}
|
||||||
@@ -377,11 +370,7 @@ public class DigEffect extends SpellAbilityEffect {
|
|||||||
if (!origin.equals(c.getZone().getZoneType())) {
|
if (!origin.equals(c.getZone().getZoneType())) {
|
||||||
table.put(origin, c.getZone().getZoneType(), c);
|
table.put(origin, c.getZone().getZoneType(), c);
|
||||||
}
|
}
|
||||||
if (destZone2 == ZoneType.Battlefield && !keywords.isEmpty()) {
|
if (destZone2 == ZoneType.Exile) {
|
||||||
for (final String kw : keywords) {
|
|
||||||
c.addExtrinsicKeyword(kw);
|
|
||||||
}
|
|
||||||
} else if (destZone2 == ZoneType.Exile) {
|
|
||||||
if (sa.hasParam("ExileWithCounter")) {
|
if (sa.hasParam("ExileWithCounter")) {
|
||||||
c.addCounter(CounterType.getType(sa.getParam("ExileWithCounter")),
|
c.addCounter(CounterType.getType(sa.getParam("ExileWithCounter")),
|
||||||
1, player, true, counterTable);
|
1, player, true, counterTable);
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package forge.game.ability.effects;
|
package forge.game.ability.effects;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import forge.game.ability.SpellAbilityEffect;
|
import forge.game.ability.SpellAbilityEffect;
|
||||||
import forge.game.card.Card;
|
import forge.game.card.Card;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
@@ -25,9 +27,8 @@ public class PermanentEffect extends SpellAbilityEffect {
|
|||||||
|
|
||||||
// some extra for Dashing
|
// some extra for Dashing
|
||||||
if (sa.isDash()) {
|
if (sa.isDash()) {
|
||||||
c.addExtrinsicKeyword("Haste");
|
|
||||||
c.setSVar("EndOfTurnLeavePlay", "Dash");
|
c.setSVar("EndOfTurnLeavePlay", "Dash");
|
||||||
c.updateKeywords();
|
registerDelayedTrigger(sa, "Hand", Lists.newArrayList(c));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,7 +94,6 @@ public class Card extends GameEntity implements Comparable<Card> {
|
|||||||
|
|
||||||
private final CardDamageHistory damageHistory = new CardDamageHistory();
|
private final CardDamageHistory damageHistory = new CardDamageHistory();
|
||||||
private Map<Card, Map<CounterType, Integer>> countersAddedBy = Maps.newTreeMap();
|
private Map<Card, Map<CounterType, Integer>> countersAddedBy = Maps.newTreeMap();
|
||||||
private KeywordCollection extrinsicKeyword = new KeywordCollection();
|
|
||||||
// Hidden keywords won't be displayed on the card
|
// Hidden keywords won't be displayed on the card
|
||||||
private final KeywordCollection hiddenExtrinsicKeyword = new KeywordCollection();
|
private final KeywordCollection hiddenExtrinsicKeyword = new KeywordCollection();
|
||||||
|
|
||||||
@@ -3727,7 +3726,6 @@ public class Card extends GameEntity implements Comparable<Card> {
|
|||||||
if (!removeIntrinsic) {
|
if (!removeIntrinsic) {
|
||||||
keywords.insertAll(state.getIntrinsicKeywords());
|
keywords.insertAll(state.getIntrinsicKeywords());
|
||||||
}
|
}
|
||||||
keywords.insertAll(extrinsicKeyword.getValues());
|
|
||||||
|
|
||||||
// see if keyword changes are in effect
|
// see if keyword changes are in effect
|
||||||
for (final KeywordsChange ck : changedCardKeywords.values()) {
|
for (final KeywordsChange ck : changedCardKeywords.values()) {
|
||||||
@@ -3755,11 +3753,6 @@ public class Card extends GameEntity implements Comparable<Card> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (KeywordInterface kw : extrinsicKeyword.getValues()) {
|
|
||||||
if (!visitor.visit(kw)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
for (KeywordInterface kw : getUnhiddenKeywords(state)) {
|
for (KeywordInterface kw : getUnhiddenKeywords(state)) {
|
||||||
if (!visitor.visit(kw)) {
|
if (!visitor.visit(kw)) {
|
||||||
@@ -3927,53 +3920,6 @@ public class Card extends GameEntity implements Comparable<Card> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<KeywordInterface> getExtrinsicKeyword() {
|
|
||||||
return extrinsicKeyword.getValues();
|
|
||||||
}
|
|
||||||
public final void setExtrinsicKeyword(final List<String> a) {
|
|
||||||
extrinsicKeyword.clear();
|
|
||||||
extrinsicKeyword.addAll(a);
|
|
||||||
}
|
|
||||||
public void setExtrinsicKeyword(Collection<KeywordInterface> extrinsicKeyword2) {
|
|
||||||
extrinsicKeyword.clear();
|
|
||||||
extrinsicKeyword.insertAll(extrinsicKeyword2);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addExtrinsicKeyword(final String s) {
|
|
||||||
if (s.startsWith("HIDDEN")) {
|
|
||||||
addHiddenExtrinsicKeyword(s);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
extrinsicKeyword.add(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeExtrinsicKeyword(final String s) {
|
|
||||||
if (s.startsWith("HIDDEN")) {
|
|
||||||
removeHiddenExtrinsicKeyword(s);
|
|
||||||
}
|
|
||||||
else if (extrinsicKeyword.remove(s)) {
|
|
||||||
currentState.getView().updateKeywords(this, currentState);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeAllExtrinsicKeyword(final String s) {
|
|
||||||
final List<String> strings = Lists.newArrayList();
|
|
||||||
strings.add(s);
|
|
||||||
boolean needKeywordUpdate = false;
|
|
||||||
if (extrinsicKeyword.removeAll(strings)) {
|
|
||||||
needKeywordUpdate = true;
|
|
||||||
}
|
|
||||||
strings.add("HIDDEN " + s);
|
|
||||||
if (hiddenExtrinsicKeyword.removeAll(strings)) {
|
|
||||||
view.updateNonAbilityText(this);
|
|
||||||
needKeywordUpdate = true;
|
|
||||||
}
|
|
||||||
if (needKeywordUpdate) {
|
|
||||||
currentState.getView().updateKeywords(this, currentState);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hidden Keywords will be returned without the indicator HIDDEN
|
// Hidden Keywords will be returned without the indicator HIDDEN
|
||||||
public final List<KeywordInterface> getHiddenExtrinsicKeywords() {
|
public final List<KeywordInterface> getHiddenExtrinsicKeywords() {
|
||||||
ListKeywordVisitor visitor = new ListKeywordVisitor();
|
ListKeywordVisitor visitor = new ListKeywordVisitor();
|
||||||
|
|||||||
@@ -3850,23 +3850,11 @@ public class CardFactoryUtil {
|
|||||||
inst.addSpellAbility(sa);
|
inst.addSpellAbility(sa);
|
||||||
} else if (keyword.startsWith("Dash")) {
|
} else if (keyword.startsWith("Dash")) {
|
||||||
final String[] k = keyword.split(":");
|
final String[] k = keyword.split(":");
|
||||||
final String dashString = "SP$ PermanentCreature | Cost$ " + k[1] + " | SubAbility$"
|
final String dashString = "SP$ PermanentCreature | Cost$ " + k[1] + " | StackDescription$ CARDNAME (Dash)"
|
||||||
+ " DashDelayedTrigger";
|
+ " | Dash$ True | NonBasicSpell$ True"
|
||||||
final String dbDelayTrigger = "DB$ DelayedTrigger | Mode$ Phase | Phase$"
|
+ " | SpellDescription$ Dash " + ManaCostParser.parse(k[1]) + " (" + inst.getReminderText() + ")";
|
||||||
+ " End of Turn | Execute$ DashReturnSelf | RememberObjects$ Self"
|
|
||||||
+ " | TriggerDescription$ Return CARDNAME from the battlefield to" + " its owner's hand.";
|
|
||||||
final String dbReturn = "DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand"
|
|
||||||
+ " | Defined$ DelayTriggerRemembered";
|
|
||||||
card.setSVar("DashDelayedTrigger", dbDelayTrigger);
|
|
||||||
card.setSVar("DashReturnSelf", dbReturn);
|
|
||||||
|
|
||||||
final SpellAbility newSA = AbilityFactory.getAbility(dashString, card);
|
final SpellAbility newSA = AbilityFactory.getAbility(dashString, card);
|
||||||
String desc = "Dash " + ManaCostParser.parse(k[1]) + " (" + inst.getReminderText()
|
|
||||||
+ ")";
|
|
||||||
newSA.setStackDescription(card.getName() + " (Dash)");
|
|
||||||
newSA.setDescription(desc);
|
|
||||||
newSA.setBasicSpell(false);
|
|
||||||
newSA.setDash(true);
|
|
||||||
newSA.setIntrinsic(intrinsic);
|
newSA.setIntrinsic(intrinsic);
|
||||||
|
|
||||||
newSA.setTemporary(!intrinsic);
|
newSA.setTemporary(!intrinsic);
|
||||||
@@ -4527,6 +4515,8 @@ public class CardFactoryUtil {
|
|||||||
|
|
||||||
card.setSVar("CipherTrigger", trig);
|
card.setSVar("CipherTrigger", trig);
|
||||||
card.setSVar("PlayEncoded", ab);
|
card.setSVar("PlayEncoded", ab);
|
||||||
|
} else if (keyword.startsWith("Dash")) {
|
||||||
|
effect = "Mode$ Continuous | Affected$ Card.Self+dashed | AddKeyword$ Haste";
|
||||||
} else if (keyword.equals("Devoid")) {
|
} else if (keyword.equals("Devoid")) {
|
||||||
effect = "Mode$ Continuous | EffectZone$ All | Affected$ Card.Self" +
|
effect = "Mode$ Continuous | EffectZone$ All | Affected$ Card.Self" +
|
||||||
" | CharacteristicDefining$ True | SetColor$ Colorless | Secondary$ True" +
|
" | CharacteristicDefining$ True | SetColor$ Colorless | Secondary$ True" +
|
||||||
|
|||||||
@@ -1639,6 +1639,11 @@ public class CardProperty {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return card.getCastSA().isSurged();
|
return card.getCastSA().isSurged();
|
||||||
|
} else if (property.startsWith("dashed")) {
|
||||||
|
if (card.getCastSA() == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return card.getCastSA().isDash();
|
||||||
} else if (property.startsWith("evoked")) {
|
} else if (property.startsWith("evoked")) {
|
||||||
if (card.getCastSA() == null) {
|
if (card.getCastSA() == null) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -255,7 +255,6 @@ public final class CardUtil {
|
|||||||
newCopy.setBaseToughness(in.getCurrentToughness() + in.getTempToughnessBoost() + in.getSemiPermanentToughnessBoost());
|
newCopy.setBaseToughness(in.getCurrentToughness() + in.getTempToughnessBoost() + in.getSemiPermanentToughnessBoost());
|
||||||
|
|
||||||
newCopy.setCounters(Maps.newEnumMap(in.getCounters()));
|
newCopy.setCounters(Maps.newEnumMap(in.getCounters()));
|
||||||
newCopy.setExtrinsicKeyword(in.getExtrinsicKeyword());
|
|
||||||
|
|
||||||
newCopy.setColor(in.determineColor().getColor());
|
newCopy.setColor(in.determineColor().getColor());
|
||||||
newCopy.setReceivedDamageFromThisTurn(in.getReceivedDamageFromThisTurn());
|
newCopy.setReceivedDamageFromThisTurn(in.getReceivedDamageFromThisTurn());
|
||||||
|
|||||||
@@ -209,11 +209,10 @@ public class Untap extends Phase {
|
|||||||
|
|
||||||
// Remove temporary keywords
|
// Remove temporary keywords
|
||||||
for (final Card c : player.getCardsIn(ZoneType.Battlefield)) {
|
for (final Card c : player.getCardsIn(ZoneType.Battlefield)) {
|
||||||
c.removeAllExtrinsicKeyword("This card doesn't untap during your next untap step.");
|
c.removeHiddenExtrinsicKeyword("This card doesn't untap during your next untap step.");
|
||||||
c.removeAllExtrinsicKeyword("HIDDEN This card doesn't untap during your next untap step.");
|
|
||||||
if (c.hasKeyword("This card doesn't untap during your next two untap steps.")) {
|
if (c.hasKeyword("This card doesn't untap during your next two untap steps.")) {
|
||||||
c.removeAllExtrinsicKeyword("HIDDEN This card doesn't untap during your next two untap steps.");
|
c.removeHiddenExtrinsicKeyword("This card doesn't untap during your next two untap steps.");
|
||||||
c.addHiddenExtrinsicKeyword("HIDDEN This card doesn't untap during your next untap step.");
|
c.addHiddenExtrinsicKeyword("This card doesn't untap during your next untap step.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user