diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index d839df687..433dafa6b 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -55,7 +55,7 @@ public: Pos* view; int X; int castX; - int alternateCostPaid[ManaCost::MANA_PAID_WITH_RETRACE + 1]; + int alternateCostPaid[ManaCost::MANA_PAID_WITH_SUSPEND + 1]; int paymenttype; int castMethod; /* Tells if the card reached its current zone by being cast or not (brought into the zone by an effect). non 0 == cast, 0 == not cast */ int frozen; diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index 759a3ab41..0be3b2105 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -260,6 +260,12 @@ bool Spell::FullfilledAlternateCost(const int &costType) switch (costType) { + case ManaCost::MANA_UNPAID: + hasFullfilledAlternateCost = (payResult == ManaCost::MANA_UNPAID); + break; + case ManaCost::MANA_PAID: + hasFullfilledAlternateCost = (payResult == ManaCost::MANA_PAID); + break; case ManaCost::MANA_PAID_WITH_KICKER: hasFullfilledAlternateCost = (payResult == ManaCost::MANA_PAID_WITH_KICKER); break; @@ -275,6 +281,9 @@ bool Spell::FullfilledAlternateCost(const int &costType) case ManaCost::MANA_PAID_WITH_RETRACE: hasFullfilledAlternateCost = (payResult == ManaCost::MANA_PAID_WITH_RETRACE); break; + case ManaCost::MANA_PAID_WITH_SUSPEND: + hasFullfilledAlternateCost = (payResult == ManaCost::MANA_PAID_WITH_RETRACE); + break; } return hasFullfilledAlternateCost; diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 5abc19164..c1e406780 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -29,10 +29,29 @@ const int kMaxCastZones[] = { MTGGameZone::BATTLEFIELD, MTGGameZone::STACK}; const size_t kMaxCastKeywordsCount = 2; //Used for alternate Costs parsing -const string kAlternateCostKeywords[] = { "kicker", "retrace", "alternative", "buyback", "flashback", "facedown"}; -const int kAlternateCostIds[] = { - ManaCost::MANA_PAID_WITH_KICKER, ManaCost::MANA_PAID_WITH_RETRACE, ManaCost::MANA_PAID_WITH_ALTERNATIVE, - ManaCost::MANA_PAID_WITH_BUYBACK, ManaCost::MANA_PAID_WITH_FLASHBACK, ManaCost::MANA_PAID_WITH_MORPH +const string kAlternateCostKeywords[] = +{ + "notpaid", + "paidmana", + "kicker", + "alternative", + "buyback", + "flashback", + "retrace", + "facedown", + "suspended" +}; +const int kAlternateCostIds[] = +{ + ManaCost::MANA_UNPAID, + ManaCost::MANA_PAID, + ManaCost::MANA_PAID_WITH_KICKER, + ManaCost::MANA_PAID_WITH_ALTERNATIVE, + ManaCost::MANA_PAID_WITH_BUYBACK, + ManaCost::MANA_PAID_WITH_FLASHBACK, + ManaCost::MANA_PAID_WITH_RETRACE, + ManaCost::MANA_PAID_WITH_MORPH, + ManaCost::MANA_PAID_WITH_SUSPEND }; //Used for "dynamic ability" parsing @@ -353,6 +372,26 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe { restriction.push_back("type(creature|mybattlefield)~lessthan~type(creature|opponentbattlefield)"); } + + check = restriction[i].find("paid("); + if(check != string::npos) + { + vectorgetPaid = parseBetween(restriction[i].c_str(),"paid(",")"); + string paid = getPaid[1]; + + for (size_t j = 0; j < sizeof(kAlternateCostIds)/sizeof(kAlternateCostIds[0]); ++j) + { + string keyword = kAlternateCostKeywords[j]; + if (paid.find(keyword) != string::npos) + { + if (!(card->alternateCostPaid[j] > 0 )) + { + return 0; + } + } + } + + } } return 1; } diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 5bada3877..7e5c23ebc 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -171,7 +171,7 @@ void MTGCardInstance::initMTGCI() storedSourceCard = NULL; myPair = NULL; - for (int i = 0; i < ManaCost::MANA_PAID_WITH_RETRACE +1; i++) + for (int i = 0; i < ManaCost::MANA_PAID_WITH_SUSPEND +1; i++) alternateCostPaid[i] = 0; paymenttype = MTGAbility::PUT_INTO_PLAY; diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index d0db2d3e1..5322429bd 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -476,6 +476,8 @@ MTGCardInstance * MTGGameZone::removeCard(MTGCardInstance * card, int createCopy copy->kicked = card->kicked; copy->storedCard = card->storedCard; copy->storedSourceCard = card->storedSourceCard; + for (int i = 0; i < ManaCost::MANA_PAID_WITH_SUSPEND +1; i++) + copy->alternateCostPaid[i] = card->alternateCostPaid[i]; //stupid bug with tokens... if (card->model == card)