From 014ca36a4af74d50d1e34458c1992c4e8f7aa76d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 27 Jul 2016 07:11:30 +0800 Subject: [PATCH] force event for token sacrifice --- projects/mtg/include/AllAbilities.h | 2 ++ projects/mtg/include/WEvent.h | 3 +- projects/mtg/src/AllAbilities.cpp | 6 +++- projects/mtg/src/ExtraCost.cpp | 46 ++++++++++++++++------------- projects/mtg/src/WEvent.cpp | 4 +-- 5 files changed, 36 insertions(+), 25 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 94d176f18..58541d151 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -1370,6 +1370,8 @@ public: { WEventCardSacrifice * e = dynamic_cast (event); if (!e) return 0; + if (e->istoken) + return 1; MTGCardInstance * check = e->cardAfter; MTGGameZone * oldZone = e->cardAfter->currentZone; check->currentZone = check->previousZone; diff --git a/projects/mtg/include/WEvent.h b/projects/mtg/include/WEvent.h index 1ee984ffa..33d70fe31 100644 --- a/projects/mtg/include/WEvent.h +++ b/projects/mtg/include/WEvent.h @@ -184,7 +184,8 @@ struct WEventCardBlocked : public WEventCardUpdate { //event when card is sacrificed. struct WEventCardSacrifice : public WEventCardUpdate { MTGCardInstance * cardAfter; - WEventCardSacrifice(MTGCardInstance * card,MTGCardInstance * afterCard); + bool istoken; + WEventCardSacrifice(MTGCardInstance * card,MTGCardInstance * afterCard, bool token = false); virtual Targetable * getTarget(int target); }; diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 58e8c65b6..213e9c6f2 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2704,10 +2704,14 @@ int AASacrificeCard::resolve() { Player * p = _target->controller(); MTGCardInstance * beforeCard = _target; + WEvent * e; + if(!_target->isToken) + e = NEW WEventCardSacrifice(beforeCard,_target); + else + e = NEW WEventCardSacrifice(beforeCard,_target,true); p->game->putInGraveyard(_target); while(_target->next) _target = _target->next; - WEvent * e = NEW WEventCardSacrifice(beforeCard,_target); game->receiveEvent(e); if(andAbility) { diff --git a/projects/mtg/src/ExtraCost.cpp b/projects/mtg/src/ExtraCost.cpp index 9946291a8..1e2f54874 100644 --- a/projects/mtg/src/ExtraCost.cpp +++ b/projects/mtg/src/ExtraCost.cpp @@ -978,14 +978,14 @@ ManaCost * Convoke::getReduction() tc->maxtargets = source->getManaCost()->getConvertedCost(); if (tc->getNbTargets()) { - vectortargetlist = tc->getTargetsFrom(); - for (vector::iterator it = targetlist.begin(); it != targetlist.end(); it++) + vectortargetlist = tc->getTargetsFrom(); + for (vector::iterator it = targetlist.begin(); it != targetlist.end(); it++) { bool next = false; for (int i = Constants::MTG_COLOR_GREEN; i <= Constants::MTG_COLOR_WHITE; ++i) - { - if (next == true) - break; + { + if (next == true) + break; MTGCardInstance * targetCard = dynamic_cast(*it); if ((targetCard->getManaCost()->hasColor(i) || targetCard->hasColor(i)) && toReduce->hasColor(i)) { @@ -1004,13 +1004,13 @@ ManaCost * Convoke::getReduction() { SAFE_DELETE(toReduce); toReduce = NEW ManaCost(source->getManaCost()); - for (vector::reverse_iterator it = targetlist.rbegin(); it != targetlist.rend(); it++) + for (vector::reverse_iterator it = targetlist.rbegin(); it != targetlist.rend(); it++) { bool next = false; for (int i = Constants::MTG_COLOR_GREEN; i <= Constants::MTG_COLOR_WHITE; ++i) - { - if (next == true) - break; + { + if (next == true) + break; MTGCardInstance * targetCard = dynamic_cast(*it); if ((targetCard->getManaCost()->hasColor(i) || targetCard->hasColor(i)) && toReduce->hasColor(i)) { @@ -1036,9 +1036,9 @@ int Convoke::doPay() ManaCost * toReduce = getReduction(); target->controller()->getManaPool()->pay(toReduce); SAFE_DELETE(toReduce); - vectortargetlist = tc->getTargetsFrom(); - for (vector::iterator it = targetlist.begin(); it != targetlist.end(); it++) - { + vectortargetlist = tc->getTargetsFrom(); + for (vector::iterator it = targetlist.begin(); it != targetlist.end(); it++) + { MTGCardInstance * targetCard = dynamic_cast(*it); source->storedCard = targetCard->createSnapShot(); targetCard->tap(); @@ -1104,9 +1104,9 @@ int Delve::doPay() target->controller()->getManaPool()->pay(toReduce); SAFE_DELETE(toReduce); - vectortargetlist = tc->getTargetsFrom(); - for (vector::iterator it = targetlist.begin(); it != targetlist.end(); it++) - { + vectortargetlist = tc->getTargetsFrom(); + for (vector::iterator it = targetlist.begin(); it != targetlist.end(); it++) + { MTGCardInstance * targetCard = dynamic_cast(*it); source->storedCard = targetCard->createSnapShot(); targetCard->controller()->game->putInExile(targetCard); @@ -1288,8 +1288,12 @@ int SacrificeCost::doPay() { MTGCardInstance * beforeCard = target; source->storedCard = target->createSnapShot(); + WEvent * e; + if(!target->isToken) + e = NEW WEventCardSacrifice(beforeCard,target); + else + e = NEW WEventCardSacrifice(beforeCard,target,true); target->controller()->game->putInGraveyard(target); - WEvent * e = NEW WEventCardSacrifice(beforeCard,target); GameObserver * game = target->owner->getObserver(); game->receiveEvent(e); target = NULL; @@ -1567,11 +1571,11 @@ int ExtraCosts::doPay() } if (costs[i]->tc) { - vectortargetlist = costs[i]->tc->getTargetsFrom(); - for (vector::iterator it = targetlist.begin(); it != targetlist.end(); it++) - { - costs[i]->target = dynamic_cast(*it); - costs[i]->doPay(); + vectortargetlist = costs[i]->tc->getTargetsFrom(); + for (vector::iterator it = targetlist.begin(); it != targetlist.end(); it++) + { + costs[i]->target = dynamic_cast(*it); + costs[i]->doPay(); } } else diff --git a/projects/mtg/src/WEvent.cpp b/projects/mtg/src/WEvent.cpp index 8c7d1062e..3aa726596 100644 --- a/projects/mtg/src/WEvent.cpp +++ b/projects/mtg/src/WEvent.cpp @@ -99,8 +99,8 @@ player(player), nb_cards(nb_cards),drawAbility(cardDraw) { } -WEventCardSacrifice::WEventCardSacrifice(MTGCardInstance * card, MTGCardInstance * after) : - WEventCardUpdate(card),cardAfter(after) +WEventCardSacrifice::WEventCardSacrifice(MTGCardInstance * card, MTGCardInstance * after, bool token) : + WEventCardUpdate(card),cardAfter(after),istoken(token) { }