diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index d4f56462c..220f1ae62 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -71734,8 +71734,7 @@ type=Sorcery [card] name=Path to Exile target=creature -auto=transforms((,newability[ability$!name(fetch basic land) target(land[basic]|mylibrary) moveTo(mybattlefield) !$ controller])) forever -auto=moveTo(exile) +auto=transforms((,newability[moveto(exile)],newability[may name(fetch basic land) notatarget(land[basic]|mylibrary) moveTo(mybattlefield) and!(tap)!])) oneshot 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} type=Instant @@ -126478,7 +126477,7 @@ toughness=1 [card] name=Watchdog 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. mana={3} type=Artifact Creature diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 87ae29c9d..bbf3000ec 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -6099,12 +6099,14 @@ public: //AACascade -class AACascade: public ActivatedAbilityTP +class AACascade: public ActivatedAbility { public: string nbcardsStr; - AACascade(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost = NULL, - int who = TargetChooser::UNSET); + vectorselectedCards; + vectoroldOrder; + vectornewOrder; + AACascade(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target, string nbcardsStr, ManaCost * _cost = NULL); int resolve(); void toCastCard(MTGCardInstance * card); const string getMenuText(); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 44c99b139..7bc44bb90 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1137,13 +1137,16 @@ AADepleter * AADepleter::clone() const } //AACascade -AACascade::AACascade(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost, int who) : - ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbcardsStr(nbcardsStr) +AACascade::AACascade(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target, string nbcardsStr, ManaCost * _cost) : + ActivatedAbility(observer, _id, _source, _cost, 0),nbcardsStr(nbcardsStr) { + selectedCards.clear(); + oldOrder.clear(); + newOrder.clear(); } int AACascade::resolve() { - Player * player = getPlayerFromTarget(getTarget()); + Player * player = source->controller(); if (player) { WParsedInt numCards(nbcardsStr, NULL, source); @@ -1155,14 +1158,13 @@ AACascade::AACascade(GameObserver* observer, int _id, MTGCardInstance * card, Ta { 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())) { viable = library->cards[z]; player->game->putInZone(viable, library, exile); { - vectorselectedCards; for(int j=0; j < library->nb_cards; j++) { 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() ); for(unsigned int i = 0; i < selectedCards.size();++i) { - vectoroldOrder = library->cards; - vectornewOrder; + oldOrder = library->cards; newOrder.push_back(selectedCards[i]); 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) { 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); - MTGAbility *ga1 = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), thisCard,NULL,ma1); + 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->clone()); + SAFE_DELETE(ac); + SAFE_DELETE(ma1); ga1->resolve(); return; } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 089921769..dd6c500ea 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2802,8 +2802,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG vector splitCascade = parseBetween(s, "cascade:", " ", false); if (splitCascade.size()) { - Targetable * t = spell ? spell->getNextTarget() : NULL; - MTGAbility * a = NEW AACascade(observer, id, card, t , splitCascade[1], NULL, who); + MTGAbility * a = NEW AACascade(observer, id, card, target, splitCascade[1], NULL); a->oneShot = 1; return a; } diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index ab34c5f57..421d79df4 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -564,6 +564,7 @@ MTGCardInstance * MTGGameZone::removeCard(MTGCardInstance * card, int createCopy copy->kicked = card->kicked; copy->storedCard = card->storedCard; copy->storedSourceCard = card->storedSourceCard; + copy->lastController = card->controller(); for (int i = 0; i < ManaCost::MANA_PAID_WITH_OVERLOAD +1; i++) copy->alternateCostPaid[i] = card->alternateCostPaid[i];