Merge pull request #709 from kevlahnota/master
Fix Cascade, Crash fix on lastController and some corrections
This commit is contained in:
@@ -71734,8 +71734,7 @@ type=Sorcery
|
|||||||
[card]
|
[card]
|
||||||
name=Path to Exile
|
name=Path to Exile
|
||||||
target=creature
|
target=creature
|
||||||
auto=transforms((,newability[ability$!name(fetch basic land) target(land[basic]|mylibrary) moveTo(mybattlefield) !$ controller])) forever
|
auto=transforms((,newability[moveto(exile)],newability[may name(fetch basic land) notatarget(land[basic]|mylibrary) moveTo(mybattlefield) and!(tap)!])) oneshot
|
||||||
auto=moveTo(exile)
|
|
||||||
text=Exile target creature. Its controller may search his or her library for a basic land card, put that card onto the battlefield tapped, then shuffle his or her library.
|
text=Exile target creature. Its controller may search his or her library for a basic land card, put that card onto the battlefield tapped, then shuffle his or her library.
|
||||||
mana={W}
|
mana={W}
|
||||||
type=Instant
|
type=Instant
|
||||||
@@ -126478,7 +126477,7 @@ toughness=1
|
|||||||
[card]
|
[card]
|
||||||
name=Watchdog
|
name=Watchdog
|
||||||
abilities=mustblock
|
abilities=mustblock
|
||||||
auto=this(untapped) lord(creature[attacking]) -1/0
|
auto=this(untapped) lord(creature[attacking]|opponentbattlefield) -1/0
|
||||||
text=Watchdog blocks each turn if able. -- As long as Watchdog is untapped, all creatures attacking you get -1/-0.
|
text=Watchdog blocks each turn if able. -- As long as Watchdog is untapped, all creatures attacking you get -1/-0.
|
||||||
mana={3}
|
mana={3}
|
||||||
type=Artifact Creature
|
type=Artifact Creature
|
||||||
|
|||||||
@@ -6099,12 +6099,14 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
//AACascade
|
//AACascade
|
||||||
class AACascade: public ActivatedAbilityTP
|
class AACascade: public ActivatedAbility
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
string nbcardsStr;
|
string nbcardsStr;
|
||||||
AACascade(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost = NULL,
|
vector<MTGCardInstance*>selectedCards;
|
||||||
int who = TargetChooser::UNSET);
|
vector<MTGCardInstance *>oldOrder;
|
||||||
|
vector<MTGCardInstance *>newOrder;
|
||||||
|
AACascade(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target, string nbcardsStr, ManaCost * _cost = NULL);
|
||||||
int resolve();
|
int resolve();
|
||||||
void toCastCard(MTGCardInstance * card);
|
void toCastCard(MTGCardInstance * card);
|
||||||
const string getMenuText();
|
const string getMenuText();
|
||||||
|
|||||||
@@ -1137,13 +1137,16 @@ AADepleter * AADepleter::clone() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
//AACascade
|
//AACascade
|
||||||
AACascade::AACascade(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost, int who) :
|
AACascade::AACascade(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target, string nbcardsStr, ManaCost * _cost) :
|
||||||
ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbcardsStr(nbcardsStr)
|
ActivatedAbility(observer, _id, _source, _cost, 0),nbcardsStr(nbcardsStr)
|
||||||
{
|
{
|
||||||
|
selectedCards.clear();
|
||||||
|
oldOrder.clear();
|
||||||
|
newOrder.clear();
|
||||||
}
|
}
|
||||||
int AACascade::resolve()
|
int AACascade::resolve()
|
||||||
{
|
{
|
||||||
Player * player = getPlayerFromTarget(getTarget());
|
Player * player = source->controller();
|
||||||
if (player)
|
if (player)
|
||||||
{
|
{
|
||||||
WParsedInt numCards(nbcardsStr, NULL, source);
|
WParsedInt numCards(nbcardsStr, NULL, source);
|
||||||
@@ -1155,14 +1158,13 @@ AACascade::AACascade(GameObserver* observer, int _id, MTGCardInstance * card, Ta
|
|||||||
{
|
{
|
||||||
if (library->nb_cards)
|
if (library->nb_cards)
|
||||||
{
|
{
|
||||||
for(int z = library->nb_cards; z >= 0; z--)
|
for(int z = library->nb_cards-1; z >= 0; z--)
|
||||||
{
|
{
|
||||||
if(!library->cards[z]->isLand() && (library->cards[z]->getManaCost()->getConvertedCost() < source->getManaCost()->getConvertedCost()))
|
if(!library->cards[z]->isLand() && (library->cards[z]->getManaCost()->getConvertedCost() < source->getManaCost()->getConvertedCost()))
|
||||||
{
|
{
|
||||||
viable = library->cards[z];
|
viable = library->cards[z];
|
||||||
player->game->putInZone(viable, library, exile);
|
player->game->putInZone(viable, library, exile);
|
||||||
{
|
{
|
||||||
vector<MTGCardInstance*>selectedCards;
|
|
||||||
for(int j=0; j < library->nb_cards; j++)
|
for(int j=0; j < library->nb_cards; j++)
|
||||||
{
|
{
|
||||||
if(library->cards[j]->isCascaded)
|
if(library->cards[j]->isCascaded)
|
||||||
@@ -1176,8 +1178,7 @@ AACascade::AACascade(GameObserver* observer, int _id, MTGCardInstance * card, Ta
|
|||||||
std::random_shuffle ( selectedCards.begin(), selectedCards.end() );
|
std::random_shuffle ( selectedCards.begin(), selectedCards.end() );
|
||||||
for(unsigned int i = 0; i < selectedCards.size();++i)
|
for(unsigned int i = 0; i < selectedCards.size();++i)
|
||||||
{
|
{
|
||||||
vector<MTGCardInstance *>oldOrder = library->cards;
|
oldOrder = library->cards;
|
||||||
vector<MTGCardInstance *>newOrder;
|
|
||||||
newOrder.push_back(selectedCards[i]);
|
newOrder.push_back(selectedCards[i]);
|
||||||
for(unsigned int k = 0;k < oldOrder.size();++k)
|
for(unsigned int k = 0;k < oldOrder.size();++k)
|
||||||
{
|
{
|
||||||
@@ -1207,8 +1208,10 @@ AACascade::AACascade(GameObserver* observer, int _id, MTGCardInstance * card, Ta
|
|||||||
void AACascade::toCastCard(MTGCardInstance * thisCard)
|
void AACascade::toCastCard(MTGCardInstance * thisCard)
|
||||||
{
|
{
|
||||||
MTGAbility *ac = NEW AACastCard(game, game->mLayers->actionLayer()->getMaxId(), thisCard, thisCard,false,false,true,"","",false,false);
|
MTGAbility *ac = NEW AACastCard(game, game->mLayers->actionLayer()->getMaxId(), thisCard, thisCard,false,false,true,"","",false,false);
|
||||||
MayAbility *ma1 = NEW MayAbility(game, game->mLayers->actionLayer()->getMaxId(), ac, thisCard->clone(),true);
|
MayAbility *ma1 = NEW MayAbility(game, game->mLayers->actionLayer()->getMaxId(), ac->clone(), thisCard,true);
|
||||||
MTGAbility *ga1 = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), thisCard,NULL,ma1);
|
MTGAbility *ga1 = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), thisCard,NULL,ma1->clone());
|
||||||
|
SAFE_DELETE(ac);
|
||||||
|
SAFE_DELETE(ma1);
|
||||||
ga1->resolve();
|
ga1->resolve();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2802,8 +2802,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
|||||||
vector<string> splitCascade = parseBetween(s, "cascade:", " ", false);
|
vector<string> splitCascade = parseBetween(s, "cascade:", " ", false);
|
||||||
if (splitCascade.size())
|
if (splitCascade.size())
|
||||||
{
|
{
|
||||||
Targetable * t = spell ? spell->getNextTarget() : NULL;
|
MTGAbility * a = NEW AACascade(observer, id, card, target, splitCascade[1], NULL);
|
||||||
MTGAbility * a = NEW AACascade(observer, id, card, t , splitCascade[1], NULL, who);
|
|
||||||
a->oneShot = 1;
|
a->oneShot = 1;
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -564,6 +564,7 @@ MTGCardInstance * MTGGameZone::removeCard(MTGCardInstance * card, int createCopy
|
|||||||
copy->kicked = card->kicked;
|
copy->kicked = card->kicked;
|
||||||
copy->storedCard = card->storedCard;
|
copy->storedCard = card->storedCard;
|
||||||
copy->storedSourceCard = card->storedSourceCard;
|
copy->storedSourceCard = card->storedSourceCard;
|
||||||
|
copy->lastController = card->controller();
|
||||||
for (int i = 0; i < ManaCost::MANA_PAID_WITH_OVERLOAD +1; i++)
|
for (int i = 0; i < ManaCost::MANA_PAID_WITH_OVERLOAD +1; i++)
|
||||||
copy->alternateCostPaid[i] = card->alternateCostPaid[i];
|
copy->alternateCostPaid[i] = card->alternateCostPaid[i];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user