mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 04:08:01 +00:00
- Convert Cavern Harpy to Trigger and AF
- Expanded ChangeZone Hidden to allow Battlefield origins (for cases that occur on resolution)
This commit is contained in:
@@ -1,9 +1,13 @@
|
||||
Name:Cavern Harpy
|
||||
ManaCost:U B
|
||||
Types:Creature Beast
|
||||
Text:When CARDNAME enters the battlefield, return a blue or black creature you control to its owner's hand.\r\n\r\nPay 1 life: Return CARDNAME to its owner's hand.
|
||||
Types:Creature Harpy Beast
|
||||
Text:no text
|
||||
PT:2/1
|
||||
K:Flying
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a blue or black creature you control to its owner's hand.
|
||||
A:AB$ChangeZone | Cost$ PayLife<1> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand.
|
||||
SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | ChangeType$ Creature.Black+YouCtrl,Creature.Blue+YouCtrl
|
||||
SVar:RemAIDeck:True
|
||||
SVar:Rarity:Common
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/cavern_harpy.jpg
|
||||
SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/97.jpg
|
||||
|
||||
@@ -80,8 +80,15 @@ public class AbilityFactory_ChangeZone {
|
||||
return dbChangeZone;
|
||||
}
|
||||
|
||||
public static boolean isHidden(String origin, boolean hiddenOverride){
|
||||
return (hiddenOverride || origin.equals("Library") || origin.equals("Hand") || origin.equals("Sideboard"));
|
||||
}
|
||||
|
||||
public static boolean isKnown(String origin){
|
||||
return (origin.equals("Graveyard") || origin.equals("Exile") || origin.equals("Battlefield"));
|
||||
}
|
||||
|
||||
private static void setMiscellaneous(AbilityFactory af, SpellAbility sa){
|
||||
// todo: if moving to or from Battlefield allow use in Main1?
|
||||
HashMap<String,String> params = af.getMapParams();
|
||||
String origin = params.get("Origin");
|
||||
|
||||
@@ -100,12 +107,12 @@ public class AbilityFactory_ChangeZone {
|
||||
HashMap<String,String> params = af.getMapParams();
|
||||
String origin = params.get("Origin");
|
||||
|
||||
if (origin.equals("Library") || origin.equals("Hand") || origin.equals("Sideboard")){
|
||||
if (isHidden(origin, params.containsKey("Hidden")))
|
||||
return changeHiddenOriginCanPlayAI(af, sa);
|
||||
}
|
||||
else if (origin.equals("Graveyard") || origin.equals("Exile") || origin.equals("Battlefield")){
|
||||
|
||||
else if (isKnown(origin))
|
||||
return changeKnownOriginCanPlayAI(af, sa);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -113,42 +120,44 @@ public class AbilityFactory_ChangeZone {
|
||||
HashMap<String,String> params = af.getMapParams();
|
||||
String origin = params.get("Origin");
|
||||
|
||||
if (origin.equals("Library") || origin.equals("Hand") || origin.equals("Sideboard")){
|
||||
if (isHidden(origin, params.containsKey("Hidden")))
|
||||
return changeHiddenOriginPlayDrawbackAI(af, sa);
|
||||
}
|
||||
else if (origin.equals("Graveyard") || origin.equals("Exile") || origin.equals("Battlefield")){
|
||||
|
||||
else if (isKnown(origin))
|
||||
return changeKnownOriginPlayDrawbackAI(af, sa);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static String changeZoneDescription(AbilityFactory af, SpellAbility sa){
|
||||
HashMap<String,String> params = af.getMapParams();
|
||||
String origin = params.get("Origin");
|
||||
if (origin.equals("Library") || origin.equals("Hand") || origin.equals("Sideboard")){
|
||||
|
||||
if (isHidden(origin, params.containsKey("Hidden")))
|
||||
return changeHiddenOriginStackDescription(af, sa);
|
||||
}
|
||||
else if (origin.equals("Graveyard") || origin.equals("Exile") || origin.equals("Battlefield")){
|
||||
|
||||
else if (isKnown(origin))
|
||||
return changeKnownOriginStackDescription(af, sa);
|
||||
}
|
||||
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
private static void changeZoneResolve(AbilityFactory af, SpellAbility sa){
|
||||
HashMap<String,String> params = af.getMapParams();
|
||||
String origin = params.get("Origin");
|
||||
if (origin.equals("Library") || origin.equals("Hand") || origin.equals("Sideboard")){
|
||||
|
||||
if (isHidden(origin, params.containsKey("Hidden")))
|
||||
changeHiddenOriginResolve(af, sa);
|
||||
}
|
||||
else if (origin.equals("Graveyard") || origin.equals("Exile") || origin.equals("Battlefield")){
|
||||
|
||||
else if (isKnown(origin))
|
||||
changeKnownOriginResolve(af, sa);
|
||||
}
|
||||
}
|
||||
|
||||
// *************************************************************************************
|
||||
// ************ Hidden Origin (Library/Hand/Sideboard) *********************************
|
||||
// ************ Hidden Origin (Library/Hand/Sideboard/Non-targetd other) ***************
|
||||
// ******* Hidden origin cards are chosen on the resolution of the spell ***************
|
||||
// ******* It is possible for these to have Destination of Battlefield *****************
|
||||
// ****** Example: Cavern Harpy where you don't choose the card until resolution *******
|
||||
// *************************************************************************************
|
||||
|
||||
private static boolean changeHiddenOriginCanPlayAI(AbilityFactory af, SpellAbility sa){
|
||||
@@ -253,9 +262,10 @@ public class AbilityFactory_ChangeZone {
|
||||
String destination = params.get("Destination");
|
||||
|
||||
String type = params.containsKey("ChangeType") ? params.get("ChangeType") : "";
|
||||
int num = params.containsKey("ChangeNum") ? Integer.parseInt(params.get("ChangeNum")) : 1;
|
||||
|
||||
if (origin.equals("Library")){
|
||||
sb.append("Search your library for ").append(params.get("ChangeNum")).append(" ").append(type).append(" and ");
|
||||
sb.append("Search your library for ").append(num).append(" ").append(type).append(" and ");
|
||||
|
||||
if (params.get("ChangeNum").equals("1"))
|
||||
sb.append("put that card ");
|
||||
@@ -279,9 +289,7 @@ public class AbilityFactory_ChangeZone {
|
||||
sb.append("Then shuffle your library.");
|
||||
}
|
||||
else if (origin.equals("Hand")){
|
||||
|
||||
|
||||
sb.append("Put ").append(params.get("ChangeNum")).append(" ").append(type).append(" card(s) from your hand ");
|
||||
sb.append("Put ").append(num).append(" ").append(type).append(" card(s) from your hand ");
|
||||
|
||||
if (destination.equals("Battlefield"))
|
||||
sb.append("onto the battlefield.");
|
||||
@@ -296,6 +304,12 @@ public class AbilityFactory_ChangeZone {
|
||||
sb.append(" of your library.");
|
||||
}
|
||||
}
|
||||
else if (origin.equals("Battlefield")){
|
||||
// todo: Expand on this Description as more cards use it
|
||||
// for the non-targeted SAs when you choose what is returned on resolution
|
||||
sb.append("Return ").append(num).append(" ").append(type).append(" card(s) ");
|
||||
sb.append(" to your ").append(destination);
|
||||
}
|
||||
|
||||
Ability_Sub abSub = sa.getSubAbility();
|
||||
if (abSub != null) {
|
||||
@@ -338,7 +352,7 @@ public class AbilityFactory_ChangeZone {
|
||||
String destination = params.get("Destination");
|
||||
|
||||
CardList fetchList = AllZoneUtil.getCardsInZone(origin, player);
|
||||
if (destination.equals("Library"))
|
||||
if (origin.equals("Library")) // Look at whole library before moving onto choosing a card
|
||||
GuiUtils.getChoice(af.getHostCard().getName() + " - Looking at " + origin, fetchList.toArray());
|
||||
|
||||
fetchList = filterListByType(fetchList, params, "ChangeType", sa);
|
||||
@@ -367,9 +381,9 @@ public class AbilityFactory_ChangeZone {
|
||||
AllZone.GameAction.moveToLibrary(c, libraryPos);
|
||||
}
|
||||
else {
|
||||
AllZone.GameAction.moveTo(destZone, c);
|
||||
if (destination.equals("Battlefield") && params.containsKey("Tapped"))
|
||||
c.tap();
|
||||
AllZone.GameAction.moveTo(destZone, c);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -459,11 +473,12 @@ public class AbilityFactory_ChangeZone {
|
||||
int libraryPos = params.containsKey("LibraryPosition") ? Integer.parseInt(params.get("LibraryPosition")) : 0;
|
||||
AllZone.GameAction.moveToLibrary(c, libraryPos);
|
||||
}
|
||||
else
|
||||
AllZone.GameAction.moveTo(destZone, c);
|
||||
else{
|
||||
if (destination.equals("Battlefield") && params.containsKey("Tapped"))
|
||||
c.tap();
|
||||
|
||||
if (destination.equals("Battlefield") && params.containsKey("Tapped"))
|
||||
c.tap();
|
||||
AllZone.GameAction.moveTo(destZone, c);
|
||||
}
|
||||
}
|
||||
|
||||
if (!destination.equals("Battlefield") && !type.equals("Card")){
|
||||
@@ -694,7 +709,6 @@ public class AbilityFactory_ChangeZone {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private static String changeKnownOriginStackDescription(AbilityFactory af, SpellAbility sa){
|
||||
HashMap<String,String> params = af.getMapParams();
|
||||
|
||||
|
||||
@@ -7203,95 +7203,7 @@ public class CardFactory_Creatures {
|
||||
}
|
||||
});
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
|
||||
//*************** START *********** START **************************
|
||||
else if(cardName.equals("Cavern Harpy")) {
|
||||
final SpellAbility a1 = new Ability(card, "0") {
|
||||
@Override
|
||||
public void resolve() {
|
||||
card.getController().loseLife(1,card);
|
||||
PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, card.getOwner());
|
||||
|
||||
if(card.isToken()) AllZone.getZone(card).remove(card);
|
||||
else AllZone.GameAction.moveTo(hand, card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPlayAI() {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
final SpellAbility ability = new Ability(card, "0") {
|
||||
@Override
|
||||
public void resolve() {
|
||||
Card c = getTargetCard();
|
||||
PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, c.getOwner());
|
||||
|
||||
if(AllZone.GameAction.isCardInPlay(c)) {
|
||||
AllZone.getZone(c).remove(c);
|
||||
|
||||
if(!c.isToken()) {
|
||||
Card newCard = AllZone.CardFactory.getCard(c.getName(), c.getOwner());
|
||||
|
||||
//TODO: Stop making new cards! Need a common card copier to fix multiple isues including images:
|
||||
newCard.setCurSetCode(c.getCurSetCode());
|
||||
newCard.setImageFilename(c.getImageFilename());
|
||||
|
||||
hand.add(newCard);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
Command intoPlay = new Command() {
|
||||
private static final long serialVersionUID = -7855081477395863590L;
|
||||
|
||||
public void execute() {
|
||||
PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, card.getController());
|
||||
|
||||
CardList creatures = new CardList(play.getCards());
|
||||
creatures = creatures.getType("Creature");
|
||||
|
||||
CardList blackBlue = new CardList();
|
||||
|
||||
|
||||
for(int i = 0; i < creatures.size(); i++) {
|
||||
if(creatures.get(i).isBlack()) {
|
||||
blackBlue.add(creatures.get(i));
|
||||
} else if(creatures.get(i).isBlue()) {
|
||||
blackBlue.add(creatures.get(i));
|
||||
}
|
||||
}
|
||||
|
||||
//Object o = GuiUtils.getChoiceOptional("Select a creature card to bounce", blackBlue.toArray());
|
||||
|
||||
|
||||
AllZone.InputControl.setInput(CardFactoryUtil.input_targetSpecific(ability, blackBlue,
|
||||
"Select blue or black creature you control.", false, false));
|
||||
ButtonUtil.disableAll();
|
||||
|
||||
}//execute()
|
||||
};//Command
|
||||
card.addComesIntoPlayCommand(intoPlay);
|
||||
|
||||
card.clearSpellAbility();
|
||||
|
||||
card.addSpellAbility(new Spell_Permanent(card) {
|
||||
private static final long serialVersionUID = -6750896183003809261L;
|
||||
|
||||
@Override
|
||||
public boolean canPlayAI() {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
card.addSpellAbility(a1);
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(card.getController()).append(" pays 1 life and returns Cavern Harpy back to owner's hand.");
|
||||
a1.setStackDescription(sb.toString());
|
||||
}//*************** END ************ END **************************
|
||||
|
||||
|
||||
//*************** START *********** START **************************
|
||||
else if(cardName.equals("Doomsday Specter")) {
|
||||
|
||||
Reference in New Issue
Block a user