- Converting Grindstone to Script

This commit is contained in:
Sol
2013-04-06 02:25:34 +00:00
parent 0be4ad70da
commit 1ad54e4c21
6 changed files with 60 additions and 134 deletions

1
.gitattributes vendored
View File

@@ -13740,7 +13740,6 @@ src/main/java/forge/card/ability/effects/UntapAllEffect.java -text
src/main/java/forge/card/ability/effects/UntapEffect.java -text
src/main/java/forge/card/ability/package-info.java svneol=native#text/plain
src/main/java/forge/card/cardfactory/CardFactory.java svneol=native#text/plain
src/main/java/forge/card/cardfactory/CardFactoryArtifacts.java -text
src/main/java/forge/card/cardfactory/CardFactoryCreatures.java svneol=native#text/plain
src/main/java/forge/card/cardfactory/CardFactorySorceries.java svneol=native#text/plain
src/main/java/forge/card/cardfactory/CardFactoryUtil.java svneol=native#text/plain

View File

@@ -1,6 +1,13 @@
Name:Grindstone
ManaCost:1
Types:Artifact
A:AB$ Repeat | Cost$ 3 T | ValidTgts$ Player | RepeatSubAbility$ DBCleanAndGrind | MaxRepeat$ MaxRepeats | RepeatCheckSVar$ MilledSharesColor | RepeatSVarCompare$ EQ2 | SubAbility$ DBCleanup | SpellDescription$ Put the top two cards of target player's library into that player's graveyard. If both cards share a color, repeat this process. | StackDescription$ SpellDescription
SVar:DBCleanAndGrind:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBPeek
SVar:DBPeek:DB$ PeekAndReveal | Defined$ Targeted | PeekAmount$ 2 | NoPeek$ True | NoReveal$ True | RememberPeeked$ True | SubAbility$ DBGrind
SVar:DBGrind:DB$ Mill | NumCards$ 2 | Defined$ Targeted
SVar:MaxRepeats:TargetedPlayer$CardsInLibrary
SVar:MilledSharesColor:RememberedLKI$Valid Card.SharesColorWith Remembered
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:Picture:http://www.wizards.com/global/images/magic/general/grindstone.jpg
Oracle:{3}, {T}: Put the top two cards of target player's library into that player's graveyard. If both cards share a color, repeat this process.
SetInfo:TMP Rare

View File

