Fixed memory leaks and refactored a bit the ManaCost class while I was at it.
This commit is contained in:
@@ -27,6 +27,14 @@ protected:
|
|||||||
std::vector<ManaCostHybrid> hybrids;
|
std::vector<ManaCostHybrid> hybrids;
|
||||||
|
|
||||||
virtual void init();
|
virtual void init();
|
||||||
|
ManaCost * suspend;
|
||||||
|
ManaCost * manaUsedToCast;
|
||||||
|
ManaCost * morph;
|
||||||
|
ManaCost * Retrace;
|
||||||
|
ManaCost * FlashBack;
|
||||||
|
ManaCost * BuyBack;
|
||||||
|
ManaCost * kicker;
|
||||||
|
ManaCost * alternative;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum
|
enum
|
||||||
@@ -41,17 +49,31 @@ public:
|
|||||||
MANA_PAID_WITH_MORPH = 7,
|
MANA_PAID_WITH_MORPH = 7,
|
||||||
MANA_PAID_WITH_SUSPEND = 8
|
MANA_PAID_WITH_SUSPEND = 8
|
||||||
};
|
};
|
||||||
|
|
||||||
ExtraCosts * extraCosts;
|
ExtraCosts * extraCosts;
|
||||||
ManaCost * kicker;
|
|
||||||
ManaCost * alternative;
|
|
||||||
ManaCost * BuyBack;
|
|
||||||
ManaCost * FlashBack;
|
|
||||||
ManaCost * Retrace;
|
|
||||||
ManaCost * morph;
|
|
||||||
ManaCost * suspend;
|
|
||||||
|
|
||||||
ManaCost * manaUsedToCast;
|
ManaCost * getAlternative(){ return alternative; };
|
||||||
|
void setAlternative(ManaCost * aMana){ SAFE_DELETE(alternative); alternative = aMana;};
|
||||||
|
|
||||||
|
ManaCost * getKicker(){ return kicker; };
|
||||||
|
void setKicker(ManaCost * aMana){ SAFE_DELETE(kicker); kicker = aMana;};
|
||||||
|
|
||||||
|
ManaCost * getBuyback(){ return BuyBack; };
|
||||||
|
void setBuyback(ManaCost * aMana){ SAFE_DELETE(BuyBack); BuyBack = aMana;};
|
||||||
|
|
||||||
|
ManaCost * getFlashback(){ return FlashBack; };
|
||||||
|
void setFlashback(ManaCost * aMana){ SAFE_DELETE(FlashBack); FlashBack = aMana;};
|
||||||
|
|
||||||
|
ManaCost * getRetrace(){ return Retrace; };
|
||||||
|
void setRetrace(ManaCost * aMana){ SAFE_DELETE(Retrace); Retrace = aMana;};
|
||||||
|
|
||||||
|
ManaCost * getMorph(){ return morph; };
|
||||||
|
void setMorph(ManaCost * aMana){ SAFE_DELETE(morph); morph = aMana;};
|
||||||
|
|
||||||
|
ManaCost * getSuspend(){ return suspend; };
|
||||||
|
void setSuspend(ManaCost * aMana){ SAFE_DELETE(suspend); suspend = aMana;};
|
||||||
|
|
||||||
|
ManaCost * getManaUsedToCast(){ return manaUsedToCast; };
|
||||||
|
void setManaUsedToCast(ManaCost * aMana){ SAFE_DELETE(manaUsedToCast); manaUsedToCast = aMana;};
|
||||||
|
|
||||||
string alternativeName;
|
string alternativeName;
|
||||||
bool isMulti;
|
bool isMulti;
|
||||||
|
|||||||
@@ -1042,10 +1042,10 @@ vector<MTGAbility*> AIPlayerBaka::canPayMana(MTGCardInstance * target,ManaCost *
|
|||||||
return payments;//we didn't meet one of the color cost requirements.
|
return payments;//we didn't meet one of the color cost requirements.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(cost->kicker && !searchingAgain)
|
if(cost->getKicker() && !searchingAgain)
|
||||||
{
|
{
|
||||||
|
|
||||||
ManaCost * withKickerCost= NEW ManaCost(cost->kicker);
|
ManaCost * withKickerCost= NEW ManaCost(cost->getKicker());
|
||||||
int canKick = 0;
|
int canKick = 0;
|
||||||
vector<MTGAbility*>kickerPayment;
|
vector<MTGAbility*>kickerPayment;
|
||||||
bool keepLooking = true;
|
bool keepLooking = true;
|
||||||
@@ -1062,7 +1062,7 @@ vector<MTGAbility*> AIPlayerBaka::canPayMana(MTGCardInstance * target,ManaCost *
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
canKick += 1;
|
canKick += 1;
|
||||||
keepLooking = cost->kicker->isMulti;
|
keepLooking = cost->getKicker()->isMulti;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
keepLooking = false;
|
keepLooking = false;
|
||||||
@@ -1724,7 +1724,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
|||||||
{
|
{
|
||||||
nextCardToPlay = comboCards.back();
|
nextCardToPlay = comboCards.back();
|
||||||
gotPayments.clear();
|
gotPayments.clear();
|
||||||
if((!pMana->canAfford(nextCardToPlay->getManaCost()) || nextCardToPlay->getManaCost()->kicker))
|
if((!pMana->canAfford(nextCardToPlay->getManaCost()) || nextCardToPlay->getManaCost()->getKicker()))
|
||||||
gotPayments = canPayMana(nextCardToPlay,nextCardToPlay->getManaCost());
|
gotPayments = canPayMana(nextCardToPlay,nextCardToPlay->getManaCost());
|
||||||
DebugTrace("ai is doing a combo:" << nextCardToPlay->getName());
|
DebugTrace("ai is doing a combo:" << nextCardToPlay->getName());
|
||||||
comboCards.pop_back();
|
comboCards.pop_back();
|
||||||
@@ -1769,7 +1769,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
|||||||
continue;
|
continue;
|
||||||
nextCardToPlay = card;
|
nextCardToPlay = card;
|
||||||
gotPayments.clear();
|
gotPayments.clear();
|
||||||
if((!pMana->canAfford(nextCardToPlay->getManaCost()) || nextCardToPlay->getManaCost()->kicker))
|
if((!pMana->canAfford(nextCardToPlay->getManaCost()) || nextCardToPlay->getManaCost()->getKicker()))
|
||||||
gotPayments = canPayMana(nextCardToPlay,nextCardToPlay->getManaCost());
|
gotPayments = canPayMana(nextCardToPlay,nextCardToPlay->getManaCost());
|
||||||
return activateCombo();
|
return activateCombo();
|
||||||
}
|
}
|
||||||
@@ -1782,7 +1782,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
|||||||
int currentCost = card->getManaCost()->getConvertedCost();
|
int currentCost = card->getManaCost()->getConvertedCost();
|
||||||
int hasX = card->getManaCost()->hasX();
|
int hasX = card->getManaCost()->hasX();
|
||||||
gotPayments.clear();
|
gotPayments.clear();
|
||||||
if((!pMana->canAfford(card->getManaCost()) || card->getManaCost()->kicker))
|
if((!pMana->canAfford(card->getManaCost()) || card->getManaCost()->getKicker()))
|
||||||
gotPayments = canPayMana(card,card->getManaCost());
|
gotPayments = canPayMana(card,card->getManaCost());
|
||||||
//for preformence reason we only look for specific mana if the payment couldn't be made with pmana.
|
//for preformence reason we only look for specific mana if the payment couldn't be made with pmana.
|
||||||
if ((currentCost > maxCost || hasX) && (gotPayments.size() || pMana->canAfford(card->getManaCost())))
|
if ((currentCost > maxCost || hasX) && (gotPayments.size() || pMana->canAfford(card->getManaCost())))
|
||||||
@@ -1855,9 +1855,9 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
|||||||
xDiff = 0;
|
xDiff = 0;
|
||||||
shouldPlayPercentage = shouldPlayPercentage - static_cast<int> ((shouldPlayPercentage * 1.9f) / (1 + xDiff));
|
shouldPlayPercentage = shouldPlayPercentage - static_cast<int> ((shouldPlayPercentage * 1.9f) / (1 + xDiff));
|
||||||
}
|
}
|
||||||
if(card->getManaCost() && card->getManaCost()->kicker && card->getManaCost()->kicker->isMulti)
|
if(card->getManaCost() && card->getManaCost()->getKicker() && card->getManaCost()->getKicker()->isMulti)
|
||||||
{
|
{
|
||||||
shouldPlayPercentage = 10* size_t(gotPayments.size())/int(1+(card->getManaCost()->getConvertedCost()+card->getManaCost()->kicker->getConvertedCost()));
|
shouldPlayPercentage = 10* size_t(gotPayments.size())/int(1+(card->getManaCost()->getConvertedCost()+card->getManaCost()->getKicker()->getConvertedCost()));
|
||||||
if(shouldPlayPercentage <= 10)
|
if(shouldPlayPercentage <= 10)
|
||||||
shouldPlayPercentage = shouldPlayPercentage/3;
|
shouldPlayPercentage = shouldPlayPercentage/3;
|
||||||
}
|
}
|
||||||
@@ -1886,7 +1886,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
|||||||
}
|
}
|
||||||
if(nextCardToPlay)
|
if(nextCardToPlay)
|
||||||
{
|
{
|
||||||
if(!pMana->canAfford(nextCardToPlay->getManaCost()) || nextCardToPlay->getManaCost()->kicker)
|
if(!pMana->canAfford(nextCardToPlay->getManaCost()) || nextCardToPlay->getManaCost()->getKicker())
|
||||||
gotPayments = canPayMana(nextCardToPlay,nextCardToPlay->getManaCost());
|
gotPayments = canPayMana(nextCardToPlay,nextCardToPlay->getManaCost());
|
||||||
DebugTrace(" AI wants to play card." << endl
|
DebugTrace(" AI wants to play card." << endl
|
||||||
<< "- Next card to play: " << (nextCardToPlay ? nextCardToPlay->name : "None" ) << endl );
|
<< "- Next card to play: " << (nextCardToPlay ? nextCardToPlay->name : "None" ) << endl );
|
||||||
|
|||||||
@@ -331,7 +331,9 @@ int Spell::resolve()
|
|||||||
observer->getResourceManager()->PlaySample(source->getSample());
|
observer->getResourceManager()->PlaySample(source->getSample());
|
||||||
}
|
}
|
||||||
if(this->cost)
|
if(this->cost)
|
||||||
source->getManaCost()->manaUsedToCast = NEW ManaCost(this->cost);
|
{
|
||||||
|
source->getManaCost()->setManaUsedToCast(NEW ManaCost(this->cost));
|
||||||
|
}
|
||||||
AbilityFactory af(observer);
|
AbilityFactory af(observer);
|
||||||
af.addAbilities(observer->mLayers->actionLayer()->getMaxId(), this);
|
af.addAbilities(observer->mLayers->actionLayer()->getMaxId(), this);
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@@ -3875,13 +3875,13 @@ void AAlterCost::increaseTheCost(MTGCardInstance * card)
|
|||||||
for(int k = Constants::MTG_COLOR_ARTIFACT; k < Constants::NB_Colors;k++)
|
for(int k = Constants::MTG_COLOR_ARTIFACT; k < Constants::NB_Colors;k++)
|
||||||
{
|
{
|
||||||
card->getManaCost()->add(k,card->getIncreasedManaCost()->getCost(k));
|
card->getManaCost()->add(k,card->getIncreasedManaCost()->getCost(k));
|
||||||
if (card->getManaCost()->alternative)
|
if (card->getManaCost()->getAlternative())
|
||||||
{
|
{
|
||||||
card->getManaCost()->alternative->add(k,card->getIncreasedManaCost()->getCost(k));
|
card->getManaCost()->getAlternative()->add(k,card->getIncreasedManaCost()->getCost(k));
|
||||||
}
|
}
|
||||||
if (card->getManaCost()->BuyBack)
|
if (card->getManaCost()->getBuyback())
|
||||||
{
|
{
|
||||||
card->getManaCost()->BuyBack->add(k,card->getIncreasedManaCost()->getCost(k));
|
card->getManaCost()->getBuyback()->add(k,card->getIncreasedManaCost()->getCost(k));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3895,13 +3895,13 @@ void AAlterCost::decreaseTheCost(MTGCardInstance * card)
|
|||||||
for(int k = Constants::MTG_COLOR_ARTIFACT; k < Constants::NB_Colors;k++)
|
for(int k = Constants::MTG_COLOR_ARTIFACT; k < Constants::NB_Colors;k++)
|
||||||
{
|
{
|
||||||
card->getManaCost()->remove(k,card->getReducedManaCost()->getCost(k));
|
card->getManaCost()->remove(k,card->getReducedManaCost()->getCost(k));
|
||||||
if (card->getManaCost()->alternative)
|
if (card->getManaCost()->getAlternative())
|
||||||
{
|
{
|
||||||
card->getManaCost()->alternative->remove(k,card->getReducedManaCost()->getCost(k));
|
card->getManaCost()->getAlternative()->remove(k,card->getReducedManaCost()->getCost(k));
|
||||||
}
|
}
|
||||||
if (card->getManaCost()->BuyBack)
|
if (card->getManaCost()->getBuyback())
|
||||||
{
|
{
|
||||||
card->getManaCost()->BuyBack->remove(k,card->getReducedManaCost()->getCost(k));
|
card->getManaCost()->getBuyback()->remove(k,card->getReducedManaCost()->getCost(k));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,8 +47,8 @@ CardPrimitive::CardPrimitive(CardPrimitive * source)
|
|||||||
manaCost.copy(source->getManaCost());
|
manaCost.copy(source->getManaCost());
|
||||||
//reducedCost.copy(source->getReducedManaCost());
|
//reducedCost.copy(source->getReducedManaCost());
|
||||||
//increasedCost.copy(source->getIncreasedManaCost());
|
//increasedCost.copy(source->getIncreasedManaCost());
|
||||||
if(source->getManaCost()->alternative)
|
if(source->getManaCost()->getAlternative())
|
||||||
manaCost.alternative->alternativeName = source->getManaCost()->alternative->alternativeName;
|
manaCost.getAlternative()->alternativeName = source->getManaCost()->getAlternative()->alternativeName;
|
||||||
|
|
||||||
text = source->text;
|
text = source->text;
|
||||||
formattedText = source->formattedText;
|
formattedText = source->formattedText;
|
||||||
|
|||||||
@@ -401,7 +401,7 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe
|
|||||||
if(spentMana.size())
|
if(spentMana.size())
|
||||||
{
|
{
|
||||||
ManaCost * costToCheck = ManaCost::parseManaCost(restriction[i]);
|
ManaCost * costToCheck = ManaCost::parseManaCost(restriction[i]);
|
||||||
ManaCost * spent = card->getManaCost()->manaUsedToCast;
|
ManaCost * spent = card->getManaCost()->getManaUsedToCast();
|
||||||
if(spent && costToCheck && !spent->canAfford(costToCheck))
|
if(spent && costToCheck && !spent->canAfford(costToCheck))
|
||||||
{
|
{
|
||||||
SAFE_DELETE(costToCheck);
|
SAFE_DELETE(costToCheck);
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
|
|||||||
{
|
{
|
||||||
string value = val;
|
string value = val;
|
||||||
std::transform(value.begin(), value.end(), value.begin(), ::tolower);
|
std::transform(value.begin(), value.end(), value.begin(), ::tolower);
|
||||||
cost->BuyBack = ManaCost::parseManaCost(value);
|
cost->setBuyback(ManaCost::parseManaCost(value));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -139,13 +139,13 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
|
|||||||
{
|
{
|
||||||
string value = val;
|
string value = val;
|
||||||
std::transform(value.begin(), value.end(), value.begin(), ::tolower);
|
std::transform(value.begin(), value.end(), value.begin(), ::tolower);
|
||||||
cost->morph = ManaCost::parseManaCost(value);
|
cost->setMorph(ManaCost::parseManaCost(value));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string value = val;
|
string value = val;
|
||||||
std::transform(value.begin(), value.end(), value.begin(), ::tolower);
|
std::transform(value.begin(), value.end(), value.begin(), ::tolower);
|
||||||
cost->FlashBack = ManaCost::parseManaCost(value);
|
cost->setFlashback(ManaCost::parseManaCost(value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -174,8 +174,8 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
|
|||||||
value.erase(multikick, endK - multikick);
|
value.erase(multikick, endK - multikick);
|
||||||
isMultikicker = true;
|
isMultikicker = true;
|
||||||
}
|
}
|
||||||
cost->kicker = ManaCost::parseManaCost(value);
|
cost->setKicker(ManaCost::parseManaCost(value));
|
||||||
cost->kicker->isMulti = isMultikicker;
|
cost->getKicker()->isMulti = isMultikicker;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -214,9 +214,9 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
|
|||||||
theName = value.substr(name + 5,endName - name - 5);
|
theName = value.substr(name + 5,endName - name - 5);
|
||||||
value.erase(name, endName - name + 1);
|
value.erase(name, endName - name + 1);
|
||||||
}
|
}
|
||||||
cost->alternative = ManaCost::parseManaCost(value);
|
cost->setAlternative(ManaCost::parseManaCost(value));
|
||||||
if(theName.size())
|
if(theName.size())
|
||||||
cost->alternative->alternativeName.append(theName);
|
cost->getAlternative()->alternativeName.append(theName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -249,7 +249,7 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
|
|||||||
{
|
{
|
||||||
string value = val;
|
string value = val;
|
||||||
std::transform(value.begin(), value.end(), value.begin(), ::tolower);
|
std::transform(value.begin(), value.end(), value.begin(), ::tolower);
|
||||||
cost->Retrace = ManaCost::parseManaCost(value);
|
cost->setRetrace(ManaCost::parseManaCost(value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (s.find("rar") != string::npos)
|
else if (s.find("rar") != string::npos)
|
||||||
@@ -271,7 +271,7 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
|
|||||||
{
|
{
|
||||||
string value = val;
|
string value = val;
|
||||||
std::transform(value.begin(), value.end(), value.begin(), ::tolower);
|
std::transform(value.begin(), value.end(), value.begin(), ::tolower);
|
||||||
cost->suspend = ManaCost::parseManaCost(value);
|
cost->setSuspend(ManaCost::parseManaCost(value));
|
||||||
primitive->suspendedTime = suspendTime;
|
primitive->suspendedTime = suspendTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -388,24 +388,24 @@ int MTGPutInPlayRule::reactToClick(MTGCardInstance * card)
|
|||||||
|
|
||||||
ManaCost * previousManaPool = NEW ManaCost(player->getManaPool());
|
ManaCost * previousManaPool = NEW ManaCost(player->getManaPool());
|
||||||
int payResult = player->getManaPool()->pay(card->getManaCost());
|
int payResult = player->getManaPool()->pay(card->getManaCost());
|
||||||
if (card->getManaCost()->kicker && (OptionKicker::KICKER_ALWAYS == options[Options::KICKERPAYMENT].number || card->controller()->isAI()))
|
if (card->getManaCost()->getKicker() && (OptionKicker::KICKER_ALWAYS == options[Options::KICKERPAYMENT].number || card->controller()->isAI()))
|
||||||
{
|
{
|
||||||
ManaCost * withKickerCost= NEW ManaCost(card->getManaCost());
|
ManaCost * withKickerCost= NEW ManaCost(card->getManaCost());
|
||||||
withKickerCost->add(withKickerCost->kicker);
|
withKickerCost->add(withKickerCost->getKicker());
|
||||||
if (card->getManaCost()->kicker->isMulti)
|
if (card->getManaCost()->getKicker()->isMulti)
|
||||||
{
|
{
|
||||||
while(previousManaPool->canAfford(withKickerCost))
|
while(previousManaPool->canAfford(withKickerCost))
|
||||||
{
|
{
|
||||||
withKickerCost->add(withKickerCost->kicker);
|
withKickerCost->add(withKickerCost->getKicker());
|
||||||
card->kicked += 1;
|
card->kicked += 1;
|
||||||
}
|
}
|
||||||
for(int i = 0;i < card->kicked;i++)
|
for(int i = 0;i < card->kicked;i++)
|
||||||
player->getManaPool()->pay(card->getManaCost()->kicker);
|
player->getManaPool()->pay(card->getManaCost()->getKicker());
|
||||||
payResult = ManaCost::MANA_PAID_WITH_KICKER;
|
payResult = ManaCost::MANA_PAID_WITH_KICKER;
|
||||||
}
|
}
|
||||||
else if (previousManaPool->canAfford(withKickerCost))
|
else if (previousManaPool->canAfford(withKickerCost))
|
||||||
{
|
{
|
||||||
player->getManaPool()->pay(card->getManaCost()->kicker);
|
player->getManaPool()->pay(card->getManaCost()->getKicker());
|
||||||
payResult = ManaCost::MANA_PAID_WITH_KICKER;
|
payResult = ManaCost::MANA_PAID_WITH_KICKER;
|
||||||
}
|
}
|
||||||
delete withKickerCost;
|
delete withKickerCost;
|
||||||
@@ -481,7 +481,7 @@ int MTGKickerRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
|
|||||||
Player * player = game->currentlyActing();
|
Player * player = game->currentlyActing();
|
||||||
if(!player->game->hand->hasCard(card))
|
if(!player->game->hand->hasCard(card))
|
||||||
return 0;
|
return 0;
|
||||||
ManaCost * kicker = card->getManaCost()->kicker;
|
ManaCost * kicker = card->getManaCost()->getKicker();
|
||||||
if(!kicker)
|
if(!kicker)
|
||||||
{
|
{
|
||||||
SAFE_DELETE(kicker);
|
SAFE_DELETE(kicker);
|
||||||
@@ -489,7 +489,7 @@ int MTGKickerRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
|
|||||||
}
|
}
|
||||||
ManaCost * playerMana = player->getManaPool();
|
ManaCost * playerMana = player->getManaPool();
|
||||||
ManaCost * withKickerCost= NEW ManaCost(card->getManaCost());
|
ManaCost * withKickerCost= NEW ManaCost(card->getManaCost());
|
||||||
withKickerCost->add(withKickerCost->kicker);
|
withKickerCost->add(withKickerCost->getKicker());
|
||||||
if(!playerMana->canAfford(withKickerCost))
|
if(!playerMana->canAfford(withKickerCost))
|
||||||
{
|
{
|
||||||
delete withKickerCost;
|
delete withKickerCost;
|
||||||
@@ -508,11 +508,11 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card)
|
|||||||
|
|
||||||
Player * player = game->currentlyActing();
|
Player * player = game->currentlyActing();
|
||||||
ManaCost * withKickerCost= NEW ManaCost(card->getManaCost());//using pointers here alters the real cost of the card.
|
ManaCost * withKickerCost= NEW ManaCost(card->getManaCost());//using pointers here alters the real cost of the card.
|
||||||
if (card->getManaCost()->kicker->isMulti)
|
if (card->getManaCost()->getKicker()->isMulti)
|
||||||
{
|
{
|
||||||
while(player->getManaPool()->canAfford(withKickerCost))
|
while(player->getManaPool()->canAfford(withKickerCost))
|
||||||
{
|
{
|
||||||
withKickerCost->add(withKickerCost->kicker);
|
withKickerCost->add(withKickerCost->getKicker());
|
||||||
card->kicked += 1;
|
card->kicked += 1;
|
||||||
}
|
}
|
||||||
card->kicked -= 1;
|
card->kicked -= 1;
|
||||||
@@ -522,7 +522,7 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
withKickerCost->add(withKickerCost->kicker);
|
withKickerCost->add(withKickerCost->getKicker());
|
||||||
card->paymenttype = MTGAbility::PUT_INTO_PLAY_WITH_KICKER;
|
card->paymenttype = MTGAbility::PUT_INTO_PLAY_WITH_KICKER;
|
||||||
}
|
}
|
||||||
if (withKickerCost->isExtraPaymentSet())
|
if (withKickerCost->isExtraPaymentSet())
|
||||||
@@ -619,7 +619,7 @@ PermanentAbility(observer, _id)
|
|||||||
|
|
||||||
int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
||||||
{
|
{
|
||||||
ManaCost * alternateCost = card->getManaCost()->alternative;
|
ManaCost * alternateCost = card->getManaCost()->getAlternative();
|
||||||
if (!game->currentlyActing()->game->hand->hasCard(card))
|
if (!game->currentlyActing()->game->hand->hasCard(card))
|
||||||
return 0;
|
return 0;
|
||||||
return isReactingToClick( card, mana, alternateCost );
|
return isReactingToClick( card, mana, alternateCost );
|
||||||
@@ -635,8 +635,8 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *
|
|||||||
if(!allowedToAltCast(card,player))
|
if(!allowedToAltCast(card,player))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(card->model->data->getManaCost()->alternative && card->model->data->getManaCost()->alternative->alternativeName.size())
|
if(card->model->data->getManaCost()->getAlternative() && card->model->data->getManaCost()->getAlternative()->alternativeName.size())
|
||||||
alternativeName = card->model->data->getManaCost()->alternative->alternativeName;
|
alternativeName = card->model->data->getManaCost()->getAlternative()->alternativeName;
|
||||||
|
|
||||||
if (card->isLand())
|
if (card->isLand())
|
||||||
{
|
{
|
||||||
@@ -676,7 +676,7 @@ int MTGAlternativeCostRule::reactToClick(MTGCardInstance * card)
|
|||||||
if ( !isReactingToClick(card))
|
if ( !isReactingToClick(card))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ManaCost *alternateCost = card->getManaCost()->alternative;
|
ManaCost *alternateCost = card->getManaCost()->getAlternative();
|
||||||
card->paymenttype = MTGAbility::ALTERNATIVE_COST;
|
card->paymenttype = MTGAbility::ALTERNATIVE_COST;
|
||||||
|
|
||||||
return reactToClick(card, alternateCost, ManaCost::MANA_PAID_WITH_ALTERNATIVE);
|
return reactToClick(card, alternateCost, ManaCost::MANA_PAID_WITH_ALTERNATIVE);
|
||||||
@@ -776,7 +776,7 @@ int MTGBuyBackRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
|||||||
return 0;
|
return 0;
|
||||||
if(!allowedToCast(card,player))
|
if(!allowedToCast(card,player))
|
||||||
return 0;
|
return 0;
|
||||||
return MTGAlternativeCostRule::isReactingToClick( card, mana, card->getManaCost()->BuyBack );
|
return MTGAlternativeCostRule::isReactingToClick( card, mana, card->getManaCost()->getBuyback() );
|
||||||
}
|
}
|
||||||
|
|
||||||
int MTGBuyBackRule::reactToClick(MTGCardInstance * card)
|
int MTGBuyBackRule::reactToClick(MTGCardInstance * card)
|
||||||
@@ -784,7 +784,7 @@ int MTGBuyBackRule::reactToClick(MTGCardInstance * card)
|
|||||||
if (!isReactingToClick(card))
|
if (!isReactingToClick(card))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ManaCost * alternateCost = card->getManaCost()->BuyBack;
|
ManaCost * alternateCost = card->getManaCost()->getBuyback();
|
||||||
|
|
||||||
card->paymenttype = MTGAbility::BUYBACK_COST;
|
card->paymenttype = MTGAbility::BUYBACK_COST;
|
||||||
|
|
||||||
@@ -818,12 +818,12 @@ int MTGFlashBackRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
|||||||
Player * player = game->currentlyActing();
|
Player * player = game->currentlyActing();
|
||||||
if (!player->game->graveyard->hasCard(card))
|
if (!player->game->graveyard->hasCard(card))
|
||||||
return 0;
|
return 0;
|
||||||
return MTGAlternativeCostRule::isReactingToClick(card, mana, card->getManaCost()->FlashBack );
|
return MTGAlternativeCostRule::isReactingToClick(card, mana, card->getManaCost()->getFlashback() );
|
||||||
}
|
}
|
||||||
|
|
||||||
int MTGFlashBackRule::reactToClick(MTGCardInstance * card)
|
int MTGFlashBackRule::reactToClick(MTGCardInstance * card)
|
||||||
{
|
{
|
||||||
ManaCost * alternateCost = card->getManaCost()->FlashBack;
|
ManaCost * alternateCost = card->getManaCost()->getFlashback();
|
||||||
|
|
||||||
if (!isReactingToClick(card))
|
if (!isReactingToClick(card))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -859,7 +859,7 @@ MTGAlternativeCostRule(observer, _id)
|
|||||||
int MTGRetraceRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
int MTGRetraceRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
||||||
{
|
{
|
||||||
Player * player = game->currentlyActing();
|
Player * player = game->currentlyActing();
|
||||||
ManaCost * alternateManaCost = card->getManaCost()->Retrace;
|
ManaCost * alternateManaCost = card->getManaCost()->getRetrace();
|
||||||
|
|
||||||
if (!player->game->graveyard->hasCard(card))
|
if (!player->game->graveyard->hasCard(card))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -873,7 +873,7 @@ int MTGRetraceRule::reactToClick(MTGCardInstance * card)
|
|||||||
if (!isReactingToClick(card))
|
if (!isReactingToClick(card))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ManaCost * alternateCost = card->getManaCost()->Retrace;
|
ManaCost * alternateCost = card->getManaCost()->getRetrace();
|
||||||
|
|
||||||
card->paymenttype = MTGAbility::RETRACE_COST;
|
card->paymenttype = MTGAbility::RETRACE_COST;
|
||||||
|
|
||||||
@@ -906,7 +906,7 @@ MTGAlternativeCostRule(observer, _id)
|
|||||||
int MTGSuspendRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
int MTGSuspendRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
||||||
{
|
{
|
||||||
Player * player = game->currentlyActing();
|
Player * player = game->currentlyActing();
|
||||||
ManaCost * alternateManaCost = card->getManaCost()->suspend;
|
ManaCost * alternateManaCost = card->getManaCost()->getSuspend();
|
||||||
|
|
||||||
if (!player->game->hand->hasCard(card) || !alternateManaCost)
|
if (!player->game->hand->hasCard(card) || !alternateManaCost)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -948,7 +948,7 @@ int MTGSuspendRule::reactToClick(MTGCardInstance * card)
|
|||||||
return 0;
|
return 0;
|
||||||
Player *player = game->currentlyActing();
|
Player *player = game->currentlyActing();
|
||||||
ManaCost * playerMana = player->getManaPool();
|
ManaCost * playerMana = player->getManaPool();
|
||||||
ManaCost * alternateCost = card->getManaCost()->suspend;
|
ManaCost * alternateCost = card->getManaCost()->getSuspend();
|
||||||
//this handles extra cost payments at the moment a card is played.
|
//this handles extra cost payments at the moment a card is played.
|
||||||
if (playerMana->canAfford(alternateCost))
|
if (playerMana->canAfford(alternateCost))
|
||||||
{
|
{
|
||||||
@@ -973,22 +973,22 @@ int MTGSuspendRule::reactToClick(MTGCardInstance * card)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
alternateCost->setExtraCostsAction(this, card);
|
alternateCost->setExtraCostsAction(this, card);
|
||||||
game->mExtraPayment = getCost()->suspend->extraCosts;
|
game->mExtraPayment = getCost()->getSuspend()->extraCosts;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
card->paymenttype = MTGAbility::SUSPEND_COST;
|
card->paymenttype = MTGAbility::SUSPEND_COST;
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
if(card->getManaCost()->suspend->hasX())
|
if(card->getManaCost()->getSuspend()->hasX())
|
||||||
{
|
{
|
||||||
ManaCost * pMana = NEW ManaCost(player->getManaPool());
|
ManaCost * pMana = NEW ManaCost(player->getManaPool());
|
||||||
ManaCost * suspendCheckMana = NEW ManaCost(card->getManaCost()->suspend);
|
ManaCost * suspendCheckMana = NEW ManaCost(card->getManaCost()->getSuspend());
|
||||||
card->suspendedTime = pMana->getConvertedCost() - suspendCheckMana->getConvertedCost();
|
card->suspendedTime = pMana->getConvertedCost() - suspendCheckMana->getConvertedCost();
|
||||||
SAFE_DELETE(pMana);
|
SAFE_DELETE(pMana);
|
||||||
SAFE_DELETE(suspendCheckMana);
|
SAFE_DELETE(suspendCheckMana);
|
||||||
}
|
}
|
||||||
player->getManaPool()->pay(card->getManaCost()->suspend);
|
player->getManaPool()->pay(card->getManaCost()->getSuspend());
|
||||||
card->getManaCost()->suspend->doPayExtra();
|
card->getManaCost()->getSuspend()->doPayExtra();
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
player->game->putInZone(card, card->currentZone, player->game->exile);
|
player->game->putInZone(card, card->currentZone, player->game->exile);
|
||||||
card->next->suspended = true;
|
card->next->suspended = true;
|
||||||
@@ -1031,7 +1031,7 @@ int MTGMorphCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
|
|||||||
Player * currentPlayer = game->currentPlayer;
|
Player * currentPlayer = game->currentPlayer;
|
||||||
if (!player->game->hand->hasCard(card))
|
if (!player->game->hand->hasCard(card))
|
||||||
return 0;
|
return 0;
|
||||||
if (!card->getManaCost()->morph)
|
if (!card->getManaCost()->getMorph())
|
||||||
return 0;
|
return 0;
|
||||||
if(!allowedToAltCast(card,player))
|
if(!allowedToAltCast(card,player))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1045,7 +1045,7 @@ int MTGMorphCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
|
|||||||
if (game->currentActionPlayer->game->playRestrictions->canPutIntoZone(card, game->currentActionPlayer->game->stack) == PlayRestriction::CANT_PLAY)
|
if (game->currentActionPlayer->game->playRestrictions->canPutIntoZone(card, game->currentActionPlayer->game->stack) == PlayRestriction::CANT_PLAY)
|
||||||
return 0;
|
return 0;
|
||||||
ManaCost * playerMana = player->getManaPool();
|
ManaCost * playerMana = player->getManaPool();
|
||||||
ManaCost * morph = card->getManaCost()->morph;
|
ManaCost * morph = card->getManaCost()->getMorph();
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
ManaCost * cost = card->getManaCost();
|
ManaCost * cost = card->getManaCost();
|
||||||
@@ -1068,12 +1068,12 @@ int MTGMorphCostRule::reactToClick(MTGCardInstance * card)
|
|||||||
return 0;
|
return 0;
|
||||||
Player * player = game->currentlyActing();
|
Player * player = game->currentlyActing();
|
||||||
ManaCost * cost = card->getManaCost();
|
ManaCost * cost = card->getManaCost();
|
||||||
ManaCost * morph = card->getManaCost()->morph;
|
ManaCost * morph = card->getManaCost()->getMorph();
|
||||||
ManaCost * playerMana = player->getManaPool();
|
ManaCost * playerMana = player->getManaPool();
|
||||||
//this handles extra cost payments at the moment a card is played.
|
//this handles extra cost payments at the moment a card is played.
|
||||||
if (playerMana->canAfford(morph))
|
if (playerMana->canAfford(morph))
|
||||||
{
|
{
|
||||||
if (cost->morph->isExtraPaymentSet())
|
if (cost->getMorph()->isExtraPaymentSet())
|
||||||
{
|
{
|
||||||
card->paymenttype = MTGAbility::MORPH_COST;
|
card->paymenttype = MTGAbility::MORPH_COST;
|
||||||
if (!game->targetListIsSet(card))
|
if (!game->targetListIsSet(card))
|
||||||
@@ -1083,21 +1083,21 @@ int MTGMorphCostRule::reactToClick(MTGCardInstance * card)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cost->morph->setExtraCostsAction(this, card);
|
cost->getMorph()->setExtraCostsAction(this, card);
|
||||||
game->mExtraPayment = cost->morph->extraCosts;
|
game->mExtraPayment = cost->getMorph()->extraCosts;
|
||||||
card->paymenttype = MTGAbility::MORPH_COST;
|
card->paymenttype = MTGAbility::MORPH_COST;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
ManaCost * previousManaPool = NEW ManaCost(player->getManaPool());
|
ManaCost * previousManaPool = NEW ManaCost(player->getManaPool());
|
||||||
player->getManaPool()->pay(card->getManaCost()->morph);
|
player->getManaPool()->pay(card->getManaCost()->getMorph());
|
||||||
card->getManaCost()->morph->doPayExtra();
|
card->getManaCost()->getMorph()->doPayExtra();
|
||||||
int payResult = ManaCost::MANA_PAID_WITH_MORPH;
|
int payResult = ManaCost::MANA_PAID_WITH_MORPH;
|
||||||
//if morph has a extra payment thats set, this code pays it.the if statement is 100% needed as it would cause a crash on cards that dont have the morph cost.
|
//if morph has a extra payment thats set, this code pays it.the if statement is 100% needed as it would cause a crash on cards that dont have the morph cost.
|
||||||
if (morph)
|
if (morph)
|
||||||
{
|
{
|
||||||
card->getManaCost()->morph->doPayExtra();
|
card->getManaCost()->getMorph()->doPayExtra();
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
ManaCost * spellCost = previousManaPool->Diff(player->getManaPool());
|
ManaCost * spellCost = previousManaPool->Diff(player->getManaPool());
|
||||||
|
|||||||
@@ -989,6 +989,15 @@ ostream& operator<<(ostream& out, ManaCost m)
|
|||||||
|
|
||||||
void ManaPool::Empty()
|
void ManaPool::Empty()
|
||||||
{
|
{
|
||||||
|
SAFE_DELETE(extraCosts);
|
||||||
|
SAFE_DELETE(kicker);
|
||||||
|
SAFE_DELETE(alternative);
|
||||||
|
SAFE_DELETE(BuyBack);
|
||||||
|
SAFE_DELETE(FlashBack);
|
||||||
|
SAFE_DELETE(Retrace);
|
||||||
|
SAFE_DELETE(morph);
|
||||||
|
SAFE_DELETE(suspend);
|
||||||
|
SAFE_DELETE(manaUsedToCast);
|
||||||
init();
|
init();
|
||||||
WEvent * e = NEW WEventEmptyManaPool(this);
|
WEvent * e = NEW WEventEmptyManaPool(this);
|
||||||
player->getObserver()->receiveEvent(e);
|
player->getObserver()->receiveEvent(e);
|
||||||
|
|||||||
Reference in New Issue
Block a user