From 2ae0a651b856db7cddfd47e845b5343fb5c86590 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 5 Jun 2016 17:58:49 +0800 Subject: [PATCH 1/7] Cloner/Copier produces same tokens as the copied cards --- projects/mtg/src/MTGCardInstance.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index a60fdd421..338e22057 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -118,7 +118,9 @@ void MTGCardInstance::copy(MTGCardInstance * card) AbilityFactory af(observer); af.addAbilities(observer->mLayers->actionLayer()->getMaxId(), spell); delete spell; - mtgid = backupid; + mtgid = card->getMTGId(); /////////////////////////////////////////////////// + setId = card->setId; // Copier/Cloner cards produces the same token...// + rarity = card->getRarity(); /////////////////////////////////////////////////// castMethod = castMethodBackUP; backupTargets = this->backupTargets; storedCard = oldStored; From 7ae8434ba370e59fd10eeea2a3f0dedf0ceb1c1c Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 5 Jun 2016 20:32:33 +0800 Subject: [PATCH 2/7] Correction --- projects/mtg/src/AllAbilities.cpp | 2 +- projects/mtg/src/MTGCardInstance.cpp | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 3d86feaef..510ebf25b 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -479,7 +479,7 @@ int AACopier::resolve() MTGCardInstance * myClone = NEW MTGCardInstance(clone, source->controller()->game); source->copy(myClone); source->isACopier = true; - source->copiedID = _target->copiedID; + source->copiedID = _target->getMTGId(); source->modifiedbAbi = _target->modifiedbAbi; source->origbasicAbilities = _target->origbasicAbilities; if(_target->isMorphed) diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 338e22057..af2913ebb 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -118,9 +118,14 @@ void MTGCardInstance::copy(MTGCardInstance * card) AbilityFactory af(observer); af.addAbilities(observer->mLayers->actionLayer()->getMaxId(), spell); delete spell; - mtgid = card->getMTGId(); /////////////////////////////////////////////////// - setId = card->setId; // Copier/Cloner cards produces the same token...// - rarity = card->getRarity(); /////////////////////////////////////////////////// + if(observer->players[1]->playMode == Player::MODE_TEST_SUITE) + mtgid = backupid; // there must be a way to get the token id... + else + { + mtgid = card->getMTGId(); /////////////////////////////////////////////////// + setId = card->setId; // Copier/Cloner cards produces the same token...// + rarity = card->getRarity(); /////////////////////////////////////////////////// + } castMethod = castMethodBackUP; backupTargets = this->backupTargets; storedCard = oldStored; From fb132173bd0812c3f0fe4b5a66b8aea43059d5ce Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 5 Jun 2016 20:34:39 +0800 Subject: [PATCH 3/7] Kicker TODO: Auto kicker and Affinity in Kicker.... --- projects/mtg/src/MTGRules.cpp | 97 +++++++++++++++++++++++++++-------- 1 file changed, 76 insertions(+), 21 deletions(-) diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index a148c262b..d6e205d90 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -488,18 +488,44 @@ int MTGKickerRule::isReactingToClick(MTGCardInstance * card, ManaCost *) return 0; } ManaCost * playerMana = player->getManaPool(); - ManaCost * withKickerCost= NEW ManaCost(card->model->data->getManaCost()); - if(card->getIncreasedManaCost()->getConvertedCost()) - withKickerCost->add(card->getIncreasedManaCost()); - if(card->getReducedManaCost()->getConvertedCost()) - withKickerCost->remove(card->getReducedManaCost()); - withKickerCost->add(card->model->data->getManaCost()->getKicker()); - if(!playerMana->canAfford(withKickerCost)) + ManaCost * mainCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()),card->getManaCost()); + if(mainCost->extraCosts) + for(unsigned int i = 0; i < mainCost->extraCosts->costs.size();i++) + { + mainCost->extraCosts->costs[i]->setSource(card); + } + //compute leftover/unused reducer cost (todo affinity) + int leftoverC = ((card->getReducedManaCost()->getCost(0) + card->getReducedManaCost()->getCost(6)) - (card->getManaCost()->getCost(0) + card->getManaCost()->getCost(6) + card->getIncreasedManaCost()->getCost(0) + card->getIncreasedManaCost()->getCost(6))); + int leftoverG = (card->getReducedManaCost()->getCost(1)) - (card->getManaCost()->getCost(1) + card->getIncreasedManaCost()->getCost(1)); + int leftoverU = (card->getReducedManaCost()->getCost(2)) - (card->getManaCost()->getCost(2) + card->getIncreasedManaCost()->getCost(2)); + int leftoverR = (card->getReducedManaCost()->getCost(3)) - (card->getManaCost()->getCost(3) + card->getIncreasedManaCost()->getCost(3)); + int leftoverB = (card->getReducedManaCost()->getCost(4)) - (card->getManaCost()->getCost(4) + card->getIncreasedManaCost()->getCost(4)); + int leftoverW = (card->getReducedManaCost()->getCost(5)) - (card->getManaCost()->getCost(5) + card->getIncreasedManaCost()->getCost(5)); + + ManaCost * withKickerCost= NEW ManaCost(card->model->data->getManaCost()->getKicker()); + + if (leftoverC) + withKickerCost->remove(0,leftoverC); + if (leftoverG) + withKickerCost->remove(1,leftoverG); + if (leftoverU) + withKickerCost->remove(2,leftoverU); + if (leftoverR) + withKickerCost->remove(3,leftoverR); + if (leftoverB) + withKickerCost->remove(4,leftoverB); + if (leftoverW) + withKickerCost->remove(5,leftoverW); + + mainCost->add(withKickerCost); + if(!playerMana->canAfford(mainCost)) { delete withKickerCost; + delete mainCost; return 0; } delete withKickerCost; + delete mainCost; return 1; @@ -511,16 +537,42 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card) return 0; Player * player = game->currentlyActing(); - ManaCost * withKickerCost= NEW ManaCost(card->model->data->getManaCost());//using pointers here alters the real cost of the card. - if(card->getIncreasedManaCost()->getConvertedCost()) - withKickerCost->add(card->getIncreasedManaCost()); - if(card->getReducedManaCost()->getConvertedCost()) - withKickerCost->remove(card->getReducedManaCost()); + ManaCost * mainCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()),card->getManaCost()); + if(mainCost->extraCosts) + for(unsigned int i = 0; i < mainCost->extraCosts->costs.size();i++) + { + mainCost->extraCosts->costs[i]->setSource(card); + } + //compute leftover/unused reducer cost (todo affinity) + int leftoverC = ((card->getReducedManaCost()->getCost(0) + card->getReducedManaCost()->getCost(6)) - (card->getManaCost()->getCost(0) + card->getManaCost()->getCost(6) + card->getIncreasedManaCost()->getCost(0) + card->getIncreasedManaCost()->getCost(6))); + int leftoverG = (card->getReducedManaCost()->getCost(1)) - (card->getManaCost()->getCost(1) + card->getIncreasedManaCost()->getCost(1)); + int leftoverU = (card->getReducedManaCost()->getCost(2)) - (card->getManaCost()->getCost(2) + card->getIncreasedManaCost()->getCost(2)); + int leftoverR = (card->getReducedManaCost()->getCost(3)) - (card->getManaCost()->getCost(3) + card->getIncreasedManaCost()->getCost(3)); + int leftoverB = (card->getReducedManaCost()->getCost(4)) - (card->getManaCost()->getCost(4) + card->getIncreasedManaCost()->getCost(4)); + int leftoverW = (card->getReducedManaCost()->getCost(5)) - (card->getManaCost()->getCost(5) + card->getIncreasedManaCost()->getCost(5)); + + ManaCost * withKickerCost= NEW ManaCost(card->model->data->getManaCost()->getKicker()); + + if (leftoverC) + withKickerCost->remove(0,leftoverC); + if (leftoverG) + withKickerCost->remove(1,leftoverG); + if (leftoverU) + withKickerCost->remove(2,leftoverU); + if (leftoverR) + withKickerCost->remove(3,leftoverR); + if (leftoverB) + withKickerCost->remove(4,leftoverB); + if (leftoverW) + withKickerCost->remove(5,leftoverW); + + if (card->model->data->getManaCost()->getKicker()->isMulti) { - while(player->getManaPool()->canAfford(withKickerCost)) + mainCost->add(withKickerCost); + while(player->getManaPool()->canAfford(mainCost)) { - withKickerCost->add(card->model->data->getManaCost()->getKicker()); + mainCost->add(withKickerCost); card->kicked += 1; } card->kicked -= 1; @@ -530,29 +582,32 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card) } else { - withKickerCost->add(card->model->data->getManaCost()->getKicker()); + mainCost->add(withKickerCost); card->paymenttype = MTGAbility::PUT_INTO_PLAY_WITH_KICKER; } - if (withKickerCost->isExtraPaymentSet()) + if (mainCost->isExtraPaymentSet()) { if (!game->targetListIsSet(card)) { - delete withKickerCost; + delete mainCost; + delete withKickerCost; return 0; } } else { - withKickerCost->setExtraCostsAction(this, card); - game->mExtraPayment = withKickerCost->extraCosts; + mainCost->setExtraCostsAction(this, card); + game->mExtraPayment = mainCost->extraCosts; + delete mainCost; delete withKickerCost; return 0; } ManaCost * previousManaPool = NEW ManaCost(player->getManaPool()); - player->getManaPool()->pay(withKickerCost); - withKickerCost->doPayExtra(); + player->getManaPool()->pay(mainCost); + mainCost->doPayExtra(); ManaCost * spellCost = previousManaPool->Diff(player->getManaPool()); + delete mainCost; delete withKickerCost; delete previousManaPool; if (card->isLand()) From ecd4de48eb3c842ed544da1c91fb2c7d2f731037 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 6 Jun 2016 11:11:45 +0800 Subject: [PATCH 4/7] Apex Hawks is a 2/2 Flyer ![Apex Hawks](http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=382214&type=card) --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 1129e3e3a..41bf2db05 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -3665,8 +3665,8 @@ text=Multikicker (You may pay an additional any number of times as you cast thi type=Creature subtype=Bird mana={2}{W} -power=1 -toughness=1 +power=2 +toughness=2 [/card] [card] name=Aphetto Alchemist From 873db7ef27bd47054acfefcb7212bd1bac0c5e66 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 6 Jun 2016 11:16:32 +0800 Subject: [PATCH 5/7] Revised Kicker --- projects/mtg/src/MTGGameZones.cpp | 6 ++ projects/mtg/src/MTGRules.cpp | 138 ++++++++++-------------------- 2 files changed, 50 insertions(+), 94 deletions(-) diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index 736c68e00..e39625247 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -375,6 +375,12 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone { copy->miracle = true; } + if(from == g->players[0]->game->battlefield || from == g->players[1]->game->battlefield) + if(to != g->players[0]->game->battlefield || to != g->players[1]->game->battlefield) + { + card->kicked = 0; + copy->kicked = 0;//kicked reset everflowing chalice... + } if (card->discarded) {//set discarded for madness... if(from == g->players[0]->game->hand || from == g->players[1]->game->hand) diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index d6e205d90..ccb29536e 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -477,138 +477,88 @@ int MTGKickerRule::isReactingToClick(MTGCardInstance * card, ManaCost *) if(OptionKicker::KICKER_ALWAYS == options[Options::KICKERPAYMENT].number) return 0; Player * player = game->currentlyActing(); - if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card)) - return 0; - if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) - return 0; - ManaCost * kicker = card->getManaCost()->getKicker(); - if(!kicker) - { - SAFE_DELETE(kicker); + if(!player->game->hand->hasCard(card)) + return 0; + if(!card->getManaCost()->getKicker()) return 0; - } - ManaCost * playerMana = player->getManaPool(); - ManaCost * mainCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()),card->getManaCost()); - if(mainCost->extraCosts) - for(unsigned int i = 0; i < mainCost->extraCosts->costs.size();i++) - { - mainCost->extraCosts->costs[i]->setSource(card); - } - //compute leftover/unused reducer cost (todo affinity) - int leftoverC = ((card->getReducedManaCost()->getCost(0) + card->getReducedManaCost()->getCost(6)) - (card->getManaCost()->getCost(0) + card->getManaCost()->getCost(6) + card->getIncreasedManaCost()->getCost(0) + card->getIncreasedManaCost()->getCost(6))); - int leftoverG = (card->getReducedManaCost()->getCost(1)) - (card->getManaCost()->getCost(1) + card->getIncreasedManaCost()->getCost(1)); - int leftoverU = (card->getReducedManaCost()->getCost(2)) - (card->getManaCost()->getCost(2) + card->getIncreasedManaCost()->getCost(2)); - int leftoverR = (card->getReducedManaCost()->getCost(3)) - (card->getManaCost()->getCost(3) + card->getIncreasedManaCost()->getCost(3)); - int leftoverB = (card->getReducedManaCost()->getCost(4)) - (card->getManaCost()->getCost(4) + card->getIncreasedManaCost()->getCost(4)); - int leftoverW = (card->getReducedManaCost()->getCost(5)) - (card->getManaCost()->getCost(5) + card->getIncreasedManaCost()->getCost(5)); - - ManaCost * withKickerCost= NEW ManaCost(card->model->data->getManaCost()->getKicker()); - if (leftoverC) - withKickerCost->remove(0,leftoverC); - if (leftoverG) - withKickerCost->remove(1,leftoverG); - if (leftoverU) - withKickerCost->remove(2,leftoverU); - if (leftoverR) - withKickerCost->remove(3,leftoverR); - if (leftoverB) - withKickerCost->remove(4,leftoverB); - if (leftoverW) - withKickerCost->remove(5,leftoverW); - - mainCost->add(withKickerCost); - if(!playerMana->canAfford(mainCost)) + ManaCost * withKickerCost= NEW ManaCost(card->getManaCost()); + withKickerCost->add(card->getManaCost()->getKicker()); + if(withKickerCost->extraCosts) + for(unsigned int i = 0; i < withKickerCost->extraCosts->costs.size();i++) + { + withKickerCost->extraCosts->costs[i]->setSource(card); + } + if(!player->getManaPool()->canAfford(withKickerCost)) { - delete withKickerCost; - delete mainCost; + SAFE_DELETE(withKickerCost); return 0; } - delete withKickerCost; - delete mainCost; - - + SAFE_DELETE(withKickerCost); return 1; } int MTGKickerRule::reactToClick(MTGCardInstance * card) { - if(!isReactingToClick(card, NULL)) + if(!isReactingToClick(card)) return 0; Player * player = game->currentlyActing(); - ManaCost * mainCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()),card->getManaCost()); - if(mainCost->extraCosts) - for(unsigned int i = 0; i < mainCost->extraCosts->costs.size();i++) + ManaCost * withKickerCost= card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()),card->getManaCost(), true); + withKickerCost->add(withKickerCost->getKicker());//after getting base cost add the kicker cost... todo reduction... + if(withKickerCost->extraCosts) + for(unsigned int i = 0; i < withKickerCost->extraCosts->costs.size();i++) { - mainCost->extraCosts->costs[i]->setSource(card); + withKickerCost->extraCosts->costs[i]->setSource(card); } - //compute leftover/unused reducer cost (todo affinity) - int leftoverC = ((card->getReducedManaCost()->getCost(0) + card->getReducedManaCost()->getCost(6)) - (card->getManaCost()->getCost(0) + card->getManaCost()->getCost(6) + card->getIncreasedManaCost()->getCost(0) + card->getIncreasedManaCost()->getCost(6))); - int leftoverG = (card->getReducedManaCost()->getCost(1)) - (card->getManaCost()->getCost(1) + card->getIncreasedManaCost()->getCost(1)); - int leftoverU = (card->getReducedManaCost()->getCost(2)) - (card->getManaCost()->getCost(2) + card->getIncreasedManaCost()->getCost(2)); - int leftoverR = (card->getReducedManaCost()->getCost(3)) - (card->getManaCost()->getCost(3) + card->getIncreasedManaCost()->getCost(3)); - int leftoverB = (card->getReducedManaCost()->getCost(4)) - (card->getManaCost()->getCost(4) + card->getIncreasedManaCost()->getCost(4)); - int leftoverW = (card->getReducedManaCost()->getCost(5)) - (card->getManaCost()->getCost(5) + card->getIncreasedManaCost()->getCost(5)); - - ManaCost * withKickerCost= NEW ManaCost(card->model->data->getManaCost()->getKicker()); - if (leftoverC) - withKickerCost->remove(0,leftoverC); - if (leftoverG) - withKickerCost->remove(1,leftoverG); - if (leftoverU) - withKickerCost->remove(2,leftoverU); - if (leftoverR) - withKickerCost->remove(3,leftoverR); - if (leftoverB) - withKickerCost->remove(4,leftoverB); - if (leftoverW) - withKickerCost->remove(5,leftoverW); - - - if (card->model->data->getManaCost()->getKicker()->isMulti) + if (card->getManaCost()->getKicker()->isMulti) { - mainCost->add(withKickerCost); - while(player->getManaPool()->canAfford(mainCost)) + int possiblemana = player->getManaPool()->getConvertedCost(); + int kickercost = card->getManaCost()->getKicker()->getConvertedCost(); + int counter = possiblemana/kickercost; + //excess cost reducer must be here... TODO.... revised because using while loop has a bug... check the everflowing chalice test... + if(counter) { - mainCost->add(withKickerCost); - card->kicked += 1; + for(int i = 0; i < counter; i++) + { + if(player->getManaPool()->canAfford(withKickerCost)) + { + card->kicked++; + withKickerCost->add(withKickerCost->getKicker()); + } + } + card->paymenttype = MTGAbility::PUT_INTO_PLAY_WITH_KICKER; } - card->kicked -= 1; - //for(int i = 0;i < card->kicked;i++) - //player->getManaPool()->pay(card->getManaCost()->kicker); - card->paymenttype = MTGAbility::PUT_INTO_PLAY_WITH_KICKER; } else { - mainCost->add(withKickerCost); + withKickerCost->add(withKickerCost->getKicker()); card->paymenttype = MTGAbility::PUT_INTO_PLAY_WITH_KICKER; } - if (mainCost->isExtraPaymentSet()) + + if (withKickerCost->isExtraPaymentSet()) { if (!game->targetListIsSet(card)) { - delete mainCost; - delete withKickerCost; + SAFE_DELETE(withKickerCost); return 0; } } else { - mainCost->setExtraCostsAction(this, card); - game->mExtraPayment = mainCost->extraCosts; - delete mainCost; - delete withKickerCost; + withKickerCost->setExtraCostsAction(this, card); + game->mExtraPayment = withKickerCost->extraCosts; + SAFE_DELETE(withKickerCost); return 0; } ManaCost * previousManaPool = NEW ManaCost(player->getManaPool()); - player->getManaPool()->pay(mainCost); - mainCost->doPayExtra(); + player->getManaPool()->pay(withKickerCost); + withKickerCost->doPayExtra(); ManaCost * spellCost = previousManaPool->Diff(player->getManaPool()); - delete mainCost; delete withKickerCost; + delete previousManaPool; if (card->isLand()) { From 0376d094cc8f28801fc1dd77950ee00f4d56bed4 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 6 Jun 2016 11:19:30 +0800 Subject: [PATCH 6/7] Apex Hawks is 2/2 Flyer So it enters with two +1/+1 making it a 4/4 Flyer... --- projects/mtg/bin/Res/test/Apex_Hawks_MULTIKICKER.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/projects/mtg/bin/Res/test/Apex_Hawks_MULTIKICKER.txt b/projects/mtg/bin/Res/test/Apex_Hawks_MULTIKICKER.txt index 924580c8f..b7e557932 100644 --- a/projects/mtg/bin/Res/test/Apex_Hawks_MULTIKICKER.txt +++ b/projects/mtg/bin/Res/test/Apex_Hawks_MULTIKICKER.txt @@ -9,7 +9,10 @@ manapool:{W}{W}{W}{W}{W}{W}{W} [PLAYER2] life:20 [DO] +#apex hawks is {2}{W} so the mana remaining will be {W}{W}{W}{W} Apex Hawks +#apex hawks has {1}{W} multikicker so we can afford {2}{W}{W} since our mana is {W}{W}{W}{W} +#it will come with two +1/+1 counters making it 1 4/4 Flyer choice 1 next next @@ -22,5 +25,6 @@ COMBATDAMAGE inplay:Apex Hawks,Fervor manapool:{0} [PLAYER2] -life:17 -[END] \ No newline at end of file +#life must be 16 not 17.....(20 - 4) +life:16 +[END] From 1faf2e069420196a8588cb1c75865f855fab71c9 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 6 Jun 2016 17:01:21 +0800 Subject: [PATCH 7/7] Cleanup --- projects/mtg/src/MTGRules.cpp | 115 +++++++++++++++++----------------- 1 file changed, 56 insertions(+), 59 deletions(-) diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index ccb29536e..85231f7b3 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -477,93 +477,90 @@ int MTGKickerRule::isReactingToClick(MTGCardInstance * card, ManaCost *) if(OptionKicker::KICKER_ALWAYS == options[Options::KICKERPAYMENT].number) return 0; Player * player = game->currentlyActing(); - if(!player->game->hand->hasCard(card)) + if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card)) + return 0; + if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) + return 0; + if(!allowedToCast(card,player)) return 0; if(!card->getManaCost()->getKicker()) return 0; - ManaCost * withKickerCost= NEW ManaCost(card->getManaCost()); - withKickerCost->add(card->getManaCost()->getKicker()); - if(withKickerCost->extraCosts) - for(unsigned int i = 0; i < withKickerCost->extraCosts->costs.size();i++) - { - withKickerCost->extraCosts->costs[i]->setSource(card); - } - if(!player->getManaPool()->canAfford(withKickerCost)) + if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || (card->StackIsEmptyandSorcerySpeed())) { - SAFE_DELETE(withKickerCost); - return 0; + if(card->controller()->epic) + return 0; + + if (card->controller()->game->playRestrictions->canPutIntoZone(card, game->currentActionPlayer->game->stack) == PlayRestriction::CANT_PLAY) + return 0; + ManaCost * playerMana = player->getManaPool(); + ManaCost * withKickerCost= NEW ManaCost(card->getManaCost()); + withKickerCost->add(card->getManaCost()->getKicker()); + //cost reduction/recalculation must be here or outside somehow... +#ifdef WIN32 + withKickerCost->Dump(); +#endif + if (playerMana->canAfford(withKickerCost)) + return 1; } - SAFE_DELETE(withKickerCost); - return 1; + return 0; } int MTGKickerRule::reactToClick(MTGCardInstance * card) { - if(!isReactingToClick(card)) + if (!isReactingToClick(card)) return 0; - Player * player = game->currentlyActing(); - ManaCost * withKickerCost= card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()),card->getManaCost(), true); - withKickerCost->add(withKickerCost->getKicker());//after getting base cost add the kicker cost... todo reduction... - if(withKickerCost->extraCosts) - for(unsigned int i = 0; i < withKickerCost->extraCosts->costs.size();i++) - { - withKickerCost->extraCosts->costs[i]->setSource(card); - } + ManaCost * cost = card->getManaCost(); - if (card->getManaCost()->getKicker()->isMulti) - { - int possiblemana = player->getManaPool()->getConvertedCost(); - int kickercost = card->getManaCost()->getKicker()->getConvertedCost(); - int counter = possiblemana/kickercost; - //excess cost reducer must be here... TODO.... revised because using while loop has a bug... check the everflowing chalice test... - if(counter) - { - for(int i = 0; i < counter; i++) - { - if(player->getManaPool()->canAfford(withKickerCost)) - { - card->kicked++; - withKickerCost->add(withKickerCost->getKicker()); - } - } - card->paymenttype = MTGAbility::PUT_INTO_PLAY_WITH_KICKER; - } - } - else - { - withKickerCost->add(withKickerCost->getKicker()); - card->paymenttype = MTGAbility::PUT_INTO_PLAY_WITH_KICKER; - } + //this handles extra cost payments at the moment a card is played. - if (withKickerCost->isExtraPaymentSet()) + if (cost->isExtraPaymentSet()) { if (!game->targetListIsSet(card)) { - SAFE_DELETE(withKickerCost); return 0; } } else { - withKickerCost->setExtraCostsAction(this, card); - game->mExtraPayment = withKickerCost->extraCosts; - SAFE_DELETE(withKickerCost); + cost->setExtraCostsAction(this, card); + game->mExtraPayment = cost->extraCosts; return 0; } ManaCost * previousManaPool = NEW ManaCost(player->getManaPool()); - player->getManaPool()->pay(withKickerCost); - withKickerCost->doPayExtra(); + int payResult = player->getManaPool()->pay(card->getManaCost()); + if (card->getManaCost()->getKicker()) + { //cost reduction/recalculation must be here or outside somehow... + ManaCost * withKickerCost= NEW ManaCost(card->getManaCost()); + withKickerCost->add(withKickerCost->getKicker()); + if (card->getManaCost()->getKicker()->isMulti) + { + while(previousManaPool->canAfford(withKickerCost)) + { + withKickerCost->add(withKickerCost->getKicker()); + card->kicked += 1; + } + for(int i = 0;i < card->kicked;i++) + player->getManaPool()->pay(card->getManaCost()->getKicker()); + payResult = ManaCost::MANA_PAID_WITH_KICKER; + } + else if (previousManaPool->canAfford(withKickerCost)) + { + player->getManaPool()->pay(card->getManaCost()->getKicker()); + payResult = ManaCost::MANA_PAID_WITH_KICKER; + } + delete withKickerCost; + } + card->getManaCost()->doPayExtra(); ManaCost * spellCost = previousManaPool->Diff(player->getManaPool()); - delete withKickerCost; delete previousManaPool; if (card->isLand()) { MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->temp); - Spell * spell = NEW Spell(game, 0,copy,NULL,NULL, ManaCost::MANA_PAID_WITH_KICKER); + Spell * spell = NEW Spell(game, 0,copy,NULL,NULL, payResult); spell->resolve(); delete spellCost; delete spell; @@ -574,21 +571,21 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card) MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->stack); if (game->targetChooser) { - spell = game->mLayers->stackLayer()->addSpell(copy, game->targetChooser, spellCost, ManaCost::MANA_PAID_WITH_KICKER, 0); + spell = game->mLayers->stackLayer()->addSpell(copy, game->targetChooser, spellCost, payResult, 0); game->targetChooser = NULL; } else { - spell = game->mLayers->stackLayer()->addSpell(copy, NULL, spellCost, ManaCost::MANA_PAID_WITH_KICKER, 0); + spell = game->mLayers->stackLayer()->addSpell(copy, NULL, spellCost, payResult, 0); } if (card->has(Constants::STORM)) { int storm = player->game->stack->seenThisTurn("*", Constants::CAST_ALL) + player->opponent()->game->stack->seenThisTurn("*", Constants::CAST_ALL); - ManaCost * stormSpellCost = player->getManaPool(); + ManaCost * spellCost = player->getManaPool(); for (int i = storm; i > 1; i--) { - spell = game->mLayers->stackLayer()->addSpell(copy, NULL, stormSpellCost, ManaCost::MANA_PAID_WITH_KICKER, 1); + spell = game->mLayers->stackLayer()->addSpell(copy, NULL, spellCost, payResult, 1); } }//end of storm