added "once" support for the remaining triggers that did not have it.
this is basically one activation for the existence of the trigger, meaning if it is used on a card, and the trigger exist for inplay, it will only activate one time while that card is inplay, it will activate again if the card leaves play and is put back in play again by another effect, this was originally added for cards such as the hidden enchantment cycle.
This commit is contained in:
@@ -278,6 +278,7 @@ public:
|
|||||||
|
|
||||||
int triggerOnEvent(WEvent * event)
|
int triggerOnEvent(WEvent * event)
|
||||||
{
|
{
|
||||||
|
if(!activeTrigger) return 0;
|
||||||
if(source->isPhased) return 0;
|
if(source->isPhased) return 0;
|
||||||
WEventZoneChange * e = dynamic_cast<WEventZoneChange*> (event);
|
WEventZoneChange * e = dynamic_cast<WEventZoneChange*> (event);
|
||||||
if (!e) return 0;
|
if (!e) return 0;
|
||||||
@@ -285,8 +286,6 @@ public:
|
|||||||
return 0;
|
return 0;
|
||||||
if(isSuspended && !source->suspended)
|
if(isSuspended && !source->suspended)
|
||||||
return 0;
|
return 0;
|
||||||
if(activeTrigger == false)
|
|
||||||
return 0;
|
|
||||||
if (!toTcZone->targetsZone(e->to)) return 0;
|
if (!toTcZone->targetsZone(e->to)) return 0;
|
||||||
if (!toTcCard->canTarget(e->card)) return 0;
|
if (!toTcCard->canTarget(e->card)) return 0;
|
||||||
if (fromTcZone && !fromTcZone->targetsZone(e->from)) return 0;
|
if (fromTcZone && !fromTcZone->targetsZone(e->from)) return 0;
|
||||||
@@ -325,9 +324,11 @@ class TrCardTapped: public TriggeredAbility
|
|||||||
public:
|
public:
|
||||||
TargetChooser * tc;
|
TargetChooser * tc;
|
||||||
bool tap;
|
bool tap;
|
||||||
TrCardTapped(int id, MTGCardInstance * source, TargetChooser * tc, bool tap = true) :
|
bool once,activeTrigger;
|
||||||
TriggeredAbility(id, source), tc(tc), tap(tap)
|
TrCardTapped(int id, MTGCardInstance * source, TargetChooser * tc, bool tap = true, bool once = false) :
|
||||||
|
TriggeredAbility(id, source), tc(tc), tap(tap), once(once)
|
||||||
{
|
{
|
||||||
|
activeTrigger = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int resolve()
|
int resolve()
|
||||||
@@ -337,12 +338,15 @@ public:
|
|||||||
|
|
||||||
int triggerOnEvent(WEvent * event)
|
int triggerOnEvent(WEvent * event)
|
||||||
{
|
{
|
||||||
|
if(!activeTrigger) return 0;
|
||||||
if(source->isPhased) return 0;
|
if(source->isPhased) return 0;
|
||||||
WEventCardTap * e = dynamic_cast<WEventCardTap *> (event);
|
WEventCardTap * e = dynamic_cast<WEventCardTap *> (event);
|
||||||
if (!e) return 0;
|
if (!e) return 0;
|
||||||
if (e->before == e->after) return 0;
|
if (e->before == e->after) return 0;
|
||||||
if (e->after != tap) return 0;
|
if (e->after != tap) return 0;
|
||||||
if (!tc->canTarget(e->card)) return 0;
|
if (!tc->canTarget(e->card)) return 0;
|
||||||
|
if (once && activeTrigger)
|
||||||
|
activeTrigger = false;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -364,9 +368,11 @@ class TrCardTappedformana: public TriggeredAbility
|
|||||||
public:
|
public:
|
||||||
TargetChooser * tc;
|
TargetChooser * tc;
|
||||||
bool tap;
|
bool tap;
|
||||||
TrCardTappedformana(int id, MTGCardInstance * source, TargetChooser * tc, bool tap = true) :
|
bool once,activeTrigger;
|
||||||
TriggeredAbility(id, source), tc(tc), tap(tap)
|
TrCardTappedformana(int id, MTGCardInstance * source, TargetChooser * tc, bool tap = true, bool once = false) :
|
||||||
|
TriggeredAbility(id, source), tc(tc), tap(tap), once(once)
|
||||||
{
|
{
|
||||||
|
activeTrigger = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int resolve()
|
int resolve()
|
||||||
@@ -376,12 +382,15 @@ public:
|
|||||||
|
|
||||||
int triggerOnEvent(WEvent * event)
|
int triggerOnEvent(WEvent * event)
|
||||||
{
|
{
|
||||||
|
if(!activeTrigger) return 0;
|
||||||
if(source->isPhased) return 0;
|
if(source->isPhased) return 0;
|
||||||
WEventCardTappedForMana * e = dynamic_cast<WEventCardTappedForMana *> (event);
|
WEventCardTappedForMana * e = dynamic_cast<WEventCardTappedForMana *> (event);
|
||||||
if (!e) return 0;
|
if (!e) return 0;
|
||||||
if (e->before == e->after) return 0;
|
if (e->before == e->after) return 0;
|
||||||
if (e->after != tap) return 0;
|
if (e->after != tap) return 0;
|
||||||
if (!tc->canTarget(e->card)) return 0;
|
if (!tc->canTarget(e->card)) return 0;
|
||||||
|
if (once && activeTrigger)
|
||||||
|
activeTrigger = false;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -539,9 +548,11 @@ class TrcardDrawn: public TriggeredAbility
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TargetChooser * tc;
|
TargetChooser * tc;
|
||||||
TrcardDrawn(int id, MTGCardInstance * source, TargetChooser * tc) :
|
bool once,activeTrigger;
|
||||||
TriggeredAbility(id, source), tc(tc)
|
TrcardDrawn(int id, MTGCardInstance * source, TargetChooser * tc,bool once = false) :
|
||||||
|
TriggeredAbility(id, source), tc(tc), once(once)
|
||||||
{
|
{
|
||||||
|
activeTrigger = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int resolve()
|
int resolve()
|
||||||
@@ -551,10 +562,13 @@ public:
|
|||||||
|
|
||||||
int triggerOnEvent(WEvent * event)
|
int triggerOnEvent(WEvent * event)
|
||||||
{
|
{
|
||||||
|
if(!activeTrigger) return 0;
|
||||||
if(source->isPhased) return 0;
|
if(source->isPhased) return 0;
|
||||||
WEventcardDraw * e = dynamic_cast<WEventcardDraw *> (event);
|
WEventcardDraw * e = dynamic_cast<WEventcardDraw *> (event);
|
||||||
if (!e) return 0;
|
if (!e) return 0;
|
||||||
if (!tc->canTarget(e->player)) return 0;
|
if (!tc->canTarget(e->player)) return 0;
|
||||||
|
if (once && activeTrigger)
|
||||||
|
activeTrigger = false;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -575,9 +589,11 @@ class TrCardSacrificed: public TriggeredAbility
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TargetChooser * tc;
|
TargetChooser * tc;
|
||||||
TrCardSacrificed(int id, MTGCardInstance * source, TargetChooser * tc) :
|
bool once,activeTrigger;
|
||||||
TriggeredAbility(id, source), tc(tc)
|
TrCardSacrificed(int id, MTGCardInstance * source, TargetChooser * tc,bool once = false) :
|
||||||
|
TriggeredAbility(id, source), tc(tc), once(once)
|
||||||
{
|
{
|
||||||
|
activeTrigger = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int resolve()
|
int resolve()
|
||||||
@@ -587,10 +603,13 @@ public:
|
|||||||
|
|
||||||
int triggerOnEvent(WEvent * event)
|
int triggerOnEvent(WEvent * event)
|
||||||
{
|
{
|
||||||
|
if(!activeTrigger) return 0;
|
||||||
if(source->isPhased) return 0;
|
if(source->isPhased) return 0;
|
||||||
WEventCardSacrifice * e = dynamic_cast<WEventCardSacrifice *> (event);
|
WEventCardSacrifice * e = dynamic_cast<WEventCardSacrifice *> (event);
|
||||||
if (!e) return 0;
|
if (!e) return 0;
|
||||||
if (!tc->canTarget(e->card)) return 0;
|
if (!tc->canTarget(e->card)) return 0;
|
||||||
|
if (once && activeTrigger)
|
||||||
|
activeTrigger = false;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -611,9 +630,11 @@ class TrCardDiscarded: public TriggeredAbility
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TargetChooser * tc;
|
TargetChooser * tc;
|
||||||
TrCardDiscarded(int id, MTGCardInstance * source, TargetChooser * tc) :
|
bool once,activeTrigger;
|
||||||
|
TrCardDiscarded(int id, MTGCardInstance * source, TargetChooser * tc,bool once = false) :
|
||||||
TriggeredAbility(id, source), tc(tc)
|
TriggeredAbility(id, source), tc(tc)
|
||||||
{
|
{
|
||||||
|
activeTrigger = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int resolve()
|
int resolve()
|
||||||
@@ -622,10 +643,13 @@ public:
|
|||||||
}
|
}
|
||||||
int triggerOnEvent(WEvent * event)
|
int triggerOnEvent(WEvent * event)
|
||||||
{
|
{
|
||||||
|
if(!activeTrigger) return 0;
|
||||||
if(source->isPhased) return 0;
|
if(source->isPhased) return 0;
|
||||||
WEventCardDiscard * e = dynamic_cast<WEventCardDiscard *> (event);
|
WEventCardDiscard * e = dynamic_cast<WEventCardDiscard *> (event);
|
||||||
if (!e) return 0;
|
if (!e) return 0;
|
||||||
if (!tc->canTarget(e->card)) return 0;
|
if (!tc->canTarget(e->card)) return 0;
|
||||||
|
if (once && activeTrigger)
|
||||||
|
activeTrigger = false;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
~TrCardDiscarded()
|
~TrCardDiscarded()
|
||||||
@@ -649,10 +673,12 @@ public:
|
|||||||
bool sourceUntapped;
|
bool sourceUntapped;
|
||||||
bool limitOnceATurn;
|
bool limitOnceATurn;
|
||||||
int triggeredTurn;
|
int triggeredTurn;
|
||||||
TrDamaged(int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL, int type = 0,bool sourceUntapped = false,bool limitOnceATurn = false) :
|
bool once,activeTrigger;
|
||||||
TriggeredAbility(id, source), tc(tc), fromTc(fromTc), type(type) , sourceUntapped(sourceUntapped),limitOnceATurn(limitOnceATurn)
|
TrDamaged(int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL, int type = 0,bool sourceUntapped = false,bool limitOnceATurn = false,bool once = false) :
|
||||||
|
TriggeredAbility(id, source), tc(tc), fromTc(fromTc), type(type) , sourceUntapped(sourceUntapped),limitOnceATurn(limitOnceATurn),once(once)
|
||||||
{
|
{
|
||||||
triggeredTurn = -1;
|
triggeredTurn = -1;
|
||||||
|
activeTrigger = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int resolve()
|
int resolve()
|
||||||
@@ -662,6 +688,7 @@ public:
|
|||||||
|
|
||||||
int triggerOnEvent(WEvent * event)
|
int triggerOnEvent(WEvent * event)
|
||||||
{
|
{
|
||||||
|
if(!activeTrigger) return 0;
|
||||||
if(source->isPhased) return 0;
|
if(source->isPhased) return 0;
|
||||||
WEventDamage * e = dynamic_cast<WEventDamage *> (event);
|
WEventDamage * e = dynamic_cast<WEventDamage *> (event);
|
||||||
if (!e) return 0;
|
if (!e) return 0;
|
||||||
@@ -678,6 +705,8 @@ public:
|
|||||||
e->damage->source->thatmuch = e->damage->damage;
|
e->damage->source->thatmuch = e->damage->damage;
|
||||||
this->source->thatmuch = e->damage->damage;
|
this->source->thatmuch = e->damage->damage;
|
||||||
triggeredTurn = g->turn;
|
triggeredTurn = g->turn;
|
||||||
|
if (once && activeTrigger)
|
||||||
|
activeTrigger = false;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -702,9 +731,11 @@ public:
|
|||||||
TargetChooser * fromTc;
|
TargetChooser * fromTc;
|
||||||
int type;//this allows damagenoncombat and combatdamage to share this trigger
|
int type;//this allows damagenoncombat and combatdamage to share this trigger
|
||||||
bool sourceUntapped;
|
bool sourceUntapped;
|
||||||
TrLifeGained(int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL, int type = 0,bool sourceUntapped = false) :
|
bool once,activeTrigger;
|
||||||
TriggeredAbility(id, source), tc(tc), fromTc(fromTc), type(type) , sourceUntapped(sourceUntapped)
|
TrLifeGained(int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL, int type = 0,bool sourceUntapped = false,bool once = false) :
|
||||||
|
TriggeredAbility(id, source), tc(tc), fromTc(fromTc), type(type) , sourceUntapped(sourceUntapped), once(once)
|
||||||
{
|
{
|
||||||
|
activeTrigger = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int resolve()
|
int resolve()
|
||||||
@@ -714,6 +745,7 @@ public:
|
|||||||
|
|
||||||
int triggerOnEvent(WEvent * event)
|
int triggerOnEvent(WEvent * event)
|
||||||
{
|
{
|
||||||
|
if(!activeTrigger) return 0;
|
||||||
if(source->isPhased) return 0;
|
if(source->isPhased) return 0;
|
||||||
WEventLife * e = dynamic_cast<WEventLife *> (event);
|
WEventLife * e = dynamic_cast<WEventLife *> (event);
|
||||||
if (!e) return 0;
|
if (!e) return 0;
|
||||||
@@ -725,6 +757,8 @@ public:
|
|||||||
if (type == 0 && (e->amount < 0)) return 0;
|
if (type == 0 && (e->amount < 0)) return 0;
|
||||||
e->player->thatmuch = abs(e->amount);
|
e->player->thatmuch = abs(e->amount);
|
||||||
this->source->thatmuch = abs(e->amount);
|
this->source->thatmuch = abs(e->amount);
|
||||||
|
if (once && activeTrigger)
|
||||||
|
activeTrigger = false;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -748,9 +782,11 @@ class TrVampired: public TriggeredAbility
|
|||||||
public:
|
public:
|
||||||
TargetChooser * tc;
|
TargetChooser * tc;
|
||||||
TargetChooser * fromTc;
|
TargetChooser * fromTc;
|
||||||
TrVampired(int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL) :
|
bool once,activeTrigger;
|
||||||
TriggeredAbility(id, source), tc(tc), fromTc(fromTc)
|
TrVampired(int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL,bool once = false) :
|
||||||
|
TriggeredAbility(id, source), tc(tc), fromTc(fromTc), once(once)
|
||||||
{
|
{
|
||||||
|
activeTrigger = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int resolve()
|
int resolve()
|
||||||
@@ -760,6 +796,7 @@ public:
|
|||||||
|
|
||||||
int triggerOnEvent(WEvent * event)
|
int triggerOnEvent(WEvent * event)
|
||||||
{
|
{
|
||||||
|
if(!activeTrigger) return 0;
|
||||||
if(source->isPhased) return 0;
|
if(source->isPhased) return 0;
|
||||||
WEventVampire * vamp = dynamic_cast<WEventVampire*>(event);
|
WEventVampire * vamp = dynamic_cast<WEventVampire*>(event);
|
||||||
if (vamp)
|
if (vamp)
|
||||||
@@ -771,6 +808,8 @@ public:
|
|||||||
//setting allzones, as we don't care since we know the preexisting condiations cover the zones.
|
//setting allzones, as we don't care since we know the preexisting condiations cover the zones.
|
||||||
if(!tc->canTarget(vamp->victem))
|
if(!tc->canTarget(vamp->victem))
|
||||||
return 0;
|
return 0;
|
||||||
|
if (once && activeTrigger)
|
||||||
|
activeTrigger = false;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -797,9 +836,11 @@ public:
|
|||||||
TargetChooser * tc;
|
TargetChooser * tc;
|
||||||
TargetChooser * fromTc;
|
TargetChooser * fromTc;
|
||||||
int type;
|
int type;
|
||||||
TrTargeted(int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL, int type = 0) :
|
bool once,activeTrigger;
|
||||||
TriggeredAbility(id, source), tc(tc), fromTc(fromTc), type(type)
|
TrTargeted(int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL, int type = 0,bool once = false) :
|
||||||
|
TriggeredAbility(id, source), tc(tc), fromTc(fromTc), type(type), once(once)
|
||||||
{
|
{
|
||||||
|
activeTrigger = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int resolve()
|
int resolve()
|
||||||
@@ -809,11 +850,14 @@ public:
|
|||||||
|
|
||||||
int triggerOnEvent(WEvent * event)
|
int triggerOnEvent(WEvent * event)
|
||||||
{
|
{
|
||||||
|
if(!activeTrigger) return 0;
|
||||||
if(source->isPhased) return 0;
|
if(source->isPhased) return 0;
|
||||||
WEventTarget * e = dynamic_cast<WEventTarget *> (event);
|
WEventTarget * e = dynamic_cast<WEventTarget *> (event);
|
||||||
if (!e) return 0;
|
if (!e) return 0;
|
||||||
if (!tc->canTarget(e->card)) return 0;
|
if (!tc->canTarget(e->card)) return 0;
|
||||||
if (fromTc && !fromTc->canTarget(e->source)) return 0;
|
if (fromTc && !fromTc->canTarget(e->source)) return 0;
|
||||||
|
if (once && activeTrigger)
|
||||||
|
activeTrigger = false;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -424,7 +424,8 @@ public:
|
|||||||
bool sourceTap;
|
bool sourceTap;
|
||||||
bool lifelost;
|
bool lifelost;
|
||||||
int lifeamount;
|
int lifeamount;
|
||||||
TriggerAtPhase(int id, MTGCardInstance * source, Targetable * target,int _phaseId, int who = 0,bool sourceUntapped = false,bool sourceTap = false,bool lifelost = false, int lifeamount = 0);
|
bool once,activeTrigger;
|
||||||
|
TriggerAtPhase(int id, MTGCardInstance * source, Targetable * target,int _phaseId, int who = 0,bool sourceUntapped = false,bool sourceTap = false,bool lifelost = false, int lifeamount = 0, bool once = false);
|
||||||
virtual int trigger();
|
virtual int trigger();
|
||||||
int resolve(){return 0;};
|
int resolve(){return 0;};
|
||||||
virtual TriggerAtPhase* clone() const;
|
virtual TriggerAtPhase* clone() const;
|
||||||
@@ -436,7 +437,8 @@ public:
|
|||||||
int destroyActivated;
|
int destroyActivated;
|
||||||
bool sourceUntapped;
|
bool sourceUntapped;
|
||||||
bool sourceTap;
|
bool sourceTap;
|
||||||
TriggerNextPhase(int id, MTGCardInstance * source, Targetable * target,int _phaseId, int who = 0,bool sourceUntapped = false,bool sourceTap = false);
|
bool once,activeTrigger;
|
||||||
|
TriggerNextPhase(int id, MTGCardInstance * source, Targetable * target,int _phaseId, int who = 0,bool sourceUntapped = false,bool sourceTap = false,bool once = false);
|
||||||
virtual TriggerNextPhase* clone() const;
|
virtual TriggerNextPhase* clone() const;
|
||||||
virtual int testDestroy();
|
virtual int testDestroy();
|
||||||
|
|
||||||
|
|||||||
@@ -481,15 +481,15 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string magicText, int
|
|||||||
|
|
||||||
//Card unTapped
|
//Card unTapped
|
||||||
if (TargetChooser *tc = parseSimpleTC(s,"untapped", card))
|
if (TargetChooser *tc = parseSimpleTC(s,"untapped", card))
|
||||||
return NEW TrCardTapped(id, card, tc, false);
|
return NEW TrCardTapped(id, card, tc, false,once);
|
||||||
|
|
||||||
//Card Tapped
|
//Card Tapped
|
||||||
if (TargetChooser *tc = parseSimpleTC(s,"tapped", card))
|
if (TargetChooser *tc = parseSimpleTC(s,"tapped", card))
|
||||||
return NEW TrCardTapped(id, card, tc, true);
|
return NEW TrCardTapped(id, card, tc, true,once);
|
||||||
|
|
||||||
//Card Tapped for mana
|
//Card Tapped for mana
|
||||||
if (TargetChooser *tc = parseSimpleTC(s,"tappedformana", card))
|
if (TargetChooser *tc = parseSimpleTC(s,"tappedformana", card))
|
||||||
return NEW TrCardTappedformana(id, card, tc, true);
|
return NEW TrCardTappedformana(id, card, tc, true,once);
|
||||||
|
|
||||||
//CombatTrigger
|
//CombatTrigger
|
||||||
//Card card attacked and is blocked
|
//Card card attacked and is blocked
|
||||||
@@ -531,63 +531,63 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string magicText, int
|
|||||||
|
|
||||||
//Card card is drawn
|
//Card card is drawn
|
||||||
if (TargetChooser * tc = parseSimpleTC(s, "drawn", card))
|
if (TargetChooser * tc = parseSimpleTC(s, "drawn", card))
|
||||||
return NEW TrcardDrawn(id, card, tc);
|
return NEW TrcardDrawn(id, card, tc,once);
|
||||||
|
|
||||||
//Card is sacrificed
|
//Card is sacrificed
|
||||||
if (TargetChooser * tc = parseSimpleTC(s, "sacrificed", card))
|
if (TargetChooser * tc = parseSimpleTC(s, "sacrificed", card))
|
||||||
return NEW TrCardSacrificed(id, card, tc);
|
return NEW TrCardSacrificed(id, card, tc,once);
|
||||||
|
|
||||||
//Card is Discarded
|
//Card is Discarded
|
||||||
if (TargetChooser * tc = parseSimpleTC(s, "discarded", card))
|
if (TargetChooser * tc = parseSimpleTC(s, "discarded", card))
|
||||||
return NEW TrCardDiscarded(id, card, tc);
|
return NEW TrCardDiscarded(id, card, tc,once);
|
||||||
|
|
||||||
//Card Damaging non combat
|
//Card Damaging non combat
|
||||||
if (TargetChooser * tc = parseSimpleTC(s, "noncombatdamaged", card))
|
if (TargetChooser * tc = parseSimpleTC(s, "noncombatdamaged", card))
|
||||||
{
|
{
|
||||||
TargetChooser *fromTc = parseSimpleTC(s, "from", card);
|
TargetChooser *fromTc = parseSimpleTC(s, "from", card);
|
||||||
return NEW TrDamaged(id, card, tc, fromTc, 2);
|
return NEW TrDamaged(id, card, tc, fromTc, 2,once);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Card Damaging combat
|
//Card Damaging combat
|
||||||
if (TargetChooser * tc = parseSimpleTC(s, "combatdamaged", card))
|
if (TargetChooser * tc = parseSimpleTC(s, "combatdamaged", card))
|
||||||
{
|
{
|
||||||
TargetChooser *fromTc = parseSimpleTC(s, "from", card);
|
TargetChooser *fromTc = parseSimpleTC(s, "from", card);
|
||||||
return NEW TrDamaged(id, card, tc, fromTc, 1,sourceUntapped,limitOnceATurn);
|
return NEW TrDamaged(id, card, tc, fromTc, 1,sourceUntapped,limitOnceATurn,once);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Card Damaging
|
//Card Damaging
|
||||||
if (TargetChooser * tc = parseSimpleTC(s, "damaged", card))
|
if (TargetChooser * tc = parseSimpleTC(s, "damaged", card))
|
||||||
{
|
{
|
||||||
TargetChooser *fromTc = parseSimpleTC(s, "from", card);
|
TargetChooser *fromTc = parseSimpleTC(s, "from", card);
|
||||||
return NEW TrDamaged(id, card, tc, fromTc, 0,sourceUntapped,limitOnceATurn);
|
return NEW TrDamaged(id, card, tc, fromTc, 0,sourceUntapped,limitOnceATurn,once);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Lifed
|
//Lifed
|
||||||
if (TargetChooser * tc = parseSimpleTC(s, "lifed", card))
|
if (TargetChooser * tc = parseSimpleTC(s, "lifed", card))
|
||||||
{
|
{
|
||||||
TargetChooser *fromTc = parseSimpleTC(s, "from", card);
|
TargetChooser *fromTc = parseSimpleTC(s, "from", card);
|
||||||
return NEW TrLifeGained(id, card, tc, fromTc, 0,sourceUntapped);
|
return NEW TrLifeGained(id, card, tc, fromTc, 0,sourceUntapped,once);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Life Loss
|
//Life Loss
|
||||||
if (TargetChooser * tc = parseSimpleTC(s, "lifeloss", card))
|
if (TargetChooser * tc = parseSimpleTC(s, "lifeloss", card))
|
||||||
{
|
{
|
||||||
TargetChooser *fromTc = parseSimpleTC(s, "from", card);
|
TargetChooser *fromTc = parseSimpleTC(s, "from", card);
|
||||||
return NEW TrLifeGained(id, card, tc, fromTc,1,sourceUntapped);
|
return NEW TrLifeGained(id, card, tc, fromTc,1,sourceUntapped,once);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Card Damaged and killed by a creature this turn
|
//Card Damaged and killed by a creature this turn
|
||||||
if (TargetChooser * tc = parseSimpleTC(s, "vampired", card))
|
if (TargetChooser * tc = parseSimpleTC(s, "vampired", card))
|
||||||
{
|
{
|
||||||
TargetChooser *fromTc = parseSimpleTC(s, "from", card);
|
TargetChooser *fromTc = parseSimpleTC(s, "from", card);
|
||||||
return NEW TrVampired(id, card, tc, fromTc);
|
return NEW TrVampired(id, card, tc, fromTc,once);
|
||||||
}
|
}
|
||||||
|
|
||||||
//when card becomes the target of a spell or ability
|
//when card becomes the target of a spell or ability
|
||||||
if (TargetChooser * tc = parseSimpleTC(s, "targeted", card))
|
if (TargetChooser * tc = parseSimpleTC(s, "targeted", card))
|
||||||
{
|
{
|
||||||
TargetChooser *fromTc = parseSimpleTC(s, "from", card);
|
TargetChooser *fromTc = parseSimpleTC(s, "from", card);
|
||||||
return NEW TrTargeted(id, card, tc, fromTc, 0);
|
return NEW TrTargeted(id, card, tc, fromTc, 0,once);
|
||||||
}
|
}
|
||||||
|
|
||||||
int who = 0;
|
int who = 0;
|
||||||
@@ -607,7 +607,7 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string magicText, int
|
|||||||
found = s.find(Constants::MTGPhaseCodeNames[i]);
|
found = s.find(Constants::MTGPhaseCodeNames[i]);
|
||||||
if (found != string::npos)
|
if (found != string::npos)
|
||||||
{
|
{
|
||||||
return NEW TriggerNextPhase(id, card, target, i, who,sourceUntapped);
|
return NEW TriggerNextPhase(id, card, target, i, who,sourceUntapped,once);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -621,7 +621,7 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string magicText, int
|
|||||||
found = s.find(Constants::MTGPhaseCodeNames[i]);
|
found = s.find(Constants::MTGPhaseCodeNames[i]);
|
||||||
if (found != string::npos)
|
if (found != string::npos)
|
||||||
{
|
{
|
||||||
return NEW TriggerAtPhase(id, card, target, i, who,sourceUntapped,sourceTap,lifelost,lifeamount);
|
return NEW TriggerAtPhase(id, card, target, i, who,sourceUntapped,sourceTap,lifelost,lifeamount,once);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3901,9 +3901,10 @@ ostream& ListMaintainerAbility::toString(ostream& out) const
|
|||||||
return MTGAbility::toString(out) << ")";
|
return MTGAbility::toString(out) << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
TriggerAtPhase::TriggerAtPhase(int id, MTGCardInstance * source, Targetable * target, int _phaseId, int who, bool sourceUntapped, bool sourceTap,bool lifelost,int lifeamount) :
|
TriggerAtPhase::TriggerAtPhase(int id, MTGCardInstance * source, Targetable * target, int _phaseId, int who, bool sourceUntapped, bool sourceTap,bool lifelost,int lifeamount,bool once) :
|
||||||
TriggeredAbility(id, source, target), phaseId(_phaseId), who(who), sourceUntapped(sourceUntapped), sourceTap(sourceTap),lifelost(lifelost),lifeamount(lifeamount)
|
TriggeredAbility(id, source, target), phaseId(_phaseId), who(who), sourceUntapped(sourceUntapped), sourceTap(sourceTap),lifelost(lifelost),lifeamount(lifeamount),once(once)
|
||||||
{
|
{
|
||||||
|
activeTrigger = true;
|
||||||
GameObserver * g = GameObserver::GetInstance();
|
GameObserver * g = GameObserver::GetInstance();
|
||||||
if (g)
|
if (g)
|
||||||
{
|
{
|
||||||
@@ -3914,6 +3915,7 @@ TriggerAtPhase::TriggerAtPhase(int id, MTGCardInstance * source, Targetable * ta
|
|||||||
|
|
||||||
int TriggerAtPhase::trigger()
|
int TriggerAtPhase::trigger()
|
||||||
{
|
{
|
||||||
|
if(!activeTrigger) return 0;
|
||||||
if(source->isPhased) return 0;
|
if(source->isPhased) return 0;
|
||||||
if(lifelost)
|
if(lifelost)
|
||||||
{
|
{
|
||||||
@@ -3959,6 +3961,8 @@ TriggerAtPhase::TriggerAtPhase(int id, MTGCardInstance * source, Targetable * ta
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(once && activeTrigger)
|
||||||
|
activeTrigger = false;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3969,10 +3973,11 @@ TriggerAtPhase* TriggerAtPhase::clone() const
|
|||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
TriggerNextPhase::TriggerNextPhase(int id, MTGCardInstance * source, Targetable * target, int _phaseId, int who,bool sourceUntapped, bool sourceTap) :
|
TriggerNextPhase::TriggerNextPhase(int id, MTGCardInstance * source, Targetable * target, int _phaseId, int who,bool sourceUntapped, bool sourceTap,bool once) :
|
||||||
TriggerAtPhase(id, source, target, _phaseId, who, sourceUntapped, sourceTap)
|
TriggerAtPhase(id, source, target, _phaseId, who, sourceUntapped, sourceTap, once)
|
||||||
{
|
{
|
||||||
destroyActivated = 0;
|
destroyActivated = 0;
|
||||||
|
activeTrigger = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int TriggerNextPhase::testDestroy()
|
int TriggerNextPhase::testDestroy()
|
||||||
|
|||||||
Reference in New Issue
Block a user