@@ -1043,7 +1043,7 @@ type=Enchantment
|
|||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
name=AEther Burst
|
name=AEther Burst
|
||||||
target=<type:AEther Burst:graveyardplus1plusend>creature|battlefield
|
target=<plusonetype:AEther Burst:graveyard>creature|battlefield
|
||||||
auto=moveto(ownerhand)
|
auto=moveto(ownerhand)
|
||||||
text=Return up to X target creatures to their owners' hands, where X is one plus the number of cards named AEther Burst in all graveyards as you cast AEther Burst.
|
text=Return up to X target creatures to their owners' hands, where X is one plus the number of cards named AEther Burst in all graveyards as you cast AEther Burst.
|
||||||
mana={1}{U}
|
mana={1}{U}
|
||||||
@@ -3677,7 +3677,7 @@ toughness=1+*
|
|||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
name=An-Havva Inn
|
name=An-Havva Inn
|
||||||
auto=life:type:creature[green]|battlefieldplus1plusend controller
|
auto=life:plusonetype:creature[green]|battlefield controller
|
||||||
text=You gain X plus 1 life, where X is the number of green creatures on the battlefield.
|
text=You gain X plus 1 life, where X is the number of green creatures on the battlefield.
|
||||||
mana={1}{G}{G}
|
mana={1}{G}{G}
|
||||||
type=Sorcery
|
type=Sorcery
|
||||||
@@ -10126,7 +10126,7 @@ type=Sorcery
|
|||||||
[card]
|
[card]
|
||||||
name=Black Vise
|
name=Black Vise
|
||||||
auto=name(choose opponent) notatarget(opponent) deplete:0
|
auto=name(choose opponent) notatarget(opponent) deplete:0
|
||||||
auto=@each targetedplayer upkeep:damage:type:*:targetedpersonshandminus4minusend targetedplayer
|
auto=@each targetedplayer upkeep:damage:morethanfourcards targetedplayer
|
||||||
text=As Black Vise enters the battlefield, choose an opponent. -- At the beginning of the chosen player's upkeep, Black Vise deals X damage to that player, where X is the number of cards in his or her hand minus 4.
|
text=As Black Vise enters the battlefield, choose an opponent. -- At the beginning of the chosen player's upkeep, Black Vise deals X damage to that player, where X is the number of cards in his or her hand minus 4.
|
||||||
mana={1}
|
mana={1}
|
||||||
type=Artifact
|
type=Artifact
|
||||||
@@ -54376,7 +54376,7 @@ type=Artifact
|
|||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
name=Iron Maiden
|
name=Iron Maiden
|
||||||
auto=@each opponent upkeep:damage:type:*:opponenthandminus4minusend opponent
|
auto=@each opponent upkeep:damage:morethanfourcards opponent
|
||||||
text=At the beginning of each opponent's upkeep, Iron Maiden deals X damage to that player, where X is the number of cards in his or her hand minus 4.
|
text=At the beginning of each opponent's upkeep, Iron Maiden deals X damage to that player, where X is the number of cards in his or her hand minus 4.
|
||||||
mana={3}
|
mana={3}
|
||||||
type=Artifact
|
type=Artifact
|
||||||
@@ -57937,7 +57937,7 @@ type=Instant
|
|||||||
[card]
|
[card]
|
||||||
name=Kindle
|
name=Kindle
|
||||||
target=creature,player
|
target=creature,player
|
||||||
auto=damage:type:kindle:graveyardplus2plusend
|
auto=damage:plustwotype:kindle:graveyard
|
||||||
text=Kindle deals X damage to target creature or player, where X is 2 plus the number of cards named Kindle in all graveyards.
|
text=Kindle deals X damage to target creature or player, where X is 2 plus the number of cards named Kindle in all graveyards.
|
||||||
mana={1}{R}
|
mana={1}{R}
|
||||||
type=Instant
|
type=Instant
|
||||||
@@ -61533,7 +61533,7 @@ toughness=5
|
|||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
name=Lhurgoyf
|
name=Lhurgoyf
|
||||||
anyzone=type:creature:graveyard/type:creature:graveyardplus1plusend cdaactive
|
anyzone=type:creature:graveyard/plusonetype:creature:graveyard cdaactive
|
||||||
text=Lhurgoyf's power is equal to the number of creature cards in all graveyards and its toughness is equal to that number plus 1.
|
text=Lhurgoyf's power is equal to the number of creature cards in all graveyards and its toughness is equal to that number plus 1.
|
||||||
mana={2}{G}{G}
|
mana={2}{G}{G}
|
||||||
type=Creature
|
type=Creature
|
||||||
@@ -68102,7 +68102,7 @@ type=Legendary Land
|
|||||||
[card]
|
[card]
|
||||||
name=Mind Burst
|
name=Mind Burst
|
||||||
target=player
|
target=player
|
||||||
auto=ability$!name(discard) target(<type:mind burst:graveyard>*|myhandplus1plusend) reject!$ targetedplayer
|
auto=ability$!name(discard) target(<plusonetype:mind burst:graveyard>*|myhand) reject!$ targetedplayer
|
||||||
text=Target player discards X cards, where X is one plus the number of cards named Mind Burst in all graveyards.
|
text=Target player discards X cards, where X is one plus the number of cards named Mind Burst in all graveyards.
|
||||||
mana={1}{B}
|
mana={1}{B}
|
||||||
type=Sorcery
|
type=Sorcery
|
||||||
@@ -109311,7 +109311,7 @@ toughness=7
|
|||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
name=Tarmogoyf
|
name=Tarmogoyf
|
||||||
anyzone=gravecardtypes/gravecardtypesplus1plusend cdaactive
|
anyzone=gravecardtypes/plusonegravecardtypes cdaactive
|
||||||
text=Tarmogoyf's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1. (The card types are artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal.)
|
text=Tarmogoyf's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1. (The card types are artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal.)
|
||||||
mana={1}{G}
|
mana={1}{G}
|
||||||
type=Creature
|
type=Creature
|
||||||
@@ -120125,7 +120125,7 @@ toughness=3
|
|||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
name=Viseling
|
name=Viseling
|
||||||
auto=@each opponent upkeep:damage:type:*:opponenthandminus4minusend opponent
|
auto=@each opponent upkeep:damage:morethanfourcards opponent
|
||||||
text=At the beginning of each opponent's upkeep, Viseling deals X damage to that player, where X is the number of cards in his or her hand minus 4.
|
text=At the beginning of each opponent's upkeep, Viseling deals X damage to that player, where X is the number of cards in his or her hand minus 4.
|
||||||
mana={4}
|
mana={4}
|
||||||
type=Artifact Creature
|
type=Artifact Creature
|
||||||
@@ -120200,7 +120200,7 @@ type=Instant
|
|||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
name=Vitalizing Cascade
|
name=Vitalizing Cascade
|
||||||
auto=life:Xplus3plusend
|
auto=life:Xplusthree
|
||||||
text=You gain X plus 3 life.
|
text=You gain X plus 3 life.
|
||||||
mana={X}{G}{W}
|
mana={X}{G}{W}
|
||||||
type=Instant
|
type=Instant
|
||||||
@@ -121951,7 +121951,7 @@ toughness=4
|
|||||||
[card]
|
[card]
|
||||||
name=Wall of Tombstones
|
name=Wall of Tombstones
|
||||||
abilities=defender
|
abilities=defender
|
||||||
auto=@each my upkeep:transforms((,settoughness=type:creature:mygraveyardplus1plusend)) forever
|
auto=@each my upkeep:transforms((,settoughness=plusonetype:creature:mygraveyard)) forever
|
||||||
text=Defender (This creature can't attack.) -- At the beginning of your upkeep, Wall of Tombstones's toughness becomes 1 plus the number of creature cards in your graveyard. (This effect lasts indefinitely.)
|
text=Defender (This creature can't attack.) -- At the beginning of your upkeep, Wall of Tombstones's toughness becomes 1 plus the number of creature cards in your graveyard. (This effect lasts indefinitely.)
|
||||||
mana={1}{B}
|
mana={1}{B}
|
||||||
type=Creature
|
type=Creature
|
||||||
@@ -127555,46 +127555,6 @@ subtype=Orc Warrior
|
|||||||
power=7
|
power=7
|
||||||
toughness=2
|
toughness=2
|
||||||
[/card]
|
[/card]
|
||||||
######
|
|
||||||
######unsorted
|
|
||||||
[card]
|
|
||||||
name=Dark Suspicions
|
|
||||||
auto=@each opponent upkeep:life:-mathtype:*:opponenthandminustype:*:myhandminusendmathend opponent
|
|
||||||
text=At the beginning of each opponent's upkeep, that player loses X life, where X is the number of cards in that player's hand minus the number of cards in your hand.
|
|
||||||
mana={2}{B}{B}
|
|
||||||
type=Enchantment
|
|
||||||
[/card]
|
|
||||||
[card]
|
|
||||||
name=Bulwark
|
|
||||||
auto=@each opponent upkeep:target(opponent) damage:mathtype:*:myhandminustype:*:opponenthandminusendmathend opponent
|
|
||||||
text=At the beginning of your upkeep, Bulwark deals X damage to target opponent, where X is the number of cards in your hand minus the number of cards in that player's hand.
|
|
||||||
mana={3}{R}{R}
|
|
||||||
type=Enchantment
|
|
||||||
[/card]
|
|
||||||
[card]
|
|
||||||
name=Roiling Horror
|
|
||||||
anyzone=mathlifetotalminusopponentlifetotalminusendmathend/mathlifetotalminusopponentlifetotalminusendmathend cdaactive
|
|
||||||
autoexile=@counterremoved(0/0,1,Time) from(sourcecard) suspended:ability$!choice life:-1 target(opponent) && life:1 controller!$ controller
|
|
||||||
text=Roiling Horror's power and toughness are each equal to your life total minus the life total of an opponent with the most life. -- Suspend X—{X}{B}{B}{B}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{B}{B}{B} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -- Whenever a time counter is removed from Roiling Horror while it's exiled, target player loses 1 life and you gain 1 life.
|
|
||||||
mana={3}{B}{B}
|
|
||||||
suspend(0)={X}{b}{b}{b}
|
|
||||||
type=Creature
|
|
||||||
subtype=Horror
|
|
||||||
power=*
|
|
||||||
toughness=*
|
|
||||||
[/card]
|
|
||||||
[card]
|
|
||||||
name=Dark Deal
|
|
||||||
auto=count(type:*:myhand)
|
|
||||||
auto=all(*|myhand) reject
|
|
||||||
auto=draw:countedamountplus1plusend controller
|
|
||||||
auto=count(type:*:opponenthand)
|
|
||||||
auto=all(*|opponenthand) reject
|
|
||||||
auto=draw:countedamountplus1plusend opponent
|
|
||||||
text=Each player discards all the cards in his or her hand, then draws that many cards minus one.
|
|
||||||
mana={2}{B}
|
|
||||||
type=Sorcery
|
|
||||||
[/card]
|
|
||||||
##due to card type association dryad arbor is placed at the end. any other card that associates 2 super types in this manner should also
|
##due to card type association dryad arbor is placed at the end. any other card that associates 2 super types in this manner should also
|
||||||
##be in the end of the primitive to avoid abilities like changling thinking that "forest" is a creature type.
|
##be in the end of the primitive to avoid abilities like changling thinking that "forest" is a creature type.
|
||||||
[card]
|
[card]
|
||||||
|
|||||||
@@ -179,8 +179,10 @@ private:
|
|||||||
bool halfdown = false;
|
bool halfdown = false;
|
||||||
bool twice = false;
|
bool twice = false;
|
||||||
bool thrice = false;
|
bool thrice = false;
|
||||||
|
bool plusone = false;
|
||||||
|
bool plustwo = false;
|
||||||
|
bool plusthree = false;
|
||||||
bool other = false;//othertype:[subtype]
|
bool other = false;//othertype:[subtype]
|
||||||
|
|
||||||
if (!target) target = card;
|
if (!target) target = card;
|
||||||
int multiplier = 1;
|
int multiplier = 1;
|
||||||
if (s[0] == '-')
|
if (s[0] == '-')
|
||||||
@@ -229,7 +231,24 @@ private:
|
|||||||
size_t tXXX = s.find("thrice");
|
size_t tXXX = s.find("thrice");
|
||||||
s.erase(tXXX,tXXX + 6);
|
s.erase(tXXX,tXXX + 6);
|
||||||
}
|
}
|
||||||
|
if(s.find("plusone") != string::npos)
|
||||||
|
{
|
||||||
|
plusone = true;
|
||||||
|
size_t pOne = s.find("plusone");
|
||||||
|
s.erase(pOne,pOne + 7);
|
||||||
|
}
|
||||||
|
if(s.find("plustwo") != string::npos)
|
||||||
|
{
|
||||||
|
plustwo = true;
|
||||||
|
size_t pTwo = s.find("plustwo");
|
||||||
|
s.erase(pTwo,pTwo + 7);
|
||||||
|
}
|
||||||
|
if(s.find("plusthree") != string::npos)
|
||||||
|
{
|
||||||
|
plusthree = true;
|
||||||
|
size_t pThree = s.find("plusthree");
|
||||||
|
s.erase(pThree,pThree + 9);
|
||||||
|
}
|
||||||
if(s.find("othertype") != string::npos)
|
if(s.find("othertype") != string::npos)
|
||||||
{
|
{
|
||||||
other = true;
|
other = true;
|
||||||
@@ -254,47 +273,7 @@ private:
|
|||||||
size_t otc = s.find("otherconvertedcost");
|
size_t otc = s.find("otherconvertedcost");
|
||||||
s.erase(otc,otc + 5);
|
s.erase(otc,otc + 5);
|
||||||
}
|
}
|
||||||
|
if(s == "prex")
|
||||||
if (s.find("plusend") != string::npos || s.find("minusend") != string::npos || s.find("math") != string::npos)
|
|
||||||
{
|
|
||||||
//plus#plusend and minus#minusend splits the first part and second parts and parses the
|
|
||||||
//ints for each part, then either adds or subtracts those 2 variables as specified.
|
|
||||||
vector<string>mathFound = parseBetween(s, "math", "mathend", true);
|
|
||||||
if (mathFound.size())//maths allows us to get the value before applying multipliers
|
|
||||||
{
|
|
||||||
WParsedInt numPar(mathFound[1], NULL, card);
|
|
||||||
intValue = numPar.getValue();
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vector<string>plusSplit = parseBetween(s, "", "plus", true);
|
|
||||||
if (plusSplit.size())
|
|
||||||
{
|
|
||||||
WParsedInt numPar(plusSplit[1], NULL, card);
|
|
||||||
intValue = numPar.getValue();
|
|
||||||
}
|
|
||||||
vector<string>plusFound = parseBetween(s, "plus", "plusend", true);
|
|
||||||
if (plusFound.size())
|
|
||||||
{
|
|
||||||
WParsedInt numPar(plusFound[1], NULL, card);
|
|
||||||
intValue += numPar.getValue();
|
|
||||||
}
|
|
||||||
vector<string>minusSplit = parseBetween(s, "", "minus", true);
|
|
||||||
if (minusSplit.size())
|
|
||||||
{
|
|
||||||
WParsedInt numPar(minusSplit[1], NULL, card);
|
|
||||||
intValue = numPar.getValue();
|
|
||||||
}
|
|
||||||
vector<string>minusFound = parseBetween(s, "minus", "minusend", true);
|
|
||||||
if (minusFound.size())
|
|
||||||
{
|
|
||||||
WParsedInt numPar(minusFound[1], NULL, card);
|
|
||||||
intValue -= numPar.getValue();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(s == "prex")
|
|
||||||
{
|
{
|
||||||
if (card->setX > -1)
|
if (card->setX > -1)
|
||||||
{
|
{
|
||||||
@@ -827,18 +806,12 @@ private:
|
|||||||
else if (s == "pbasiclandtypes")//Basic Land types
|
else if (s == "pbasiclandtypes")//Basic Land types
|
||||||
{
|
{
|
||||||
MTGGameZone * checkZone = card->controller()->inPlay();
|
MTGGameZone * checkZone = card->controller()->inPlay();
|
||||||
intValue = //mtg rules 205.4c
|
intValue =
|
||||||
cardHasTypeinZone("waste", checkZone) +
|
cardHasTypeinZone("forest",checkZone) +
|
||||||
cardHasTypeinZone("forest", checkZone) +
|
cardHasTypeinZone("plains",checkZone) +
|
||||||
cardHasTypeinZone("plains", checkZone) +
|
cardHasTypeinZone("swamp",checkZone) +
|
||||||
cardHasTypeinZone("swamp", checkZone) +
|
cardHasTypeinZone("island",checkZone) +
|
||||||
cardHasTypeinZone("island", checkZone) +
|
cardHasTypeinZone("mountain",checkZone);
|
||||||
cardHasTypeinZone("mountain", checkZone) +
|
|
||||||
cardHasTypeinZone("snow-covered forest", checkZone) +
|
|
||||||
cardHasTypeinZone("snow-covered plains", checkZone) +
|
|
||||||
cardHasTypeinZone("snow-covered swamp", checkZone) +
|
|
||||||
cardHasTypeinZone("snow-covered island", checkZone) +
|
|
||||||
cardHasTypeinZone("snow-covered mountain", checkZone);
|
|
||||||
}
|
}
|
||||||
else if (s == "myname")//Name of the card you control
|
else if (s == "myname")//Name of the card you control
|
||||||
{
|
{
|
||||||
@@ -885,6 +858,13 @@ private:
|
|||||||
cardHasTypeinZone("artifact",checkZone);
|
cardHasTypeinZone("artifact",checkZone);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (s == "morethanfourcards")
|
||||||
|
{
|
||||||
|
intValue = 0;
|
||||||
|
int damage = card->playerTarget ? card->playerTarget->game->hand->nb_cards - 4 : card->controller()->opponent()->game->hand->nb_cards - 4;
|
||||||
|
if ( damage > 0 )
|
||||||
|
intValue = damage;
|
||||||
|
}
|
||||||
else if (s == "powertotalinplay")//Count Total Power of Creatures you control... Formidable
|
else if (s == "powertotalinplay")//Count Total Power of Creatures you control... Formidable
|
||||||
{
|
{
|
||||||
intValue = 0;
|
intValue = 0;
|
||||||
@@ -909,32 +889,40 @@ private:
|
|||||||
if (card->revealedLast)
|
if (card->revealedLast)
|
||||||
intValue = card->revealedLast->getManaCost()->getConvertedCost();
|
intValue = card->revealedLast->getManaCost()->getConvertedCost();
|
||||||
}
|
}
|
||||||
else if(!intValue)//found nothing, try parsing a atoi
|
else
|
||||||
{
|
{
|
||||||
intValue = atoi(s.c_str());
|
intValue = atoi(s.c_str());
|
||||||
}
|
}
|
||||||
if (intValue > 0)//dont divide by 0 the rest are valid.
|
if(intValue > 0)
|
||||||
{
|
{
|
||||||
if (halfup)
|
if(halfup)
|
||||||
{
|
{
|
||||||
if (intValue % 2 == 1)
|
if(intValue%2 == 1)
|
||||||
intValue++;
|
intValue++;
|
||||||
intValue = intValue / 2;
|
intValue = intValue/2;
|
||||||
}
|
}
|
||||||
if (halfdown)
|
if(halfdown)
|
||||||
intValue = intValue / 2;
|
intValue = intValue/2;
|
||||||
|
if(twice)
|
||||||
|
intValue = intValue*2;
|
||||||
|
if(thrice)
|
||||||
|
intValue = intValue*3;
|
||||||
|
if(plusone)
|
||||||
|
intValue = intValue+1;
|
||||||
|
if(plustwo)
|
||||||
|
intValue = intValue+2;
|
||||||
|
if(plusthree)
|
||||||
|
intValue = intValue+3;
|
||||||
}
|
}
|
||||||
if (twice)
|
else
|
||||||
intValue = intValue * 2;
|
|
||||||
if (thrice)
|
|
||||||
intValue = intValue * 3;
|
|
||||||
if (intValue < 0)
|
|
||||||
{
|
{
|
||||||
//we remove "-" at the start and are parsing for real values.
|
if(plusone)
|
||||||
//if we ended up with a value less than 0, then we return just 0
|
intValue = intValue+1;
|
||||||
intValue = 0;
|
if(plustwo)
|
||||||
|
intValue = intValue+2;
|
||||||
|
if(plusthree)
|
||||||
|
intValue = intValue+3;
|
||||||
}
|
}
|
||||||
|
|
||||||
intValue *= multiplier;
|
intValue *= multiplier;
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -58,10 +58,6 @@ public:
|
|||||||
int Angel[2];
|
int Angel[2];
|
||||||
bool dragonbonusgranted[2];
|
bool dragonbonusgranted[2];
|
||||||
int dragon[2];
|
int dragon[2];
|
||||||
bool eldrazibonusgranted[2];
|
|
||||||
int eldrazi[2];
|
|
||||||
bool werewolfbonusgranted[2];
|
|
||||||
int werewolf[2];
|
|
||||||
|
|
||||||
int receiveEvent(WEvent * event);
|
int receiveEvent(WEvent * event);
|
||||||
void grantAward(string awardName,int amount);
|
void grantAward(string awardName,int amount);
|
||||||
|
|||||||
@@ -1319,7 +1319,6 @@ int AACopier::resolve()
|
|||||||
MTGCard* clone = MTGCollection()->getCardById(_target->copiedID);
|
MTGCard* clone = MTGCollection()->getCardById(_target->copiedID);
|
||||||
MTGCardInstance * myClone = NEW MTGCardInstance(clone, source->controller()->game);
|
MTGCardInstance * myClone = NEW MTGCardInstance(clone, source->controller()->game);
|
||||||
source->copy(myClone);
|
source->copy(myClone);
|
||||||
SAFE_DELETE(myClone);
|
|
||||||
source->isACopier = true;
|
source->isACopier = true;
|
||||||
source->copiedID = _target->getMTGId();
|
source->copiedID = _target->getMTGId();
|
||||||
source->modifiedbAbi = _target->modifiedbAbi;
|
source->modifiedbAbi = _target->modifiedbAbi;
|
||||||
@@ -6134,7 +6133,6 @@ int AProduceMana::produce()
|
|||||||
{
|
{
|
||||||
AManaProducer *amp = NEW AManaProducer(game, game->mLayers->actionLayer()->getMaxId(), source, source->controller(), ManaCost::parseManaCost(ManaDescription,NULL,source), NULL, 0,"",false);
|
AManaProducer *amp = NEW AManaProducer(game, game->mLayers->actionLayer()->getMaxId(), source, source->controller(), ManaCost::parseManaCost(ManaDescription,NULL,source), NULL, 0,"",false);
|
||||||
amp->resolve();
|
amp->resolve();
|
||||||
SAFE_DELETE(amp);//once you call resolve() on a ability, you can safely delete it.
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -251,7 +251,7 @@ int Damage::resolve()
|
|||||||
target->lifeLostThisTurn += damage;
|
target->lifeLostThisTurn += damage;
|
||||||
if ( typeOfDamage == 1 && target == source->controller()->opponent() )//add vector prowledtypes.
|
if ( typeOfDamage == 1 && target == source->controller()->opponent() )//add vector prowledtypes.
|
||||||
{
|
{
|
||||||
vector<string> values = MTGAllCards::getCreatureValuesById();//getting a weird crash here. rarely.
|
vector<string> values = MTGAllCards::getCreatureValuesById();
|
||||||
for (size_t i = 0; i < values.size(); ++i)
|
for (size_t i = 0; i < values.size(); ++i)
|
||||||
{
|
{
|
||||||
if ( source->hasSubtype( values[i] ) && find(source->controller()->prowledTypes.begin(), source->controller()->prowledTypes.end(), values[i])==source->controller()->prowledTypes.end() )
|
if ( source->hasSubtype( values[i] ) && find(source->controller()->prowledTypes.begin(), source->controller()->prowledTypes.end(), values[i])==source->controller()->prowledTypes.end() )
|
||||||
|
|||||||
@@ -1111,61 +1111,154 @@ void GameObserver::Affinity()
|
|||||||
//memory snapshot shots pointed to this as such a heavy load that games with many cards inplay
|
//memory snapshot shots pointed to this as such a heavy load that games with many cards inplay
|
||||||
//would slow to a crawl.
|
//would slow to a crawl.
|
||||||
//only do any of the following if a card with the stated ability is in your hand.
|
//only do any of the following if a card with the stated ability is in your hand.
|
||||||
//kicker is an addon to normal cost, suspend is not casting. add cost as needed EXACTLY as seen below.
|
int color = 0;
|
||||||
card->getManaCost()->resetCosts();
|
string type = "";
|
||||||
ManaCost * newCost = NEW ManaCost();
|
|
||||||
newCost->copy(card->computeNewCost(card, card->getManaCost(), card->model->data->getManaCost()));
|
ManaCost * original = NEW ManaCost();
|
||||||
card->getManaCost()->copy(newCost);
|
original->copy(card->model->data->getManaCost());
|
||||||
SAFE_DELETE(newCost);
|
if(card->getIncreasedManaCost()->getConvertedCost()||card->getReducedManaCost()->getConvertedCost())
|
||||||
if (card->getManaCost()->getAlternative())
|
{//start1
|
||||||
|
if(card->getIncreasedManaCost()->getConvertedCost())
|
||||||
|
original->add(card->getIncreasedManaCost());
|
||||||
|
if(card->getReducedManaCost()->getConvertedCost())
|
||||||
|
original->remove(card->getReducedManaCost());
|
||||||
|
if(card->getManaCost())
|
||||||
|
card->getManaCost()->copy(original);
|
||||||
|
if(card->getManaCost()->extraCosts)
|
||||||
{
|
{
|
||||||
card->getManaCost()->getAlternative()->resetCosts();
|
for(unsigned int i = 0; i < card->getManaCost()->extraCosts->costs.size();i++)
|
||||||
ManaCost * newCost = NEW ManaCost();
|
{
|
||||||
newCost->copy(card->computeNewCost(card, card->getManaCost()->getAlternative(), card->model->data->getManaCost()->getAlternative()));
|
card->getManaCost()->extraCosts->costs[i]->setSource(card);
|
||||||
card->getManaCost()->getAlternative()->copy(newCost);
|
|
||||||
SAFE_DELETE(newCost);
|
|
||||||
}
|
}
|
||||||
if (card->getManaCost()->getBestow())
|
|
||||||
{
|
|
||||||
card->getManaCost()->getBestow()->resetCosts();
|
|
||||||
ManaCost * newCost = NEW ManaCost();
|
|
||||||
newCost->copy(card->computeNewCost(card, card->getManaCost()->getBestow(), card->model->data->getManaCost()->getBestow()));
|
|
||||||
card->getManaCost()->getBestow()->copy(newCost);
|
|
||||||
SAFE_DELETE(newCost);
|
|
||||||
}
|
}
|
||||||
if (card->getManaCost()->getRetrace())
|
}//end1
|
||||||
|
int reducem = 0;
|
||||||
|
bool resetCost = false;
|
||||||
|
for(unsigned int na = 0; na < card->cardsAbilities.size();na++)
|
||||||
|
{//start2
|
||||||
|
if (!card->cardsAbilities[na])
|
||||||
|
break;
|
||||||
|
ANewAffinity * newAff = dynamic_cast<ANewAffinity*>(card->cardsAbilities[na]);
|
||||||
|
if(newAff)
|
||||||
{
|
{
|
||||||
card->getManaCost()->getRetrace()->resetCosts();
|
if(!resetCost)
|
||||||
ManaCost * newCost = NEW ManaCost();
|
{
|
||||||
newCost->copy(card->computeNewCost(card, card->getManaCost()->getRetrace(), card->model->data->getManaCost()->getRetrace()));
|
resetCost = true;
|
||||||
card->getManaCost()->getRetrace()->copy(newCost);
|
card->getManaCost()->copy(original);
|
||||||
SAFE_DELETE(newCost);
|
if(card->getManaCost()->extraCosts)
|
||||||
|
{
|
||||||
|
for(unsigned int i = 0; i < card->getManaCost()->extraCosts->costs.size();i++)
|
||||||
|
{
|
||||||
|
card->getManaCost()->extraCosts->costs[i]->setSource(card);
|
||||||
}
|
}
|
||||||
if (card->getManaCost()->getBuyback())
|
|
||||||
{
|
|
||||||
card->getManaCost()->getBuyback()->resetCosts();
|
|
||||||
ManaCost * newCost = NEW ManaCost();
|
|
||||||
newCost->copy(card->computeNewCost(card, card->getManaCost()->getBuyback(), card->model->data->getManaCost()->getBuyback()));
|
|
||||||
card->getManaCost()->getBuyback()->copy(newCost);
|
|
||||||
SAFE_DELETE(newCost);
|
|
||||||
}
|
}
|
||||||
if (card->getManaCost()->getFlashback())
|
|
||||||
{
|
|
||||||
card->getManaCost()->getFlashback()->resetCosts();
|
|
||||||
ManaCost * newCost = NEW ManaCost();
|
|
||||||
newCost->copy(card->computeNewCost(card, card->getManaCost()->getFlashback(), card->model->data->getManaCost()->getFlashback()));
|
|
||||||
card->getManaCost()->getFlashback()->copy(newCost);
|
|
||||||
SAFE_DELETE(newCost);
|
|
||||||
}
|
}
|
||||||
if (card->getManaCost()->getMorph())
|
TargetChooserFactory tf(this);
|
||||||
|
TargetChooser * tcn = tf.createTargetChooser(newAff->tcString,card,NULL);
|
||||||
|
|
||||||
|
for (int w = 0; w < 2; ++w)
|
||||||
{
|
{
|
||||||
card->getManaCost()->getMorph()->resetCosts();
|
Player *p = this->players[w];
|
||||||
ManaCost * newCost = NEW ManaCost();
|
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->stack, p->game->exile };
|
||||||
newCost->copy(card->computeNewCost(card, card->getManaCost()->getMorph(), card->model->data->getManaCost()->getMorph()));
|
for (int k = 0; k < 6; k++)
|
||||||
card->getManaCost()->getMorph()->copy(newCost);
|
{
|
||||||
SAFE_DELETE(newCost);
|
MTGGameZone * z = zones[k];
|
||||||
|
if (tcn->targetsZone(z))
|
||||||
|
{
|
||||||
|
reducem += z->countByCanTarget(tcn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SAFE_DELETE(tcn);
|
||||||
|
ManaCost * removingCost = ManaCost::parseManaCost(newAff->manaString);
|
||||||
|
for(int j = 0; j < reducem; j++)
|
||||||
|
card->getManaCost()->remove(removingCost);
|
||||||
|
SAFE_DELETE(removingCost);
|
||||||
|
}
|
||||||
|
}//end2
|
||||||
|
if(card->has(Constants::AFFINITYARTIFACTS)||
|
||||||
|
card->has(Constants::AFFINITYFOREST)||
|
||||||
|
card->has(Constants::AFFINITYGREENCREATURES)||
|
||||||
|
card->has(Constants::AFFINITYISLAND)||
|
||||||
|
card->has(Constants::AFFINITYMOUNTAIN)||
|
||||||
|
card->has(Constants::AFFINITYPLAINS)||
|
||||||
|
card->has(Constants::AFFINITYSWAMP))
|
||||||
|
{//start3
|
||||||
|
if (card->has(Constants::AFFINITYARTIFACTS))
|
||||||
|
{
|
||||||
|
type = "artifact";
|
||||||
|
}
|
||||||
|
else if (card->has(Constants::AFFINITYSWAMP))
|
||||||
|
{
|
||||||
|
type = "swamp";
|
||||||
|
}
|
||||||
|
else if (card->has(Constants::AFFINITYMOUNTAIN))
|
||||||
|
{
|
||||||
|
type = "mountain";
|
||||||
|
}
|
||||||
|
else if (card->has(Constants::AFFINITYPLAINS))
|
||||||
|
{
|
||||||
|
type = "plains";
|
||||||
|
}
|
||||||
|
else if (card->has(Constants::AFFINITYISLAND))
|
||||||
|
{
|
||||||
|
type = "island";
|
||||||
|
}
|
||||||
|
else if (card->has(Constants::AFFINITYFOREST))
|
||||||
|
{
|
||||||
|
type = "forest";
|
||||||
|
}
|
||||||
|
else if (card->has(Constants::AFFINITYGREENCREATURES))
|
||||||
|
{
|
||||||
|
color = 1;
|
||||||
|
type = "creature";
|
||||||
|
}
|
||||||
|
card->getManaCost()->copy(original);
|
||||||
|
if(card->getManaCost()->extraCosts)
|
||||||
|
{
|
||||||
|
for(unsigned int i = 0; i < card->getManaCost()->extraCosts->costs.size();i++)
|
||||||
|
{
|
||||||
|
card->getManaCost()->extraCosts->costs[i]->setSource(card);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int reduce = 0;
|
||||||
|
if(card->has(Constants::AFFINITYGREENCREATURES))
|
||||||
|
{
|
||||||
|
TargetChooserFactory tf(this);
|
||||||
|
TargetChooser * tc = tf.createTargetChooser("creature[green]",NULL);
|
||||||
|
reduce = card->controller()->game->battlefield->countByCanTarget(tc);
|
||||||
|
SAFE_DELETE(tc);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reduce = card->controller()->game->battlefield->countByType(type);
|
||||||
|
}
|
||||||
|
for(int i = 0; i < reduce;i++)
|
||||||
|
{
|
||||||
|
if(card->getManaCost()->getCost(color) > 0)
|
||||||
|
card->getManaCost()->remove(color,1);
|
||||||
|
}
|
||||||
|
}//end3
|
||||||
|
//trinisphere... now how to implement kicker recomputation
|
||||||
|
|
||||||
|
if(card->has(Constants::TRINISPHERE))
|
||||||
|
{
|
||||||
|
for(int jj = card->getManaCost()->getConvertedCost(); jj < 3; jj++)
|
||||||
|
{
|
||||||
|
card->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT, 1);
|
||||||
|
card->countTrini++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(card->countTrini)
|
||||||
|
{
|
||||||
|
card->getManaCost()->remove(Constants::MTG_COLOR_ARTIFACT, card->countTrini);
|
||||||
|
card->countTrini=0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SAFE_DELETE(original);
|
||||||
}//end
|
}//end
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -961,156 +961,121 @@ JQuadPtr MTGCardInstance::getIcon()
|
|||||||
return WResourceManager::Instance()->RetrieveCard(this, CACHE_THUMB);
|
return WResourceManager::Instance()->RetrieveCard(this, CACHE_THUMB);
|
||||||
}
|
}
|
||||||
|
|
||||||
ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * Cost, ManaCost * Data, bool noTrinisphere)
|
ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * newCost, ManaCost * refCost, bool noTrinisphere)
|
||||||
{
|
{
|
||||||
|
if(!card)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if(card->getIncreasedManaCost()->getConvertedCost())
|
||||||
|
newCost->add(card->getIncreasedManaCost());
|
||||||
|
if(card->getReducedManaCost()->getConvertedCost())
|
||||||
|
newCost->remove(card->getReducedManaCost());
|
||||||
|
if(refCost->extraCosts)
|
||||||
|
newCost->extraCosts = refCost->extraCosts;
|
||||||
|
//affinity
|
||||||
int color = 0;
|
int color = 0;
|
||||||
string type = "";
|
string type = "";
|
||||||
ManaCost * original = NEW ManaCost();
|
ManaCost * original = NEW ManaCost();
|
||||||
original->copy(Data);
|
original->copy(newCost);
|
||||||
if (card->getIncreasedManaCost()->getConvertedCost() || card->getReducedManaCost()->getConvertedCost())
|
|
||||||
{//start1
|
|
||||||
if (card->getIncreasedManaCost()->getConvertedCost())
|
|
||||||
original->add(card->getIncreasedManaCost());
|
|
||||||
if (card->getReducedManaCost()->getConvertedCost())
|
|
||||||
original->remove(card->getReducedManaCost());
|
|
||||||
|
|
||||||
Cost->copy(original);
|
|
||||||
if (Cost->extraCosts)
|
|
||||||
{
|
|
||||||
for (unsigned int i = 0; i < Cost->extraCosts->costs.size(); i++)
|
|
||||||
{
|
|
||||||
Cost->extraCosts->costs[i]->setSource(card);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}//end1
|
|
||||||
int reducem = 0;
|
int reducem = 0;
|
||||||
bool resetCost = false;
|
bool resetCost = false;
|
||||||
for (unsigned int na = 0; na < card->cardsAbilities.size(); na++)
|
for(unsigned int na = 0; na < card->cardsAbilities.size();na++)
|
||||||
{//start2
|
{//start2
|
||||||
if (!card->cardsAbilities[na])
|
|
||||||
break;
|
|
||||||
ANewAffinity * newAff = dynamic_cast<ANewAffinity*>(card->cardsAbilities[na]);
|
ANewAffinity * newAff = dynamic_cast<ANewAffinity*>(card->cardsAbilities[na]);
|
||||||
if (newAff)
|
if(newAff)
|
||||||
{
|
{
|
||||||
if (!resetCost)
|
if(!resetCost)
|
||||||
{
|
{
|
||||||
resetCost = true;
|
resetCost = true;
|
||||||
Cost->copy(original);
|
newCost->copy(original);
|
||||||
if (Cost->extraCosts)
|
|
||||||
{
|
|
||||||
for (unsigned int i = 0; i < Cost->extraCosts->costs.size(); i++)
|
|
||||||
{
|
|
||||||
Cost->extraCosts->costs[i]->setSource(card);
|
|
||||||
}
|
}
|
||||||
}
|
TargetChooserFactory tf(observer);
|
||||||
}
|
TargetChooser * tcn = tf.createTargetChooser(newAff->tcString,card,NULL);
|
||||||
TargetChooserFactory tf(getObserver());
|
|
||||||
TargetChooser * tcn = tf.createTargetChooser(newAff->tcString, card, NULL);
|
|
||||||
|
|
||||||
for (int w = 0; w < 2; ++w)
|
for (int w = 0; w < 2; ++w)
|
||||||
{
|
{
|
||||||
Player *p = getObserver()->players[w];
|
Player *p = observer->players[w];
|
||||||
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->stack, p->game->exile };
|
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->stack, p->game->exile };
|
||||||
for (int k = 0; k < 6; k++)
|
for (int k = 0; k < 6; k++)
|
||||||
{
|
{
|
||||||
MTGGameZone * z = zones[k];
|
MTGGameZone * z = zones[k];
|
||||||
if (tcn->targetsZone(z))
|
if (tcn->targetsZone(z))
|
||||||
{
|
|
||||||
reducem += z->countByCanTarget(tcn);
|
reducem += z->countByCanTarget(tcn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
SAFE_DELETE(tcn);
|
SAFE_DELETE(tcn);
|
||||||
ManaCost * removingCost = ManaCost::parseManaCost(newAff->manaString);
|
ManaCost * removingCost = ManaCost::parseManaCost(newAff->manaString);
|
||||||
for (int j = 0; j < reducem; j++)
|
for(int j = 0; j < reducem; j++)
|
||||||
original->remove(removingCost);
|
newCost->remove(removingCost);
|
||||||
SAFE_DELETE(removingCost);
|
SAFE_DELETE(removingCost);
|
||||||
}
|
}
|
||||||
}//end2
|
}//end2
|
||||||
if (card->has(Constants::AFFINITYARTIFACTS) ||
|
if(card->has(Constants::AFFINITYARTIFACTS)||
|
||||||
card->has(Constants::AFFINITYFOREST) ||
|
card->has(Constants::AFFINITYFOREST)||
|
||||||
card->has(Constants::AFFINITYGREENCREATURES) ||
|
card->has(Constants::AFFINITYGREENCREATURES)||
|
||||||
card->has(Constants::AFFINITYISLAND) ||
|
card->has(Constants::AFFINITYISLAND)||
|
||||||
card->has(Constants::AFFINITYMOUNTAIN) ||
|
card->has(Constants::AFFINITYMOUNTAIN)||
|
||||||
card->has(Constants::AFFINITYPLAINS) ||
|
card->has(Constants::AFFINITYPLAINS)||
|
||||||
card->has(Constants::AFFINITYSWAMP))
|
card->has(Constants::AFFINITYSWAMP))
|
||||||
{//start3
|
{//start3
|
||||||
if (card->has(Constants::AFFINITYARTIFACTS))
|
if (card->has(Constants::AFFINITYARTIFACTS))
|
||||||
{
|
|
||||||
type = "artifact";
|
type = "artifact";
|
||||||
}
|
|
||||||
else if (card->has(Constants::AFFINITYSWAMP))
|
else if (card->has(Constants::AFFINITYSWAMP))
|
||||||
{
|
|
||||||
type = "swamp";
|
type = "swamp";
|
||||||
}
|
|
||||||
else if (card->has(Constants::AFFINITYMOUNTAIN))
|
else if (card->has(Constants::AFFINITYMOUNTAIN))
|
||||||
{
|
|
||||||
type = "mountain";
|
type = "mountain";
|
||||||
}
|
|
||||||
else if (card->has(Constants::AFFINITYPLAINS))
|
else if (card->has(Constants::AFFINITYPLAINS))
|
||||||
{
|
|
||||||
type = "plains";
|
type = "plains";
|
||||||
}
|
|
||||||
else if (card->has(Constants::AFFINITYISLAND))
|
else if (card->has(Constants::AFFINITYISLAND))
|
||||||
{
|
|
||||||
type = "island";
|
type = "island";
|
||||||
}
|
|
||||||
else if (card->has(Constants::AFFINITYFOREST))
|
else if (card->has(Constants::AFFINITYFOREST))
|
||||||
{
|
|
||||||
type = "forest";
|
type = "forest";
|
||||||
}
|
|
||||||
else if (card->has(Constants::AFFINITYGREENCREATURES))
|
else if (card->has(Constants::AFFINITYGREENCREATURES))
|
||||||
{
|
{
|
||||||
color = 1;
|
color = 1;
|
||||||
type = "creature";
|
type = "creature";
|
||||||
}
|
}
|
||||||
|
newCost->copy(original);
|
||||||
Cost->copy(original);
|
|
||||||
if (Cost->extraCosts)
|
|
||||||
{
|
|
||||||
for (unsigned int i = 0; i < Cost->extraCosts->costs.size(); i++)
|
|
||||||
{
|
|
||||||
Cost->extraCosts->costs[i]->setSource(card);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int reduce = 0;
|
int reduce = 0;
|
||||||
if (card->has(Constants::AFFINITYGREENCREATURES))
|
if(card->has(Constants::AFFINITYGREENCREATURES))
|
||||||
{
|
{
|
||||||
TargetChooserFactory tf(getObserver());
|
TargetChooserFactory tf(observer);
|
||||||
TargetChooser * tc = tf.createTargetChooser("creature[green]", NULL);
|
TargetChooser * tc = tf.createTargetChooser("creature[green]",NULL);
|
||||||
reduce = card->controller()->game->battlefield->countByCanTarget(tc);
|
reduce = card->controller()->game->battlefield->countByCanTarget(tc);
|
||||||
SAFE_DELETE(tc);
|
SAFE_DELETE(tc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
reduce = card->controller()->game->battlefield->countByType(type);
|
reduce = card->controller()->game->battlefield->countByType(type);
|
||||||
}
|
for(int i = 0; i < reduce;i++)
|
||||||
for (int i = 0; i < reduce; i++)
|
if(newCost->getCost(color) > 0)
|
||||||
{
|
newCost->remove(color,1);
|
||||||
if (Cost->getCost(color) > 0)
|
|
||||||
Cost->remove(color, 1);
|
|
||||||
}
|
|
||||||
}//end3
|
}//end3
|
||||||
//trinisphere... now how to implement kicker recomputation
|
|
||||||
|
|
||||||
if (card->has(Constants::TRINISPHERE))
|
if(!noTrinisphere)
|
||||||
{
|
{
|
||||||
for (int jj = Cost->getConvertedCost(); jj < 3; jj++)
|
//trinisphere... now how to implement kicker recomputation
|
||||||
|
if(card->has(Constants::TRINISPHERE))
|
||||||
{
|
{
|
||||||
Cost->add(Constants::MTG_COLOR_ARTIFACT, 1);
|
for(int jj = newCost->getConvertedCost(); jj < 3; jj++)
|
||||||
|
{
|
||||||
|
newCost->add(Constants::MTG_COLOR_ARTIFACT, 1);
|
||||||
card->countTrini++;
|
card->countTrini++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (card->countTrini)
|
if(card->countTrini)
|
||||||
{
|
{
|
||||||
Cost->remove(Constants::MTG_COLOR_ARTIFACT, card->countTrini);
|
newCost->remove(Constants::MTG_COLOR_ARTIFACT, card->countTrini);
|
||||||
card->countTrini = 0;
|
card->countTrini=0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SAFE_DELETE(original);
|
SAFE_DELETE(original);
|
||||||
return Cost;
|
|
||||||
|
return newCost;
|
||||||
}
|
}
|
||||||
|
|
||||||
MTGCardInstance * MTGCardInstance::getNextPartner()
|
MTGCardInstance * MTGCardInstance::getNextPartner()
|
||||||
|
|||||||
@@ -49,10 +49,6 @@ PermanentAbility(observer, _id)
|
|||||||
Angel[i] = 0;
|
Angel[i] = 0;
|
||||||
dragonbonusgranted[i] = false;
|
dragonbonusgranted[i] = false;
|
||||||
dragon[i] = 0;
|
dragon[i] = 0;
|
||||||
eldrazibonusgranted[i] = false;
|
|
||||||
eldrazi[i] = 0;
|
|
||||||
werewolfbonusgranted[i] = false;
|
|
||||||
werewolf[i] = 0;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -175,10 +171,6 @@ int MTGEventBonus::receiveEvent(WEvent * event)
|
|||||||
Angel[currentPlayer->getId()]++;
|
Angel[currentPlayer->getId()]++;
|
||||||
if(e->card->hasType("dragon")||e->card->hasType("wurm")||e->card->hasType("drake")||e->card->hasType("snake")||e->card->hasType("hydra"))
|
if(e->card->hasType("dragon")||e->card->hasType("wurm")||e->card->hasType("drake")||e->card->hasType("snake")||e->card->hasType("hydra"))
|
||||||
dragon[currentPlayer->getId()]++;
|
dragon[currentPlayer->getId()]++;
|
||||||
if (e->card->hasType("eldrazi"))
|
|
||||||
eldrazi[currentPlayer->getId()]++;
|
|
||||||
if (e->card->hasType("werewolf") || e->card->hasType("wolf"))
|
|
||||||
werewolf[currentPlayer->getId()]++;
|
|
||||||
}
|
}
|
||||||
if(toys[currentPlayer->getId()] > 30 && !toybonusgranted[currentPlayer->getId()])
|
if(toys[currentPlayer->getId()] > 30 && !toybonusgranted[currentPlayer->getId()])
|
||||||
{
|
{
|
||||||
@@ -236,16 +228,6 @@ int MTGEventBonus::receiveEvent(WEvent * event)
|
|||||||
grantAward("Teeth And Scales!",300);
|
grantAward("Teeth And Scales!",300);
|
||||||
dragonbonusgranted[currentPlayer->getId()] = true;
|
dragonbonusgranted[currentPlayer->getId()] = true;
|
||||||
}
|
}
|
||||||
if (eldrazi[currentPlayer->getId()] > 30 && !eldrazibonusgranted[currentPlayer->getId()])
|
|
||||||
{
|
|
||||||
grantAward("Colorblind!", 300);
|
|
||||||
eldrazibonusgranted[currentPlayer->getId()] = true;
|
|
||||||
}
|
|
||||||
if (werewolf[currentPlayer->getId()] > 30 && !werewolfbonusgranted[currentPlayer->getId()])
|
|
||||||
{
|
|
||||||
grantAward("Full Moon!", 300);
|
|
||||||
werewolfbonusgranted[currentPlayer->getId()] = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//bonus for dealing 100+ damage from a single source
|
//bonus for dealing 100+ damage from a single source
|
||||||
@@ -709,7 +691,7 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *
|
|||||||
return 0;//overload has its own rule
|
return 0;//overload has its own rule
|
||||||
if(!card->getManaCost()->getAlternative())
|
if(!card->getManaCost()->getAlternative())
|
||||||
return 0;
|
return 0;
|
||||||
ManaCost * alternateCost = card->getManaCost()->getAlternative();
|
ManaCost * alternateCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getAlternative()),card->getManaCost()->getAlternative());
|
||||||
if(alternateCost->extraCosts)
|
if(alternateCost->extraCosts)
|
||||||
for(unsigned int i = 0; i < alternateCost->extraCosts->costs.size();i++)
|
for(unsigned int i = 0; i < alternateCost->extraCosts->costs.size();i++)
|
||||||
{
|
{
|
||||||
@@ -773,7 +755,7 @@ int MTGAlternativeCostRule::reactToClick(MTGCardInstance * card)
|
|||||||
if ( !isReactingToClick(card))
|
if ( !isReactingToClick(card))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ManaCost * alternateCost = card->getManaCost()->getAlternative();
|
ManaCost * alternateCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getAlternative()),card->getManaCost()->getAlternative());
|
||||||
card->paymenttype = MTGAbility::ALTERNATIVE_COST;
|
card->paymenttype = MTGAbility::ALTERNATIVE_COST;
|
||||||
if(alternateCost->extraCosts)
|
if(alternateCost->extraCosts)
|
||||||
for(unsigned int i = 0; i < alternateCost->extraCosts->costs.size();i++)
|
for(unsigned int i = 0; i < alternateCost->extraCosts->costs.size();i++)
|
||||||
@@ -942,7 +924,7 @@ int MTGBuyBackRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
|||||||
return 0;
|
return 0;
|
||||||
if(!card->getManaCost()->getBuyback())
|
if(!card->getManaCost()->getBuyback())
|
||||||
return 0;
|
return 0;
|
||||||
ManaCost * buybackCost = card->getManaCost()->getBuyback();
|
ManaCost * buybackCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getBuyback()),card->getManaCost()->getBuyback());
|
||||||
if(buybackCost->extraCosts)
|
if(buybackCost->extraCosts)
|
||||||
for(unsigned int i = 0; i < buybackCost->extraCosts->costs.size();i++)
|
for(unsigned int i = 0; i < buybackCost->extraCosts->costs.size();i++)
|
||||||
{
|
{
|
||||||
@@ -956,7 +938,7 @@ int MTGBuyBackRule::reactToClick(MTGCardInstance * card)
|
|||||||
if (!isReactingToClick(card))
|
if (!isReactingToClick(card))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ManaCost * buybackCost = card->getManaCost()->getBuyback();
|
ManaCost * buybackCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getBuyback()),card->getManaCost()->getBuyback());
|
||||||
if(buybackCost->extraCosts)
|
if(buybackCost->extraCosts)
|
||||||
for(unsigned int i = 0; i < buybackCost->extraCosts->costs.size();i++)
|
for(unsigned int i = 0; i < buybackCost->extraCosts->costs.size();i++)
|
||||||
{
|
{
|
||||||
@@ -996,7 +978,7 @@ int MTGFlashBackRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
|||||||
return 0;
|
return 0;
|
||||||
if(!card->getManaCost()->getFlashback())
|
if(!card->getManaCost()->getFlashback())
|
||||||
return 0;
|
return 0;
|
||||||
ManaCost * flashbackCost = card->getManaCost()->getFlashback();
|
ManaCost * flashbackCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getFlashback()),card->getManaCost()->getFlashback());
|
||||||
if(flashbackCost->extraCosts)
|
if(flashbackCost->extraCosts)
|
||||||
for(unsigned int i = 0; i < flashbackCost->extraCosts->costs.size();i++)
|
for(unsigned int i = 0; i < flashbackCost->extraCosts->costs.size();i++)
|
||||||
{
|
{
|
||||||
@@ -1007,7 +989,7 @@ int MTGFlashBackRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
|||||||
|
|
||||||
int MTGFlashBackRule::reactToClick(MTGCardInstance * card)
|
int MTGFlashBackRule::reactToClick(MTGCardInstance * card)
|
||||||
{
|
{
|
||||||
ManaCost * flashbackCost = card->getManaCost()->getFlashback();
|
ManaCost * flashbackCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getFlashback()),card->getManaCost()->getFlashback());
|
||||||
if(flashbackCost->extraCosts)
|
if(flashbackCost->extraCosts)
|
||||||
for(unsigned int i = 0; i < flashbackCost->extraCosts->costs.size();i++)
|
for(unsigned int i = 0; i < flashbackCost->extraCosts->costs.size();i++)
|
||||||
{
|
{
|
||||||
@@ -1049,17 +1031,17 @@ int MTGRetraceRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
|||||||
Player * player = game->currentlyActing();
|
Player * player = game->currentlyActing();
|
||||||
if(!card->getManaCost()->getRetrace())
|
if(!card->getManaCost()->getRetrace())
|
||||||
return 0;
|
return 0;
|
||||||
if (!player->game->graveyard->hasCard(card))
|
ManaCost * retraceCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getRetrace()),card->getManaCost()->getRetrace());
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
auto retraceCost = card->getManaCost()->getRetrace();
|
|
||||||
if(retraceCost->extraCosts)
|
if(retraceCost->extraCosts)
|
||||||
for(unsigned int i = 0; i < retraceCost->extraCosts->costs.size();i++)
|
for(unsigned int i = 0; i < retraceCost->extraCosts->costs.size();i++)
|
||||||
{
|
{
|
||||||
retraceCost->extraCosts->costs[i]->setSource(card);
|
retraceCost->extraCosts->costs[i]->setSource(card);
|
||||||
}
|
}
|
||||||
return MTGAlternativeCostRule::isReactingToClick( card, mana, retraceCost);
|
|
||||||
|
if (!player->game->graveyard->hasCard(card))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return MTGAlternativeCostRule::isReactingToClick( card, mana, retraceCost );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1068,7 +1050,7 @@ int MTGRetraceRule::reactToClick(MTGCardInstance * card)
|
|||||||
if (!isReactingToClick(card))
|
if (!isReactingToClick(card))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ManaCost * retraceCost = card->getManaCost()->getRetrace();
|
ManaCost * retraceCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getRetrace()),card->getManaCost()->getRetrace());
|
||||||
if(retraceCost->extraCosts)
|
if(retraceCost->extraCosts)
|
||||||
for(unsigned int i = 0; i < retraceCost->extraCosts->costs.size();i++)
|
for(unsigned int i = 0; i < retraceCost->extraCosts->costs.size();i++)
|
||||||
{
|
{
|
||||||
@@ -1245,7 +1227,7 @@ int MTGMorphCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
|
|||||||
if (card->controller()->game->playRestrictions->canPutIntoZone(card, card->controller()->game->stack) == PlayRestriction::CANT_PLAY)
|
if (card->controller()->game->playRestrictions->canPutIntoZone(card, card->controller()->game->stack) == PlayRestriction::CANT_PLAY)
|
||||||
return 0;
|
return 0;
|
||||||
ManaCost * playerMana = player->getManaPool();
|
ManaCost * playerMana = player->getManaPool();
|
||||||
ManaCost * morph = card->getManaCost()->getMorph();
|
ManaCost * morph = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getMorph()),card->getManaCost()->getMorph());
|
||||||
if(morph->extraCosts)
|
if(morph->extraCosts)
|
||||||
for(unsigned int i = 0; i < morph->extraCosts->costs.size();i++)
|
for(unsigned int i = 0; i < morph->extraCosts->costs.size();i++)
|
||||||
{
|
{
|
||||||
@@ -1274,7 +1256,7 @@ int MTGMorphCostRule::reactToClick(MTGCardInstance * card)
|
|||||||
Player * player = game->currentlyActing();
|
Player * player = game->currentlyActing();
|
||||||
ManaCost * cost = card->getManaCost();
|
ManaCost * cost = card->getManaCost();
|
||||||
ManaCost * playerMana = player->getManaPool();
|
ManaCost * playerMana = player->getManaPool();
|
||||||
ManaCost * morph = card->getManaCost()->getMorph();
|
ManaCost * morph = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getMorph()),card->getManaCost()->getMorph());
|
||||||
if(morph->extraCosts)
|
if(morph->extraCosts)
|
||||||
for(unsigned int i = 0; i < morph->extraCosts->costs.size();i++)
|
for(unsigned int i = 0; i < morph->extraCosts->costs.size();i++)
|
||||||
{
|
{
|
||||||
@@ -1364,26 +1346,23 @@ MTGAlternativeCostRule(observer, _id)
|
|||||||
|
|
||||||
int MTGPayZeroRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
int MTGPayZeroRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
||||||
{
|
{
|
||||||
if (!card->has(Constants::PAYZERO))
|
if(!card->has(Constants::PAYZERO))
|
||||||
return 0;
|
return 0;
|
||||||
Player * player = game->currentlyActing();
|
Player * player = game->currentlyActing();
|
||||||
if (card->isLand() || (!player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card)))
|
ManaCost * cost = NEW ManaCost(ManaCost::parseManaCost("{0}",NULL,NULL));
|
||||||
{
|
ManaCost * newCost = card->computeNewCost(card,cost,cost);
|
||||||
//only allowed to pay zero for cards in library??? above is "if you dont have it in hand, grave, or exile"
|
if(newCost->extraCosts)
|
||||||
return 0;
|
for(unsigned int i = 0; i < newCost->extraCosts->costs.size();i++)
|
||||||
}
|
|
||||||
if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card)) || (!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card)))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
ManaCost * cost = NEW ManaCost(ManaCost::parseManaCost("{0}", NULL, NULL));
|
|
||||||
ManaCost * newCost = card->computeNewCost(card, cost, cost);
|
|
||||||
SAFE_DELETE(cost);
|
|
||||||
if (newCost->extraCosts)
|
|
||||||
for (unsigned int i = 0; i < newCost->extraCosts->costs.size(); i++)
|
|
||||||
{
|
{
|
||||||
newCost->extraCosts->costs[i]->setSource(card);
|
newCost->extraCosts->costs[i]->setSource(card);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(card->isLand())
|
||||||
|
return 0;
|
||||||
|
if (!player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card))
|
||||||
|
return 0;
|
||||||
|
if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card)))
|
||||||
|
return 0;
|
||||||
if(card->has(Constants::CANPLAYFROMGRAVEYARD))
|
if(card->has(Constants::CANPLAYFROMGRAVEYARD))
|
||||||
CustomName = "Zero Cast From Graveyard";
|
CustomName = "Zero Cast From Graveyard";
|
||||||
else if(card->has(Constants::CANPLAYFROMEXILE))
|
else if(card->has(Constants::CANPLAYFROMEXILE))
|
||||||
@@ -1433,26 +1412,22 @@ int MTGOverloadRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
|||||||
{
|
{
|
||||||
if (!card->has(Constants::OVERLOAD))
|
if (!card->has(Constants::OVERLOAD))
|
||||||
return 0;
|
return 0;
|
||||||
if (card->isLand())
|
Player * player = game->currentlyActing();
|
||||||
{
|
ManaCost * cost = NEW ManaCost(card->model->data->getManaCost()->getAlternative());
|
||||||
return 0;
|
ManaCost * newCost = card->computeNewCost(card,cost,cost);
|
||||||
}
|
|
||||||
Player * player = card->controller();
|
|
||||||
if (!player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card)) || (!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card)))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
ManaCost * newCost = card->getManaCost()->getAlternative();
|
|
||||||
if(newCost->extraCosts)
|
if(newCost->extraCosts)
|
||||||
for(unsigned int i = 0; i < newCost->extraCosts->costs.size();i++)
|
for(unsigned int i = 0; i < newCost->extraCosts->costs.size();i++)
|
||||||
{
|
{
|
||||||
newCost->extraCosts->costs[i]->setSource(card);
|
newCost->extraCosts->costs[i]->setSource(card);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (card->isLand())
|
||||||
|
return 0;
|
||||||
|
if (!player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card))
|
||||||
|
return 0;
|
||||||
|
if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
return MTGAlternativeCostRule::isReactingToClick(card, mana, newCost);
|
return MTGAlternativeCostRule::isReactingToClick(card, mana, newCost);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1462,7 +1437,7 @@ int MTGOverloadRule::reactToClick(MTGCardInstance * card)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ManaCost * cost = NEW ManaCost(card->model->data->getManaCost()->getAlternative());
|
ManaCost * cost = NEW ManaCost(card->model->data->getManaCost()->getAlternative());
|
||||||
ManaCost * newCost = card->getManaCost()->getAlternative();
|
ManaCost * newCost = card->computeNewCost(card,cost,cost);
|
||||||
if(newCost->extraCosts)
|
if(newCost->extraCosts)
|
||||||
for(unsigned int i = 0; i < newCost->extraCosts->costs.size();i++)
|
for(unsigned int i = 0; i < newCost->extraCosts->costs.size();i++)
|
||||||
{
|
{
|
||||||
@@ -1496,24 +1471,23 @@ int MTGBestowRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
|||||||
{
|
{
|
||||||
if (!card->model)
|
if (!card->model)
|
||||||
return 0;
|
return 0;
|
||||||
|
//Player * player = game->currentlyActing();
|
||||||
if (!card->model->data->getManaCost()->getBestow())
|
if (!card->model->data->getManaCost()->getBestow())
|
||||||
return 0;
|
return 0;
|
||||||
if (card->isInPlay(game))
|
if (card->isInPlay(game))
|
||||||
return 0;
|
return 0;
|
||||||
if (card->isLand())
|
ManaCost * cost = NEW ManaCost(card->model->data->getManaCost()->getBestow());
|
||||||
{
|
ManaCost * newCost = card->computeNewCost(card, cost, cost);
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (!card->controller()->inPlay()->hasType("creature") && !card->controller()->opponent()->inPlay()->hasType("creature"))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
ManaCost * newCost = card->getManaCost()->getBestow();
|
|
||||||
if (newCost->extraCosts)
|
if (newCost->extraCosts)
|
||||||
for (unsigned int i = 0; i < newCost->extraCosts->costs.size(); i++)
|
for (unsigned int i = 0; i < newCost->extraCosts->costs.size(); i++)
|
||||||
{
|
{
|
||||||
newCost->extraCosts->costs[i]->setSource(card);
|
newCost->extraCosts->costs[i]->setSource(card);
|
||||||
}
|
}
|
||||||
|
SAFE_DELETE(cost);
|
||||||
|
if (card->isLand())
|
||||||
|
return 0;
|
||||||
|
if (!card->controller()->inPlay()->hasType("creature") && !card->controller()->opponent()->inPlay()->hasType("creature"))
|
||||||
|
return 0;
|
||||||
return MTGAlternativeCostRule::isReactingToClick(card, mana, newCost);
|
return MTGAlternativeCostRule::isReactingToClick(card, mana, newCost);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1523,7 +1497,8 @@ int MTGBestowRule::reactToClick(MTGCardInstance * card)
|
|||||||
return 0;
|
return 0;
|
||||||
//this new method below in all alternative cost type causes a memleak, however, you cant safedelete the cost here as it cause a crash
|
//this new method below in all alternative cost type causes a memleak, however, you cant safedelete the cost here as it cause a crash
|
||||||
//TODO::::we need to get to the source of this leak and fix it.
|
//TODO::::we need to get to the source of this leak and fix it.
|
||||||
ManaCost * newCost = card->getManaCost()->getBestow();
|
ManaCost * cost = NEW ManaCost(card->model->data->getManaCost()->getBestow());
|
||||||
|
ManaCost * newCost = card->computeNewCost(card, cost, cost);
|
||||||
|
|
||||||
if (newCost->extraCosts)
|
if (newCost->extraCosts)
|
||||||
for (unsigned int i = 0; i < newCost->extraCosts->costs.size(); i++)
|
for (unsigned int i = 0; i < newCost->extraCosts->costs.size(); i++)
|
||||||
@@ -2902,7 +2877,6 @@ int MTGPersistRule::receiveEvent(WEvent * event)
|
|||||||
}
|
}
|
||||||
AAMover *putinplay = NEW AAMover(game, game->mLayers->actionLayer()->getMaxId(), copy, copy,"ownerbattlefield",code,NULL,undying,persist);
|
AAMover *putinplay = NEW AAMover(game, game->mLayers->actionLayer()->getMaxId(), copy, copy,"ownerbattlefield",code,NULL,undying,persist);
|
||||||
putinplay->oneShot = true;
|
putinplay->oneShot = true;
|
||||||
game->mLayers->actionLayer()->garbage.push_back(putinplay);
|
|
||||||
putinplay->fireAbility();
|
putinplay->fireAbility();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -390,8 +390,9 @@ ManaCost::ManaCost(ManaCost * manaCost)
|
|||||||
cost[i] = manaCost->getCost(i);
|
cost[i] = manaCost->getCost(i);
|
||||||
}
|
}
|
||||||
hybrids = manaCost->hybrids;
|
hybrids = manaCost->hybrids;
|
||||||
kicker = NEW ManaCost(manaCost->kicker);
|
|
||||||
if (kicker)
|
kicker = NEW ManaCost( manaCost->kicker );
|
||||||
|
if(kicker)
|
||||||
kicker->isMulti = manaCost->isMulti;
|
kicker->isMulti = manaCost->isMulti;
|
||||||
Retrace = NEW ManaCost( manaCost->Retrace );
|
Retrace = NEW ManaCost( manaCost->Retrace );
|
||||||
BuyBack = NEW ManaCost( manaCost->BuyBack );
|
BuyBack = NEW ManaCost( manaCost->BuyBack );
|
||||||
@@ -400,11 +401,8 @@ ManaCost::ManaCost(ManaCost * manaCost)
|
|||||||
morph = NEW ManaCost( manaCost->morph );
|
morph = NEW ManaCost( manaCost->morph );
|
||||||
suspend = NEW ManaCost( manaCost->suspend );
|
suspend = NEW ManaCost( manaCost->suspend );
|
||||||
Bestow = NEW ManaCost(manaCost->Bestow);
|
Bestow = NEW ManaCost(manaCost->Bestow);
|
||||||
extraCosts = NULL;
|
|
||||||
if (manaCost->extraCosts)
|
extraCosts = manaCost->extraCosts ? manaCost->extraCosts->clone() : NULL;
|
||||||
{
|
|
||||||
extraCosts = manaCost->extraCosts->clone();
|
|
||||||
}
|
|
||||||
manaUsedToCast = NULL;
|
manaUsedToCast = NULL;
|
||||||
xColor = manaCost->xColor;
|
xColor = manaCost->xColor;
|
||||||
}
|
}
|
||||||
@@ -432,12 +430,8 @@ ManaCost::ManaCost(const ManaCost& manaCost)
|
|||||||
morph = NEW ManaCost( manaCost.morph );
|
morph = NEW ManaCost( manaCost.morph );
|
||||||
suspend = NEW ManaCost( manaCost.suspend );
|
suspend = NEW ManaCost( manaCost.suspend );
|
||||||
Bestow = NEW ManaCost(manaCost.Bestow);
|
Bestow = NEW ManaCost(manaCost.Bestow);
|
||||||
extraCosts = NULL;
|
|
||||||
if (manaCost.extraCosts)
|
|
||||||
{
|
|
||||||
extraCosts = manaCost.extraCosts->clone();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
extraCosts = manaCost.extraCosts ? manaCost.extraCosts->clone() : NULL;
|
||||||
manaUsedToCast = NULL;
|
manaUsedToCast = NULL;
|
||||||
xColor = manaCost.xColor;
|
xColor = manaCost.xColor;
|
||||||
}
|
}
|
||||||
@@ -486,6 +480,7 @@ void ManaCost::x()
|
|||||||
{
|
{
|
||||||
if (cost.size() <= (size_t)Constants::NB_Colors)
|
if (cost.size() <= (size_t)Constants::NB_Colors)
|
||||||
{
|
{
|
||||||
|
DebugTrace("Seems ManaCost was not properly initialized");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -496,6 +491,7 @@ int ManaCost::hasX()
|
|||||||
{
|
{
|
||||||
if (cost.size() <= (size_t)Constants::NB_Colors)
|
if (cost.size() <= (size_t)Constants::NB_Colors)
|
||||||
{
|
{
|
||||||
|
DebugTrace("Seems ManaCost was not properly initialized");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (xColor > 0)
|
if (xColor > 0)
|
||||||
@@ -508,6 +504,7 @@ void ManaCost::specificX(int color)
|
|||||||
{
|
{
|
||||||
if (cost.size() <= (size_t)Constants::NB_Colors)
|
if (cost.size() <= (size_t)Constants::NB_Colors)
|
||||||
{
|
{
|
||||||
|
DebugTrace("Seems ManaCost was not properly initialized");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
xColor = color;
|
xColor = color;
|
||||||
@@ -518,6 +515,7 @@ int ManaCost::hasSpecificX()
|
|||||||
{
|
{
|
||||||
if (cost.size() <= (size_t)Constants::NB_Colors)
|
if (cost.size() <= (size_t)Constants::NB_Colors)
|
||||||
{
|
{
|
||||||
|
DebugTrace("Seems ManaCost was not properly initialized");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(xColor > 0)
|
if(xColor > 0)
|
||||||
@@ -601,7 +599,6 @@ void ManaCost::copy(ManaCost * _manaCost)
|
|||||||
hybrids = _manaCost->hybrids;
|
hybrids = _manaCost->hybrids;
|
||||||
|
|
||||||
SAFE_DELETE(extraCosts);
|
SAFE_DELETE(extraCosts);
|
||||||
|
|
||||||
if (_manaCost->extraCosts)
|
if (_manaCost->extraCosts)
|
||||||
{
|
{
|
||||||
extraCosts = _manaCost->extraCosts->clone();
|
extraCosts = _manaCost->extraCosts->clone();
|
||||||
|
|||||||
Reference in New Issue
Block a user