diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 125614e6a..9ded92b98 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -383,9 +383,12 @@ class TrCardAttackedBlocked: public TriggeredAbility public: TargetChooser * tc; TargetChooser * fromTc; - TrCardAttackedBlocked(int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL) : - TriggeredAbility(id, source), tc(tc), fromTc(fromTc) + bool limitOnceATurn; + int triggeredTurn; + TrCardAttackedBlocked(int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL,bool limitOnceATurn = false) : + TriggeredAbility(id, source), tc(tc), fromTc(fromTc),limitOnceATurn(limitOnceATurn) { + triggeredTurn = -1; } int resolve() @@ -398,10 +401,14 @@ public: if(source->isPhased) return 0; WEventCardAttackedBlocked * e = dynamic_cast (event); if (!e) return 0; + GameObserver * g = GameObserver::GetInstance(); + if (limitOnceATurn && triggeredTurn == g->turn) + return 0; if (e->card->didattacked < 1) return 0; if (!e->card->blocked) return 0; if (fromTc && !fromTc->canTarget(e->card->getNextOpponent())) return 0; if (!tc->canTarget(e->card)) return 0; + triggeredTurn = g->turn; return 1; } @@ -505,10 +512,13 @@ public: TargetChooser * fromTc; bool once; bool activeTrigger; - TrCardBlocked(int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL,bool once = false) : - TriggeredAbility(id, source), tc(tc), fromTc(fromTc), once(once) + bool limitOnceATurn; + int triggeredTurn; + TrCardBlocked(int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL,bool once = false,bool limitOnceATurn = false) : + TriggeredAbility(id, source), tc(tc), fromTc(fromTc), once(once),limitOnceATurn(limitOnceATurn) { - activeTrigger = true; + activeTrigger = true; + triggeredTurn = -1; } int resolve() @@ -523,11 +533,14 @@ public: if (!e) return 0; if(activeTrigger == false) return 0; - //if(e->card->didblocked < 1) return 0; + GameObserver * g = GameObserver::GetInstance(); + if (limitOnceATurn && triggeredTurn == g->turn) + return 0; if (fromTc && !fromTc->canTarget(e->card->getNextOpponent())) return 0; if (!tc->canTarget(e->card)) return 0; if(once && activeTrigger ) activeTrigger = false; + triggeredTurn = g->turn; return 1; } @@ -657,9 +670,12 @@ public: TargetChooser * fromTc; int type;//this allows damagenoncombat and combatdamage to share this trigger bool sourceUntapped; - TrDamaged(int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL, int type = 0,bool sourceUntapped = false) : - TriggeredAbility(id, source), tc(tc), fromTc(fromTc), type(type) , sourceUntapped(sourceUntapped) + bool limitOnceATurn; + int triggeredTurn; + TrDamaged(int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL, int type = 0,bool sourceUntapped = false,bool limitOnceATurn = false) : + TriggeredAbility(id, source), tc(tc), fromTc(fromTc), type(type) , sourceUntapped(sourceUntapped),limitOnceATurn(limitOnceATurn) { + triggeredTurn = -1; } int resolve() @@ -672,6 +688,9 @@ public: if(source->isPhased) return 0; WEventDamage * e = dynamic_cast (event); if (!e) return 0; + GameObserver * g = GameObserver::GetInstance(); + if (limitOnceATurn && triggeredTurn == g->turn) + return 0; if (sourceUntapped && source->isTapped() == 1) return 0; if (!tc->canTarget(e->damage->target)) return 0; @@ -680,6 +699,7 @@ public: if (type == 2 && e->damage->typeOfDamage == DAMAGE_COMBAT) return 0; e->damage->target->thatmuch = e->damage->damage; e->damage->source->thatmuch = e->damage->damage; + triggeredTurn = g->turn; return 1; } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index bbe853c65..098d2c9ef 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -314,6 +314,7 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string magicText, int bool opponentPoisoned = false; bool lifelost = false; int lifeamount = 0; + bool limitOnceATurn = false; found = s.find("once"); if (found != string::npos) { @@ -346,6 +347,12 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string magicText, int { opponentPoisoned = true; } + found = s.find("turnlimited"); + if ( found != string::npos) + { + limitOnceATurn = true; + } + //Card Changed Zone found = s.find("movedto("); if (found != string::npos) @@ -496,7 +503,7 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string magicText, int fromTc->targetter = NULL; } - return NEW TrCardAttackedBlocked(id, card, tc, fromTc); + return NEW TrCardAttackedBlocked(id, card, tc, fromTc,limitOnceATurn); } //Card card is a blocker @@ -519,7 +526,7 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string magicText, int fromTc->targetter = NULL; } - return NEW TrCardBlocked(id, card, tc, fromTc,once); + return NEW TrCardBlocked(id, card, tc, fromTc,once,limitOnceATurn); } //Card card is drawn @@ -602,7 +609,7 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string magicText, int fromTc = tcf.createTargetChooser(starget, card); fromTc->targetter = NULL; } - return NEW TrDamaged(id, card, tc, fromTc, 1); + return NEW TrDamaged(id, card, tc, fromTc, 1,sourceUntapped,limitOnceATurn); } //Card Damaging @@ -624,7 +631,7 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string magicText, int fromTc = tcf.createTargetChooser(starget, card); fromTc->targetter = NULL; } - return NEW TrDamaged(id, card, tc, fromTc, 0,sourceUntapped); + return NEW TrDamaged(id, card, tc, fromTc, 0,sourceUntapped,limitOnceATurn); } //Card Damaging