diff --git a/projects/mtg/include/ManaCost.h b/projects/mtg/include/ManaCost.h index 5be369854..756cd5b5e 100644 --- a/projects/mtg/include/ManaCost.h +++ b/projects/mtg/include/ManaCost.h @@ -77,6 +77,7 @@ public: // Extra Costs (sacrifice,counters...) // int addExtraCost(ExtraCost * _cost); + int addExtraCosts(ExtraCosts *_cost); int setExtraCostsAction(MTGAbility * action, MTGCardInstance * card); int isExtraPaymentSet(); int canPayExtra(); diff --git a/projects/mtg/include/ThisDescriptor.h b/projects/mtg/include/ThisDescriptor.h index 7dc869b81..19125ad1e 100644 --- a/projects/mtg/include/ThisDescriptor.h +++ b/projects/mtg/include/ThisDescriptor.h @@ -25,6 +25,15 @@ public: ThisDescriptor * createThisDescriptor(GameObserver* observer, string s); }; +class ThisTargetCompare:public ThisDescriptor{ + public: + TargetChooser * targetComp; + virtual int match(MTGCardInstance * card); + ThisTargetCompare(TargetChooser * tcc = NULL); + ~ThisTargetCompare(); + ThisTargetCompare * clone() const; +}; + class ThisCounter:public ThisDescriptor{ public: Counter * counter; diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index d0ba169c9..15e748475 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1019,6 +1019,7 @@ InstantAbility(observer, id, card, _target),flipStats(flipStats) int AAFlip::resolve() { MTGCardInstance * Flipper = (MTGCardInstance*)source; + this->oneShot = true; if(Flipper->isFlipped) { game->removeObserver(this); @@ -3569,6 +3570,7 @@ void AUpkeep::Update(float dt) for(int age = 0;age < currentage;age++) { this->getCost()->add(backupMana); + this->getCost()->addExtraCosts(backupMana->extraCosts); } } } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 9167b6c94..e422452e4 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2220,7 +2220,6 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG flipStats = splitFlipStat[1]; } MTGAbility * a = NEW AAFlip(observer, id, card, target,flipStats); - a->oneShot = 1; return a; } diff --git a/projects/mtg/src/ManaCost.cpp b/projects/mtg/src/ManaCost.cpp index 088947f28..3a06af2fd 100644 --- a/projects/mtg/src/ManaCost.cpp +++ b/projects/mtg/src/ManaCost.cpp @@ -600,6 +600,15 @@ int ManaCost::addExtraCost(ExtraCost * _cost) return 1; } +int ManaCost::addExtraCosts(ExtraCosts *_ecost) +{ + if (!extraCosts) + extraCosts = NEW ExtraCosts(); + for(size_t i = 0; i < _ecost->costs.size(); i++) + extraCosts->costs.push_back(_ecost->costs[i]->clone()); + return 1; +} + int ManaCost::isExtraPaymentSet() { if (!extraCosts) diff --git a/projects/mtg/src/ThisDescriptor.cpp b/projects/mtg/src/ThisDescriptor.cpp index 1167225d9..d5ea153d1 100644 --- a/projects/mtg/src/ThisDescriptor.cpp +++ b/projects/mtg/src/ThisDescriptor.cpp @@ -4,6 +4,7 @@ #include "Counters.h" #include "MTGCardInstance.h" #include "CardDescriptor.h" +#include "AllAbilities.h" ThisDescriptor::~ThisDescriptor() { @@ -330,10 +331,46 @@ ThisDescriptor * ThisDescriptorFactory::createThisDescriptor(GameObserver* obser } return NULL; } + vectorsplitTargetComparison = parseBetween(s,"cantargetcard(",")",false); + if (splitTargetComparison.size()) + { + TargetChooserFactory tf(observer); + TargetChooser * tcc = tf.createTargetChooser(splitTargetComparison[1],NULL); + ThisTargetCompare * td = NEW ThisTargetCompare(tcc); + if (td) + { + return td; + } + return NULL; + } return NULL; } +ThisTargetCompare::ThisTargetCompare(TargetChooser * _tcc) +{ + targetComp = _tcc; +} + +int ThisTargetCompare::match(MTGCardInstance * card) +{ + if(targetComp->canTarget(card)) + return 1; + return 0; +} + +ThisTargetCompare::~ThisTargetCompare() +{ + SAFE_DELETE(targetComp); +} + +ThisTargetCompare* ThisTargetCompare::clone() const +{ + ThisTargetCompare * a = NEW ThisTargetCompare(*this); + + return a; +} + ThisCounter::ThisCounter(Counter * _counter) { counter = _counter;