From c265ce8222b975301e16419575aceeafea6b16f5 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 2 Feb 2017 09:58:38 +0800 Subject: [PATCH] Bug Correction PermanentAbility to ListMaintainerAbility in Legend Rule, it seems It's finally fixed even with a lot of targetchooser and copy effects. --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 3 +- projects/mtg/include/MTGRules.h | 7 +- projects/mtg/src/MTGRules.cpp | 101 ++++++++++--------- 3 files changed, 62 insertions(+), 49 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index c36d6fc5e..7999d925a 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -25239,8 +25239,7 @@ type=Sorcery name=Dark Depths auto=counter(0/0,10,Ice) auto={3}:counter(0/0,-1,Ice) all(this) -auto=this(counter{0/0.1.Ice}<1)while sacrifice -auto=this(counter{0/0.1.Ice}<1)while token(Marit Lage,legendary creature avatar, 20/20,flying,indestructible,black) +auto=this(counter{0/0.1.Ice}<1)while sacrifice and!( token(Marit Lage,legendary creature avatar, 20/20,flying,indestructible,black) )! text=Dark Depths enters the battlefield with ten ice counters on it. -- {3}: Remove an ice counter from Dark Depths. -- When Dark Depths has no ice counters on it, sacrifice it. If you do, put a legendary 20/20 black Avatar creature token with flying and "This creature is indestructible" named Marit Lage onto the battlefield. type=Legendary Snow Land [/card] diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index ecb6fde33..689c8913c 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -427,7 +427,7 @@ public: * that player chooses one of them, and the rest are put into their owners’ graveyards. * This is called the “legend rule.” */ -class MTGLegendRule: public PermanentAbility +class MTGLegendRule: public ListMaintainerAbility { public: TargetChooser * tcL; @@ -435,7 +435,10 @@ public: MTGAbility * LegendruleAbility; MTGAbility * LegendruleGeneric; MTGLegendRule(GameObserver* observer, int _id); - int receiveEvent(WEvent * event); + int canBeInList(MTGCardInstance * card); + int added(MTGCardInstance * card); + int removed(MTGCardInstance * card); + int testDestroy(); virtual ostream& toString(ostream& out) const; virtual MTGLegendRule * clone() const; }; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 0ab307b21..8f8922384 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -3205,7 +3205,7 @@ MTGTokensCleanup * MTGTokensCleanup::clone() const /* Legend Rule */ MTGLegendRule::MTGLegendRule(GameObserver* observer, int _id) : -PermanentAbility(observer, _id) +ListMaintainerAbility(observer, _id) { tcL = NULL; Legendrule = NULL; @@ -3214,50 +3214,67 @@ PermanentAbility(observer, _id) } ; -int MTGLegendRule::receiveEvent(WEvent * event) +int MTGLegendRule::canBeInList(MTGCardInstance * card) { - WEventGameStateBasedChecked * e = dynamic_cast (event); - if (e) + if(card->isPhased) + return 0; + if (card->hasType(Subtypes::TYPE_LEGENDARY) && card->controller()->game->inPlay->hasCard(card)) { - for (int i = 0; i < 2; i++) - { - MTGGameZone * zone = game->players[i]->game->inPlay; - for (int k = zone->nb_cards - 1; k >= 0; k--) - { - MTGCardInstance * card = zone->cards[k]; - if (card && card->hasType(Subtypes::TYPE_LEGENDARY) && !card->isPhased) - { - bool condition = (card->has(Constants::NOLEGEND)||card->controller()->opponent()->inPlay()->hasAbility(Constants::NOLEGENDRULE)||card->controller()->inPlay()->hasAbility(Constants::NOLEGENDRULE))?false:true; - if(condition && card->countDuplicateCardNames() > 1) - { - vectorselection; - TargetChooserFactory tfL(game); - tcL = tfL.createTargetChooser("*[share!name!]|mybattlefield",card); - tcL->targetter = NULL; - tcL->maxtargets = card->countDuplicateCardNames()-1; - Legendrule = NEW AAMover(game, game->mLayers->actionLayer()->getMaxId(), card, NULL,"ownergraveyard","Put in Graveyard"); - Legendrule->oneShot = true; - Legendrule->canBeInterrupted = false; - LegendruleAbility = NEW GenericTargetAbility(game, "","",game->mLayers->actionLayer()->getMaxId(), card,tcL, Legendrule->clone()); - SAFE_DELETE(Legendrule); - LegendruleAbility->oneShot = true; - LegendruleAbility->canBeInterrupted = false; - LegendruleGeneric = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), card,NULL,LegendruleAbility->clone()); - SAFE_DELETE(LegendruleAbility); - LegendruleGeneric->oneShot = true; - selection.push_back(LegendruleGeneric->clone()); - SAFE_DELETE(LegendruleGeneric); - MTGAbility * menuChoice = NEW MenuAbility(game, game->mLayers->actionLayer()->getMaxId(), card, card,true,selection,card->controller(),"Legendary Rule"); - menuChoice->addToGame(); - return 1; - } - } - } - } + if(card->has(Constants::NOLEGEND)||card->controller()->opponent()->inPlay()->hasAbility(Constants::NOLEGENDRULE)||card->controller()->inPlay()->hasAbility(Constants::NOLEGENDRULE)) + return 0; + else + return 1; } return 0; } +int MTGLegendRule::added(MTGCardInstance * card) +{ + map::iterator it; + int destroy = 0; + + for (it = cards.begin(); it != cards.end(); it++) + { + MTGCardInstance * comparison = (*it).first; + if (comparison != card && comparison->controller() == card->controller() && !(comparison->getName().compare(card->getName()))) + destroy = 1; + } + if(destroy) + { + vectorselection; + MTGCardInstance * myClone = NEW MTGCardInstance(card, card->controller()->game); + TargetChooserFactory tfL(game); + tcL = tfL.createTargetChooser("*[share!name!]|mybattlefield",myClone); + tcL->targetter = NULL; + tcL->maxtargets = 1; + Legendrule = NEW AAMover(game, game->mLayers->actionLayer()->getMaxId(), myClone, NULL,"ownergraveyard","Put in Graveyard"); + Legendrule->oneShot = true; + Legendrule->canBeInterrupted = false; + LegendruleAbility = NEW GenericTargetAbility(game, "","",game->mLayers->actionLayer()->getMaxId(), myClone,tcL, Legendrule->clone()); + SAFE_DELETE(Legendrule); + LegendruleAbility->oneShot = true; + LegendruleAbility->canBeInterrupted = false; + LegendruleGeneric = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), myClone,NULL,LegendruleAbility->clone()); + SAFE_DELETE(LegendruleAbility); + LegendruleGeneric->oneShot = true; + selection.push_back(LegendruleGeneric->clone()); + SAFE_DELETE(LegendruleGeneric); + MTGAbility * menuChoice = NEW MenuAbility(game, game->mLayers->actionLayer()->getMaxId(), NULL, myClone,true,selection,card->controller(),"Legendary Rule"); + menuChoice->addToGame(); + } + return 1; +} + +int MTGLegendRule::removed(MTGCardInstance *) +{ + return 0; +} + +int MTGLegendRule::testDestroy() +{ + return 0; +} + ostream& MTGLegendRule::toString(ostream& out) const { return out << "MTGLegendRule :::"; @@ -3299,12 +3316,6 @@ int MTGPlaneWalkerRule::added(MTGCardInstance * card) destroy = 1; } } - if (game->mLayers->stackLayer()->count(0, NOT_RESOLVED) != 0) - destroy = 0; - if (game->mLayers->actionLayer()->menuObject) - destroy = 0; - if (game->getCurrentTargetChooser() || game->mLayers->actionLayer()->isWaitingForAnswer()) - destroy = 0; if (destroy) { vectorselection;