This commit is contained in:
Anthony Calosa
2016-06-06 17:01:21 +08:00
parent 0376d094cc
commit 1faf2e0694

View File

@@ -477,93 +477,90 @@ int MTGKickerRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
if(OptionKicker::KICKER_ALWAYS == options[Options::KICKERPAYMENT].number) if(OptionKicker::KICKER_ALWAYS == options[Options::KICKERPAYMENT].number)
return 0; return 0;
Player * player = game->currentlyActing(); 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; return 0;
if(!card->getManaCost()->getKicker()) if(!card->getManaCost()->getKicker())
return 0; return 0;
ManaCost * withKickerCost= NEW ManaCost(card->getManaCost()); if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || (card->StackIsEmptyandSorcerySpeed()))
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))
{ {
SAFE_DELETE(withKickerCost); if(card->controller()->epic)
return 0; 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 0;
return 1;
} }
int MTGKickerRule::reactToClick(MTGCardInstance * card) int MTGKickerRule::reactToClick(MTGCardInstance * card)
{ {
if(!isReactingToClick(card)) if (!isReactingToClick(card))
return 0; return 0;
Player * player = game->currentlyActing(); Player * player = game->currentlyActing();
ManaCost * withKickerCost= card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()),card->getManaCost(), true); ManaCost * cost = card->getManaCost();
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);
}
if (card->getManaCost()->getKicker()->isMulti) //this handles extra cost payments at the moment a card is played.
{
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;
}
if (withKickerCost->isExtraPaymentSet()) if (cost->isExtraPaymentSet())
{ {
if (!game->targetListIsSet(card)) if (!game->targetListIsSet(card))
{ {
SAFE_DELETE(withKickerCost);
return 0; return 0;
} }
} }
else else
{ {
withKickerCost->setExtraCostsAction(this, card); cost->setExtraCostsAction(this, card);
game->mExtraPayment = withKickerCost->extraCosts; game->mExtraPayment = cost->extraCosts;
SAFE_DELETE(withKickerCost);
return 0; return 0;
} }
ManaCost * previousManaPool = NEW ManaCost(player->getManaPool()); ManaCost * previousManaPool = NEW ManaCost(player->getManaPool());
player->getManaPool()->pay(withKickerCost); int payResult = player->getManaPool()->pay(card->getManaCost());
withKickerCost->doPayExtra(); 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()); ManaCost * spellCost = previousManaPool->Diff(player->getManaPool());
delete withKickerCost;
delete previousManaPool; delete previousManaPool;
if (card->isLand()) if (card->isLand())
{ {
MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->temp); 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(); spell->resolve();
delete spellCost; delete spellCost;
delete spell; delete spell;
@@ -574,21 +571,21 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card)
MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->stack); MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->stack);
if (game->targetChooser) 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; game->targetChooser = NULL;
} }
else 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)) if (card->has(Constants::STORM))
{ {
int storm = player->game->stack->seenThisTurn("*", Constants::CAST_ALL) + player->opponent()->game->stack->seenThisTurn("*", Constants::CAST_ALL); 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--) 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 }//end of storm