From f4c17aaf45e46e027eeaae13fedfa489cc20232f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 2 Jun 2016 20:39:21 +0800 Subject: [PATCH] Cascade --- projects/mtg/include/AllAbilities.h | 17 +++++- projects/mtg/include/MTGCardInstance.h | 1 + projects/mtg/src/AllAbilities.cpp | 73 +++++++++++++++++++++++--- projects/mtg/src/MTGAbility.cpp | 10 ++++ projects/mtg/src/MTGCardInstance.cpp | 1 + 5 files changed, 95 insertions(+), 7 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 874762407..1587f488b 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -584,6 +584,18 @@ private: if (target->controller()->life >= target->controller()->initLife) intValue = 1; } + else if (s == "plibrarycount") + { + intValue = 0; + if (target->controller()->game->library->nb_cards) + intValue = target->controller()->game->library->nb_cards; + } + else if (s == "olibrarycount") + { + intValue = 0; + if (target->controller()->opponent()->game->library->nb_cards) + intValue = target->controller()->opponent()->game->library->nb_cards; + } else if (s == "highestlifetotal") { intValue = target->controller()->life <= target->controller()->opponent()->life? target->controller()->opponent()->life:target->controller()->life; @@ -6064,9 +6076,12 @@ class AADepleter: public ActivatedAbilityTP public: string nbcardsStr; bool toexile; + bool cascade; AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost = NULL, - int who = TargetChooser::UNSET, bool toexile = false); + int who = TargetChooser::UNSET, bool toexile = false, bool cascade = false); int resolve(); + string Cascade; + void toCastCard(MTGCardInstance * card); const string getMenuText(); AADepleter * clone() const; }; diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index f5b5cdc5e..cd2e45a7e 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -89,6 +89,7 @@ public: bool isMorphed; bool isFlipped; bool isPhased; + bool isCascaded; int phasedTurn; bool graveEffects; bool exileEffects; diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index be4e41edc..303d0bcd1 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -261,24 +261,72 @@ AADamager * AADamager::clone() const //AADepleter -AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost, int who, bool toexile) : - ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbcardsStr(nbcardsStr),toexile(toexile) +AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost, int who, bool toexile, bool cascade) : + ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbcardsStr(nbcardsStr),toexile(toexile),cascade(cascade) { - + Cascade = "Cascade"; } int AADepleter::resolve() { Player * player = getPlayerFromTarget(getTarget()); - if (player) { WParsedInt numCards(nbcardsStr, NULL, source); MTGLibrary * library = player->game->library; + MTGRemovedFromGame * exile = player->game->exile; + MTGCardInstance * viable = NULL; + int counter = 0; for (int i = 0; i < numCards.getValue(); i++) { if (library->nb_cards) { - if(toexile) + if(cascade) + { + for(int z = library->nb_cards; 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) + { + library->cards[j]->isCascaded = false; + selectedCards.push_back(library->cards[j]); + } + } + if(selectedCards.size()) + { + std::random_shuffle ( selectedCards.begin(), selectedCards.end() ); + for(unsigned int i = 0; i < selectedCards.size();++i) + { + vectoroldOrder = library->cards; + vectornewOrder; + newOrder.push_back(selectedCards[i]); + for(unsigned int k = 0;k < oldOrder.size();++k) + { + MTGCardInstance * rearranged = oldOrder[k]; + if(rearranged != selectedCards[i]) + newOrder.push_back(rearranged); + } + library->cards = newOrder; + } + } + } + toCastCard(viable->next); + return 1; + } + else + { + library->cards[library->nb_cards - 1]->isCascaded=true; + counter++; + } + } + } + else if(toexile) player->game->putInZone(library->cards[library->nb_cards - 1], library, player->game->exile); else player->game->putInZone(library->cards[library->nb_cards - 1], library, player->game->graveyard); @@ -288,9 +336,22 @@ AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, return 1; } +void AADepleter::toCastCard(MTGCardInstance * thisCard) +{ + MTGAbility *ac = NEW AACastCard(game, game->mLayers->actionLayer()->getMaxId(), thisCard, thisCard,false,false,true,"","",false,false); + //ac->oneShot=true; + //ac->addToGame(); + MayAbility *ma1 = NEW MayAbility(game, game->mLayers->actionLayer()->getMaxId(), ac, thisCard,true); + MTGAbility *ga1 = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), thisCard,NULL,ma1); + ga1->resolve(); + return; +} + const string AADepleter::getMenuText() { - if(toexile) + if(cascade) + return Cascade; + else if(toexile) return "Ingest"; return "Deplete"; } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 64c8604d7..b1ff82ab6 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2684,6 +2684,16 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return a; } + //Cascade + vector splitCascade = parseBetween(s, "cascade:", " ", false); + if (splitCascade.size()) + { + Targetable * t = spell ? spell->getNextTarget() : NULL; + MTGAbility * a = NEW AADepleter(observer, id, card, t , splitCascade[1], NULL, who, false,true); + a->oneShot = 1; + return a; + } + //modify turns vector splitModTurn = parseBetween(s, "turns:", " ", false); if (splitModTurn.size()) diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index d0504e207..cd0f4552e 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -168,6 +168,7 @@ void MTGCardInstance::initMTGCI() isMorphed = false; isFlipped = false; isPhased = false; + isCascaded = false; phasedTurn = -1; didattacked = 0; didblocked = 0;