*Updated to triggers

Admonition Angel
	Harbor guardian
	Synod Sanctum
*You can now set the trigger parameter "Optional" to "OpponentDecides". Exactly what it says on the tin.
*Any AbilityFactory can now remember it's targets.Simply add a "RememberTargets$ True" parameter to make use of it. Also available is a "ForgetOtherTargets$ True" parameter. This will go far to implement Imprint mechanics, as well as things like Synod Sanctum,Admonition Angel and the like.
*Had GameAction.moveTo() clear tapped status of moved cards.
*Modded AF_ChangeZone to handle multiple cards as Defined.
This commit is contained in:
jendave
2011-08-06 16:14:40 +00:00
parent 6d9082ebd3
commit 1a5ec00b77
10 changed files with 114 additions and 13 deletions

1
.gitattributes vendored
View File

@@ -5293,6 +5293,7 @@ res/cardsfolder/symbiotic_wurm.txt -text svneol=native#text/plain
res/cardsfolder/symbol_of_unsummoning.txt -text svneol=native#text/plain
res/cardsfolder/synchronous_sliver.txt -text svneol=native#text/plain
res/cardsfolder/syncopate.txt -text svneol=native#text/plain
res/cardsfolder/synod_sanctum.txt -text svneol=native#text/plain
res/cardsfolder/syphon_life.txt -text svneol=native#text/plain
res/cardsfolder/szadek_lord_of_secrets.txt svneol=native#text/plain
res/cardsfolder/tablet_of_epityr.txt -text svneol=native#text/plain

View File

@@ -4,8 +4,10 @@ Types:Creature Angel
Text:(NOTE: This spell is rather buggy and should not be used at this time.)
PT:6/6
K:Flying
K:WheneverKeyword:EntersBattleField:Type/Land:Play:MoveFrom-Play-Exiled:NormalInput/Specific/NonType.Land/NotSelf:ASAP:Yes_No:Initiator - OwnedByController!AttachTarget:Landfall - Whenever a land enters the battlefield under your control, you may exile target nonland permanent other than Admonition Angel.
K:WheneverKeyword:LeavesBattleField:Self:Any:MoveFrom-Exiled-Play:All/AttachedCards:ASAP:No_Condition:No Special Condition:When Admonition Angel leaves the battlefield, return all cards exiled with it to the battlefield under their owners' control.
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Optional$ True | Execute$ TrigExile | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may exile target nonland permanent other than CARDNAME.
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return all cards exiled with it to the battlefield under their owners' control.
SVar:TrigExile:AB$ ChangeZone | Cost$ 0 | ValidTgts$ Permanent.Other+nonLand | TgtPrompt$ Choose target nonland permanent other than Admonition Angel. | RememberTargets$ True | Origin$ Battlefield | Destination$ Exile
SVar:TrigReturn:AB$ ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield
SVar:RemAIDeck:True
SVar:BuffedBy:Land
SVar:RemAIDeck:True

View File

@@ -4,7 +4,8 @@ Types:Creature Gargoyle
Text:no text
PT:3/4
K:Reach
K:WheneverKeyword:Attacks:Self:Play:DrawCards/1:ControllingPlayer_Opponent:ASAP:Opponent_Yes_No:No Special Condition:Whenever Harbor Guardian attacks, defending player may draw a card.
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDraw | Optional$ OpponentDecides | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME attacks, defending player may draw a card.
SVar:TrigDraw:AB$ Draw | Cost$ 0 | Defined$ Opponent | NumCards$ 1
SVar:Rarity:Uncommon
SVar:Picture:http://www.wizards.com/global/images/magic/general/harbor_guardian.jpg
SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/326.jpg

View File

@@ -0,0 +1,9 @@
Name:Synod Sanctum
ManaCost:1
Types:Artifact
Text:no text
A:AB$ ChangeZone | Cost$ 2 T | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Choose target permanent you control. | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | SpellDescription$ Exile target permanent you control.
A:AB$ ChangeZone | Cost$ 2 Sac<1/CARDNAME> | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SpellDescription$ Return all cards exiled with CARDNAME to the battlefield under your control.
SVar:Rarity:Uncommon
SVar:Picture:http://www.wizards.com/global/images/magic/general/synod_sanctum.jpg
End

View File

@@ -655,6 +655,10 @@ public class AbilityFactory {
list = new CardList();
list.add(ability.getTriggeringCard());
}
else if (calcX[0].startsWith("Remembered")) {
list = new CardList();
list.add(card.getRemembered().get(0));
}
else
return 0;
@@ -695,6 +699,9 @@ public class AbilityFactory {
else if (defined.equals("Triggered"))
c = sa.getTriggeringCard();
else if (defined.equals("Remembered"))
cards.addAll(hostCard.getRemembered());
if (c != null)
cards.add(c);
@@ -767,4 +774,22 @@ public class AbilityFactory {
return parent;
}
public static void HandleRemembering(AbilityFactory AF)
{
if(!AF.getMapParams().containsKey("RememberTargets"))
{
return;
}
if(AF.getMapParams().containsKey("ForgetOtherTargets"))
{
AF.getHostCard().clearRemembered();
}
for(Card c : AF.getAbTgt().getTargetCards())
{
AF.getHostCard().addRemembered(c);
}
}
}

View File

