mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
*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:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -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/symbol_of_unsummoning.txt -text svneol=native#text/plain
|
||||||
res/cardsfolder/synchronous_sliver.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/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/syphon_life.txt -text svneol=native#text/plain
|
||||||
res/cardsfolder/szadek_lord_of_secrets.txt 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
|
res/cardsfolder/tablet_of_epityr.txt -text svneol=native#text/plain
|
||||||
|
|||||||
@@ -4,8 +4,10 @@ Types:Creature Angel
|
|||||||
Text:(NOTE: This spell is rather buggy and should not be used at this time.)
|
Text:(NOTE: This spell is rather buggy and should not be used at this time.)
|
||||||
PT:6/6
|
PT:6/6
|
||||||
K:Flying
|
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.
|
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.
|
||||||
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$ 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:RemAIDeck:True
|
||||||
SVar:BuffedBy:Land
|
SVar:BuffedBy:Land
|
||||||
SVar:RemAIDeck:True
|
SVar:RemAIDeck:True
|
||||||
|
|||||||
@@ -4,7 +4,8 @@ Types:Creature Gargoyle
|
|||||||
Text:no text
|
Text:no text
|
||||||
PT:3/4
|
PT:3/4
|
||||||
K:Reach
|
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:Rarity:Uncommon
|
||||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/harbor_guardian.jpg
|
SVar:Picture:http://www.wizards.com/global/images/magic/general/harbor_guardian.jpg
|
||||||
SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/326.jpg
|
SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/326.jpg
|
||||||
|
|||||||
9
res/cardsfolder/synod_sanctum.txt
Normal file
9
res/cardsfolder/synod_sanctum.txt
Normal 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
|
||||||
@@ -655,6 +655,10 @@ public class AbilityFactory {
|
|||||||
list = new CardList();
|
list = new CardList();
|
||||||
list.add(ability.getTriggeringCard());
|
list.add(ability.getTriggeringCard());
|
||||||
}
|
}
|
||||||
|
else if (calcX[0].startsWith("Remembered")) {
|
||||||
|
list = new CardList();
|
||||||
|
list.add(card.getRemembered().get(0));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -695,6 +699,9 @@ public class AbilityFactory {
|
|||||||
else if (defined.equals("Triggered"))
|
else if (defined.equals("Triggered"))
|
||||||
c = sa.getTriggeringCard();
|
c = sa.getTriggeringCard();
|
||||||
|
|
||||||
|
else if (defined.equals("Remembered"))
|
||||||
|
cards.addAll(hostCard.getRemembered());
|
||||||
|
|
||||||
if (c != null)
|
if (c != null)
|
||||||
cards.add(c);
|
cards.add(c);
|
||||||
|
|
||||||
@@ -767,4 +774,22 @@ public class AbilityFactory {
|
|||||||
|
|
||||||
return parent;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -674,7 +674,7 @@ public class AbilityFactory_ChangeZone {
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// non-targeted retrieval
|
// non-targeted retrieval
|
||||||
Card retrieval = null;
|
CardList retrieval = null;
|
||||||
if (af.getMapParams().containsKey("Defined")){
|
if (af.getMapParams().containsKey("Defined")){
|
||||||
// add hooks into AF_Defined function
|
// add hooks into AF_Defined function
|
||||||
retrieval = knownDetermineDefined(sa, params.get("Defined"), origin);
|
retrieval = knownDetermineDefined(sa, params.get("Defined"), origin);
|
||||||
@@ -683,7 +683,7 @@ public class AbilityFactory_ChangeZone {
|
|||||||
if (retrieval == null)
|
if (retrieval == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (retrieval == source){
|
if (retrieval.get(0) == source){
|
||||||
if (origin.equals("Graveyard")){
|
if (origin.equals("Graveyard")){
|
||||||
// return this card from graveyard: cards like Hammer of Bogardan
|
// return this card from graveyard: cards like Hammer of Bogardan
|
||||||
// in general this is cool, but we should add some type of restrictions
|
// in general this is cool, but we should add some type of restrictions
|
||||||
@@ -731,7 +731,10 @@ public class AbilityFactory_ChangeZone {
|
|||||||
else{
|
else{
|
||||||
// otherwise add self to list and go from there
|
// otherwise add self to list and go from there
|
||||||
tgts = new ArrayList<Card>();
|
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)
|
for(Card c : tgts)
|
||||||
@@ -819,7 +822,10 @@ public class AbilityFactory_ChangeZone {
|
|||||||
tgtCards = tgt.getTargetCards();
|
tgtCards = tgt.getTargetCards();
|
||||||
else{
|
else{
|
||||||
tgtCards = new ArrayList<Card>();
|
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);
|
Card targetCard = tgtCards.get(0);
|
||||||
@@ -855,9 +861,13 @@ public class AbilityFactory_ChangeZone {
|
|||||||
tgtC.tap();
|
tgtC.tap();
|
||||||
if (params.containsKey("GainControl"))
|
if (params.containsKey("GainControl"))
|
||||||
tgtC.setController(sa.getActivatingPlayer());
|
tgtC.setController(sa.getActivatingPlayer());
|
||||||
}
|
|
||||||
|
|
||||||
AllZone.GameAction.moveTo(AllZone.getZone(destination, pl), tgtC);
|
AllZone.GameAction.moveTo(AllZone.getZone(destination, tgtC.getOwner()),tgtC);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AllZone.GameAction.moveTo(AllZone.getZone(destination, pl), tgtC);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -876,18 +886,22 @@ public class AbilityFactory_ChangeZone {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// **************************** Known Utility **************************************
|
// **************************** 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
|
// todo: this function should return a ArrayList<Card> and then be handled by the callees
|
||||||
CardList grave = AllZoneUtil.getCardsInZone(origin, sa.getActivatingPlayer());
|
CardList grave = AllZoneUtil.getCardsInZone(origin, sa.getActivatingPlayer());
|
||||||
|
CardList ret = new CardList();
|
||||||
|
|
||||||
if (defined != null && defined.equals("Top")){
|
if (defined != null && defined.equals("Top")){
|
||||||
// the "top" of the graveyard, is the last to be added to the graveyard list?
|
// the "top" of the graveyard, is the last to be added to the graveyard list?
|
||||||
if (grave.size() == 0)
|
if (grave.size() == 0)
|
||||||
return null;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// *************************************************************************************
|
// *************************************************************************************
|
||||||
|
|||||||
@@ -42,6 +42,8 @@ public class Card extends MyObservable {
|
|||||||
private ArrayList<Ability_Mana> manaAbility = new ArrayList<Ability_Mana>();
|
private ArrayList<Ability_Mana> manaAbility = new ArrayList<Ability_Mana>();
|
||||||
private ArrayList<Card_Color> cardColor = new ArrayList<Card_Color>();
|
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> receivedDamageFromThisTurn = new HashMap<Card, Integer>();
|
||||||
private HashMap<Card, Integer> assignedDamageHashMap = 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?
|
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)
|
public void addTrigger(Trigger t)
|
||||||
{
|
{
|
||||||
Trigger newtrig = t.getCopy();
|
Trigger newtrig = t.getCopy();
|
||||||
@@ -1068,6 +1085,17 @@ public class Card extends MyObservable {
|
|||||||
sb.replace(start, start+4, "\r\n");
|
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();
|
return sb.toString().replaceAll("CARDNAME", getName()).trim();
|
||||||
}//getText()
|
}//getText()
|
||||||
|
|
||||||
|
|||||||
@@ -67,6 +67,13 @@ public class GameAction {
|
|||||||
// todo: add attachment code here
|
// 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
|
//Run triggers
|
||||||
HashMap<String,Object> runParams = new HashMap<String,Object>();
|
HashMap<String,Object> runParams = new HashMap<String,Object>();
|
||||||
|
|
||||||
|
|||||||
@@ -643,6 +643,10 @@ public class MagicStack extends MyObservable {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if(sa.getAbilityFactory() != null)
|
||||||
|
{
|
||||||
|
AbilityFactory.HandleRemembering(sa.getAbilityFactory());
|
||||||
|
}
|
||||||
sa.resolve();
|
sa.resolve();
|
||||||
|
|
||||||
if (sa.getSourceCard().getKeyword().contains("Draw a card.")
|
if (sa.getSourceCard().getKeyword().contains("Draw a card.")
|
||||||
|
|||||||
@@ -227,9 +227,19 @@ public class TriggerHandler {
|
|||||||
}
|
}
|
||||||
if(trigParams.containsKey("Optional"))
|
if(trigParams.containsKey("Optional"))
|
||||||
{
|
{
|
||||||
|
Player decider = null;
|
||||||
if(trigParams.get("Optional").equals("True"))
|
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 ");
|
StringBuilder buildQuestion = new StringBuilder("Use triggered ability of ");
|
||||||
buildQuestion.append(regtrig.getHostCard().getName()).append("(").append(regtrig.getHostCard().getUniqueNumber()).append(")?");
|
buildQuestion.append(regtrig.getHostCard().getName()).append("(").append(regtrig.getHostCard().getUniqueNumber()).append(")?");
|
||||||
|
|||||||
Reference in New Issue
Block a user