diff --git a/projects/mtg/bin/daily_build/template.exe b/projects/mtg/bin/daily_build/template.exe index a71691cb2..efc526403 100644 Binary files a/projects/mtg/bin/daily_build/template.exe and b/projects/mtg/bin/daily_build/template.exe differ diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index b08a4d1c1..367003827 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -400,6 +400,9 @@ class GenericActivatedAbility:public ActivatedAbility, public NestedAbility{ int resolve(){ counters++; + SAFE_DELETE(ability->cost); + ability->cost = abilityCost->Diff(cost); + SAFE_DELETE(abilityCost); ability->target = target; //may have been updated... if (ability) return ability->resolve(); return 0; @@ -1896,7 +1899,14 @@ public: int resolve(){ //TODO check if ability is oneShot ? - if (td->match(source) > 0){ + int match; + if (!td->compareAbility){ + match = td->match(source); + }else{ + match = td->match(this); + } + + if (match){ addAbilityToGame(); }else{ removeAbilityFromGame(); @@ -1961,7 +1971,12 @@ class AThisForEach:public MTGAbility, public NestedAbility{ int resolve(){ //TODO check if ability is oneShot ? - int matches = td->match(source); + int matches; + if (!td->compareAbility){ + matches = td->match(source); + }else{ + matches = td->match(this); + } if (matches > 0) { if (abilities.size()){ removeAbilityFromGame(); diff --git a/projects/mtg/include/CardPrimitive.h b/projects/mtg/include/CardPrimitive.h index 86f6d4e59..685b3234c 100644 --- a/projects/mtg/include/CardPrimitive.h +++ b/projects/mtg/include/CardPrimitive.h @@ -12,12 +12,12 @@ using namespace std; class CardPrimitive { protected: - ManaCost manaCost; vector ftdText; int init(); string lcname; public: + ManaCost manaCost; string text; string name; diff --git a/projects/mtg/include/MTGAbility.h b/projects/mtg/include/MTGAbility.h index b94bd9528..e6947cbe5 100644 --- a/projects/mtg/include/MTGAbility.h +++ b/projects/mtg/include/MTGAbility.h @@ -158,9 +158,11 @@ class ActivatedAbility:public MTGAbility{ CLEANUP = 56, AFTER_EOT = 57, }; + ManaCost * abilityCost; int restrictions; int needsTapping; ActivatedAbility(int id, MTGCardInstance * card,ManaCost * _cost = NULL, int _restrictions = NO_RESTRICTION,int tap = 1); + virtual ~ActivatedAbility(); virtual int reactToClick(MTGCardInstance * card); virtual int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL); virtual int reactToTargetClick(Targetable * object); diff --git a/projects/mtg/include/ThisDescriptor.h b/projects/mtg/include/ThisDescriptor.h index 007f8fdeb..0fe38b57d 100644 --- a/projects/mtg/include/ThisDescriptor.h +++ b/projects/mtg/include/ThisDescriptor.h @@ -12,9 +12,11 @@ class ThisDescriptor{ public: + int compareAbility; int comparisonMode; int comparisonCriterion; virtual int match(MTGCardInstance * card) = 0; + virtual int match(MTGAbility * ability) = 0; int matchValue(int value); }; @@ -27,6 +29,7 @@ class ThisCounter:public ThisDescriptor{ public: Counter * counter; virtual int match(MTGCardInstance * card); + virtual int match(MTGAbility * ability) {return 0;}; ThisCounter(Counter * _counter); ThisCounter(int power, int toughness, int nb, const char * name); ~ThisCounter(); @@ -35,19 +38,29 @@ class ThisCounter:public ThisDescriptor{ class ThisCounterAny:public ThisDescriptor{ public: virtual int match(MTGCardInstance *card); + virtual int match(MTGAbility * ability) {return 0;}; ThisCounterAny(int nb); }; class ThisPower:public ThisDescriptor{ public: virtual int match(MTGCardInstance * card); + virtual int match(MTGAbility * ability) {return 0;}; ThisPower(int power); }; class ThisToughness:public ThisDescriptor{ public: virtual int match(MTGCardInstance * card); + virtual int match(MTGAbility * ability) {return 0;}; ThisToughness(int toughness); }; +class ThisX:public ThisDescriptor{ + public: + virtual int match(MTGAbility * ability); + virtual int match(MTGCardInstance * card) {return 0;}; + ThisX(int x); +}; + #endif \ No newline at end of file diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 578ac0c46..ccf0176c2 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -1813,6 +1813,7 @@ NestedAbility::NestedAbility(MTGAbility * _ability){ ActivatedAbility::ActivatedAbility(int id, MTGCardInstance * card, ManaCost * _cost, int restrictions,int tap):MTGAbility(id,card), restrictions(restrictions), needsTapping(tap){ cost = _cost; + abilityCost = 0; } @@ -1856,13 +1857,17 @@ int ActivatedAbility::isReactingToClick(MTGCardInstance * card, ManaCost * mana) int ActivatedAbility::reactToClick(MTGCardInstance * card){ // if (cost) cost->setExtraCostsAction(this, card); if (!isReactingToClick(card)) return 0; + Player * player = game->currentlyActing(); if (cost){ if (!cost->isExtraPaymentSet()){ game->waitForExtraPayment = cost->extraCosts; return 0; } + ManaCost * previousManaPool = NEW ManaCost(player->getManaPool()); game->currentlyActing()->getManaPool()->pay(cost); cost->doPayExtra(); + abilityCost = previousManaPool->Diff(player->getManaPool()); + delete previousManaPool; } if (needsTapping && source->isInPlay()) source->tap(); fireAbility(); @@ -1873,14 +1878,18 @@ int ActivatedAbility::reactToClick(MTGCardInstance * card){ int ActivatedAbility::reactToTargetClick(Targetable * object){ if (!isReactingToTargetClick(object)) return 0; + Player * player = game->currentlyActing(); if (cost){ if (object->typeAsTarget() == TARGET_CARD) cost->setExtraCostsAction(this, (MTGCardInstance *) object); if (!cost->isExtraPaymentSet()){ game->waitForExtraPayment = cost->extraCosts; return 0; } + ManaCost * previousManaPool = NEW ManaCost(player->getManaPool()); game->currentlyActing()->getManaPool()->pay(cost); cost->doPayExtra(); + abilityCost = previousManaPool->Diff(player->getManaPool()); + delete previousManaPool; } if (needsTapping && source->isInPlay()) source->tap(); fireAbility(); @@ -1888,6 +1897,12 @@ int ActivatedAbility::reactToTargetClick(Targetable * object){ } +ActivatedAbility::~ActivatedAbility(){ + if (!isClone){ + SAFE_DELETE(abilityCost); + } +} + ostream& ActivatedAbility::toString(ostream& out) const { out << "ActivatedAbility ::: restrictions : " << restrictions diff --git a/projects/mtg/src/ThisDescriptor.cpp b/projects/mtg/src/ThisDescriptor.cpp index 7265259b0..316c534df 100644 --- a/projects/mtg/src/ThisDescriptor.cpp +++ b/projects/mtg/src/ThisDescriptor.cpp @@ -144,15 +144,28 @@ ThisDescriptor * ThisDescriptorFactory::createThisDescriptor(string s){ return NULL; } + // X + found = s.find("x"); + if (found != string::npos) { + ThisX * td = NEW ThisX(criterion); + if (td){ + td->comparisonMode = mode; + return td; + } + return NULL; + } + return NULL; } ThisCounter::ThisCounter(Counter * _counter){ + compareAbility = 0; counter = _counter; comparisonCriterion = counter->nb; } ThisCounter::ThisCounter(int power, int toughness, int nb, const char * name){ + compareAbility = 0; counter = NEW Counter(NULL,name,power,toughness); comparisonCriterion = nb; } @@ -184,6 +197,7 @@ ThisCounter::~ThisCounter() { } ThisPower::ThisPower(int power){ + compareAbility = 0; comparisonCriterion = power; } @@ -192,6 +206,7 @@ int ThisPower::match(MTGCardInstance * card){ } ThisToughness::ThisToughness(int toughness){ + compareAbility = 0; comparisonCriterion = toughness; } @@ -200,6 +215,7 @@ int ThisToughness::match(MTGCardInstance * card){ } ThisCounterAny::ThisCounterAny(int nb){ + compareAbility = 0; comparisonCriterion = nb; } @@ -209,4 +225,13 @@ int ThisCounterAny::match(MTGCardInstance * card){ result += card->counters->counters[i]->nb; } return matchValue(result); +} + +ThisX::ThisX(int x){ + comparisonCriterion = x; + compareAbility = 1; +} + +int ThisX::match(MTGAbility * ability){ + return matchValue(ability->cost->hasX()); } \ No newline at end of file