@@ -674,7 +674,7 @@ public class AbilityFactory_ChangeZone {
}
else{
// non-targeted retrieval
Card retrieval = null;
CardList retrieval = null;
if (af.getMapParams().containsKey("Defined")){
// add hooks into AF_Defined function
retrieval = knownDetermineDefined(sa, params.get("Defined"), origin);
@@ -683,7 +683,7 @@ public class AbilityFactory_ChangeZone {
if (retrieval == null)
return false;
if (retrieval == source){
if (retrieval.get(0) == source){
if (origin.equals("Graveyard")){
// return this card from graveyard: cards like Hammer of Bogardan
// in general this is cool, but we should add some type of restrictions
@@ -731,7 +731,10 @@ public class AbilityFactory_ChangeZone {
else{
// otherwise add self to list and go from there
tgts = new ArrayList<Card>();
tgts.add(knownDetermineDefined(sa, params.get("Defined"), origin));
for(Card c : knownDetermineDefined(sa, params.get("Defined"), origin))
{
tgts.add(c);
}
}
for(Card c : tgts)
@@ -819,7 +822,10 @@ public class AbilityFactory_ChangeZone {
tgtCards = tgt.getTargetCards();
else{
tgtCards = new ArrayList<Card>();
tgtCards.add(knownDetermineDefined(sa, params.get("Defined"), origin));
for(Card c : knownDetermineDefined(sa, params.get("Defined"), origin))
{
tgtCards.add(c);
}
}
Card targetCard = tgtCards.get(0);
@@ -855,9 +861,13 @@ public class AbilityFactory_ChangeZone {
tgtC.tap();
if (params.containsKey("GainControl"))
tgtC.setController(sa.getActivatingPlayer());
AllZone.GameAction.moveTo(AllZone.getZone(destination, tgtC.getOwner()),tgtC);
}
else
{
AllZone.GameAction.moveTo(AllZone.getZone(destination, pl), tgtC);
}
AllZone.GameAction.moveTo(AllZone.getZone(destination, pl), tgtC);
}
}
@@ -876,18 +886,22 @@ public class AbilityFactory_ChangeZone {
}
// **************************** Known Utility **************************************
private static Card knownDetermineDefined(SpellAbility sa, String defined, String origin){
private static CardList knownDetermineDefined(SpellAbility sa, String defined, String origin){
// todo: this function should return a ArrayList<Card> and then be handled by the callees
CardList grave = AllZoneUtil.getCardsInZone(origin, sa.getActivatingPlayer());
CardList ret = new CardList();
if (defined != null && defined.equals("Top")){
// the "top" of the graveyard, is the last to be added to the graveyard list?
if (grave.size() == 0)
return null;
return grave.get(grave.size()-1);
ret.add(grave.get(grave.size()-1));
return ret;
}
return AbilityFactory.getDefinedCards(sa.getSourceCard(), defined, sa).get(0);
ret.addAll(AbilityFactory.getDefinedCards(sa.getSourceCard(), defined, sa).toArray());
return ret;
}
// *************************************************************************************

View File

@@ -42,6 +42,8 @@ public class Card extends MyObservable {
private ArrayList<Ability_Mana> manaAbility = new ArrayList<Ability_Mana>();
private ArrayList<Card_Color> cardColor = new ArrayList<Card_Color>();
private ArrayList<Card> rememberedCards = new ArrayList<Card>();
private HashMap<Card, Integer> receivedDamageFromThisTurn = new HashMap<Card, Integer>();
private HashMap<Card, Integer> assignedDamageHashMap = new HashMap<Card, Integer>();
@@ -175,6 +177,21 @@ public class Card extends MyObservable {
private int abilityUsed; //How many times has this ability been used?
public void addRemembered(Card c)
{
rememberedCards.add(c);
}
public ArrayList<Card> getRemembered()
{
return rememberedCards;
}
public void clearRemembered()
{
rememberedCards.clear();
}
public void addTrigger(Trigger t)
{
Trigger newtrig = t.getCopy();
@@ -1068,6 +1085,17 @@ public class Card extends MyObservable {
sb.replace(start, start+4, "\r\n");
}
//Remembered cards
if(rememberedCards.size() > 0)
sb.append("Remembered: \r\n");
for(Card c : rememberedCards)
{
sb.append(c.getName() + "(");
sb.append(c.getUniqueNumber());
sb.append(")");
sb.append("\r\n");
}
return sb.toString().replaceAll("CARDNAME", getName()).trim();
}//getText()

View File

@@ -67,6 +67,13 @@ public class GameAction {
// todo: add attachment code here
}
if (!zone.is(Constant.Zone.Battlefield))
{
//Other characteristics should be cleared here also.
c.setTapped(false);
c.clearRemembered();
}
//Run triggers
HashMap<String,Object> runParams = new HashMap<String,Object>();

View File

@@ -643,6 +643,10 @@ public class MagicStack extends MyObservable {
}
});
}
if(sa.getAbilityFactory() != null)
{
AbilityFactory.HandleRemembering(sa.getAbilityFactory());
}
sa.resolve();
if (sa.getSourceCard().getKeyword().contains("Draw a card.")

View File

@@ -227,9 +227,19 @@ public class TriggerHandler {
}
if(trigParams.containsKey("Optional"))
{
Player decider = null;
if(trigParams.get("Optional").equals("True"))
{
if(regtrig.getHostCard().getController().equals(AllZone.HumanPlayer))
decider = regtrig.getHostCard().getController();
}
else if(trigParams.get("Optional").equals("OpponentDecides"))
{
decider = regtrig.getHostCard().getController().getOpponent();
}
if(decider != null)
{
if(decider.equals(AllZone.HumanPlayer))
{
StringBuilder buildQuestion = new StringBuilder("Use triggered ability of ");
buildQuestion.append(regtrig.getHostCard().getName()).append("(").append(regtrig.getHostCard().getUniqueNumber()).append(")?");