@@ -6516,6 +6516,12 @@ public class Card extends GameEntity implements Comparable<Card> {
if (list.isEmpty() || !this.sharesColorWith(list.get(0))) {
return false;
}
} else if (restriction.equals("Remembered")) {
for (final Object obj : source.getRemembered()) {
if (!(obj instanceof Card) || !this.sharesColorWith((Card) obj)) {
return false;
}
}
} else if (restriction.equals("Imprinted")) {
for (final Card card : source.getImprinted()) {
if (!this.sharesColorWith(card)) {

View File

@@ -152,7 +152,11 @@ public final class CardUtil {
newCopy.setCounters(in.getCounters());
newCopy.setExtrinsicKeyword(in.getExtrinsicKeyword());
newCopy.setColor(in.getColor());
//newCopy.setColor(in.getColor());
// Determine the color for LKI copy, not just getColor
ArrayList<CardColor> currentColor = new ArrayList<CardColor>();
currentColor.add(in.determineColor());
newCopy.setColor(currentColor);
newCopy.setReceivedDamageFromThisTurn(in.getReceivedDamageFromThisTurn());
newCopy.getDamageHistory().setCreatureGotBlockedThisTurn(in.getDamageHistory().getCreatureGotBlockedThisTurn());
newCopy.setEnchanting(in.getEnchanting());

View File

@@ -5,6 +5,7 @@ import java.util.List;
import forge.Card;
import forge.CardLists;
import forge.CardUtil;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.AbilitySub;
@@ -39,9 +40,10 @@ public class PeekAndRevealEffect extends SpellAbilityEffect {
int numPeek = AbilityUtils.calculateAmount(sa.getSourceCard(), peekAmount, sa);
// Right now, this is only used on your own library.
Player libraryToPeek = sa.getActivatingPlayer();
List<Player> libraryPlayers = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("Defined"), sa);
Player peekingPlayer = sa.getActivatingPlayer();
for(Player libraryToPeek : libraryPlayers) {
final PlayerZone library = libraryToPeek.getZone(ZoneType.Library);
numPeek = Math.min(numPeek, library.size());
@@ -51,11 +53,13 @@ public class PeekAndRevealEffect extends SpellAbilityEffect {
}
List<Card> revealableCards = CardLists.getValidCards(peekCards, revealValid, sa.getActivatingPlayer(), sa.getSourceCard());
boolean doReveal = !revealableCards.isEmpty();
boolean doReveal = !sa.hasParam("NoReveal") && !revealableCards.isEmpty();
//peekingPlayer.showCards(peekCards)
if (peekingPlayer.isHuman()) {
if (!sa.hasParam("NoPeek")) {
GuiChoose.one(source + "Revealing cards from library", peekCards);
}
if (doReveal && revealOptional) {
StringBuilder question = new StringBuilder();
question.append("Reveal cards to other players?");
@@ -76,7 +80,12 @@ public class PeekAndRevealEffect extends SpellAbilityEffect {
// Singletons.getModel().getGameAction().revealCardsToOtherPlayers(peekingPlayer, revealableCards);
if (rememberRevealed) {
for(Card c : revealableCards) {
source.addRemembered(c);
source.addRemembered(CardUtil.getLKICopy(c));
}
}
} else if (sa.hasParam("RememberPeeked")) {
for(Card c : revealableCards) {
source.addRemembered(CardUtil.getLKICopy(c));
}
}
}

View File

@@ -1,99 +0,0 @@
package forge.card.cardfactory;
import java.util.ArrayList;
import java.util.List;
import forge.Card;
import forge.card.cost.Cost;
import forge.card.spellability.AbilityActivated;
import forge.card.spellability.Target;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
/**
* TODO: Write javadoc for this type.
*
*/
class CardFactoryArtifacts {
/**
* TODO: Write javadoc for this method.
* @param card
* @param cardName
* @return
*/
public static void buildCard(final Card card, final String cardName) {
// *************** START *********** START **************************
if (cardName.equals("Grindstone")) {
class AbilityGrindstone extends AbilityActivated {
public AbilityGrindstone(final Card ca, final Cost co, final Target t) {
super(ca, co, t);
}
@Override
public AbilityActivated getCopy() {
AbilityActivated res = new AbilityGrindstone(getSourceCard(),
getPayCosts(), getTarget() == null ? null : new Target(getTarget()));
CardFactory.copySpellAbility(this, res);
return res;
}
private static final long serialVersionUID = -6281219446216L;
@Override
public boolean canPlayAI() {
this.getTarget().resetTargets();
Player human = getActivatingPlayer().getOpponent();
final List<Card> libList = human.getCardsIn(ZoneType.Library);
this.getTarget().addTarget(human);
return !libList.isEmpty() && canTarget(human);
}
@Override
public void resolve() {
final Player target = this.getTargetPlayer();
final List<Card> library = new ArrayList<Card>(this.getTargetPlayer().getCardsIn(ZoneType.Library));
boolean loop = true;
final List<Card> grinding = new ArrayList<Card>();
do {
grinding.clear();
for (int i = 0; i < 2; i++) {
// Move current grinding to a different list
if (library.size() > 0) {
final Card c = library.get(0);
grinding.add(c);
library.remove(c);
} else {
loop = false;
break;
}
}
// if current grinding dont share a color, stop grinding
if (loop) {
loop = grinding.get(0).sharesColorWith(grinding.get(1));
}
target.mill(grinding.size());
} while (loop);
}
}
final Target target = new Target(card, "Select target player", new String[] { "Player" });
final Cost abCost = new Cost(card, "3 T", true);
final AbilityActivated ab1 = new AbilityGrindstone(card, abCost, target);
final StringBuilder sb = new StringBuilder();
sb.append(abCost);
sb.append("Put the top two cards of target player's library into that player's graveyard. ");
sb.append("If both cards share a color, repeat this process.");
ab1.setDescription(sb.toString());
ab1.setStackDescription(sb.toString());
card.addSpellAbility(ab1);
} // *************** END ************ END **************************
}
}