mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 19:58: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/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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
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.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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
// *************************************************************************************
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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>();
|
||||
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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(")?");
|
||||
|
||||
Reference in New Issue
Block a user