From b8bfe7acc17e8a4e73110f3eab56b1dacfce38e4 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 27 Jul 2016 14:39:39 +0800 Subject: [PATCH] Fix Flip/Transform Cards If the card is a copier or a token, it cannot be transformed since it's not a double face card. Also the copied card must be the "active" part of a double faced card. Flip cards (kamigawa block) is not restricted by this since its a single sided card. If the transformed card is cda, take any damage into account (PT bonus is already in effect for cda).. --- projects/mtg/include/AllAbilities.h | 3 ++- projects/mtg/src/AllAbilities.cpp | 39 +++++++++++++++++++++++------ projects/mtg/src/MTGAbility.cpp | 31 +++++++++++++++++++++-- 3 files changed, 62 insertions(+), 11 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 58541d151..0b7af43fa 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -4499,7 +4499,8 @@ class AAFlip: public InstantAbility public: vector currentAbilities; string flipStats; - AAFlip(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target,string flipStats); + bool isflipcard; + AAFlip(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target,string flipStats, bool isflipcard = false); int resolve(); int testDestroy(); const string getMenuText(); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index e8e3629f9..c8ee65679 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -3148,14 +3148,15 @@ AAMeld * AAMeld::clone() const } // flip a card -AAFlip::AAFlip(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target,string flipStats) : -InstantAbility(observer, id, card, _target),flipStats(flipStats) +AAFlip::AAFlip(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target,string flipStats, bool isflipcard) : +InstantAbility(observer, id, card, _target),flipStats(flipStats),isflipcard(isflipcard) { target = _target; } int AAFlip::resolve() { + int cdaDamage = 0; MTGCardInstance * Flipper = (MTGCardInstance*)source; this->oneShot = true; if(Flipper->isFlipped) @@ -3163,9 +3164,20 @@ int AAFlip::resolve() game->removeObserver(this); return 0; } + + //701.25a Only permanents represented by double-faced cards can transform. + //(See rule 711, “Double-Faced Cards.”) If a spell or ability instructs a player + //to transform any permanent that isn’t represented by a double-faced card, nothing happens. + //***Copier and Tokens cannot transform but can be flip since flip cards are single sided*** MTGCardInstance * _target = (MTGCardInstance *) target; if (_target) { + if((_target->isACopier||_target->isToken) && !isflipcard) + { + game->removeObserver(this); + return 0; + } + while (_target->next) _target = _target->next; @@ -3179,12 +3191,19 @@ int AAFlip::resolve() MTGCardInstance * myFlip = NEW MTGCardInstance(fcard, _target->controller()->game); _target->name = myFlip->name; _target->setName(myFlip->name); + if(!isflipcard)//transform card + { + _target->getManaCost()->resetCosts(); + if(myFlip->getManaCost()) + _target->getManaCost()->copy(myFlip->getManaCost()); + } _target->colors = myFlip->colors; _target->types = myFlip->types; _target->text = myFlip->text; _target->formattedText = myFlip->formattedText; _target->basicAbilities = myFlip->basicAbilities; - + cdaDamage = _target->damageCount; + _target->copiedID = myFlip->getMTGId();//for copier for(unsigned int i = 0;i < _target->cardsAbilities.size();i++) { MTGAbility * a = dynamic_cast(_target->cardsAbilities[i]); @@ -3242,11 +3261,15 @@ int AAFlip::resolve() } if(!_target->isCDA) { - _target->power = powerlessThanOriginal?myFlip->power - powerMod:myFlip->power + powerMod; - _target->life = toughLessThanOriginal?myFlip->toughness - toughMod:myFlip->toughness + toughMod; - _target->toughness = toughLessThanOriginal?myFlip->toughness - toughMod:myFlip->toughness + toughMod; - _target->origpower = myFlip->origpower; - _target->origtoughness = myFlip->origtoughness; + _target->power = powerlessThanOriginal?myFlip->power - powerMod:myFlip->power + powerMod; + _target->life = toughLessThanOriginal?myFlip->toughness - toughMod:myFlip->toughness + toughMod; + _target->toughness = toughLessThanOriginal?myFlip->toughness - toughMod:myFlip->toughness + toughMod; + _target->origpower = myFlip->origpower; + _target->origtoughness = myFlip->origtoughness; + } + else + {//pbonus & tbonus are already computed except damage taken... + _target->life -= cdaDamage; } SAFE_DELETE(myFlip); _target->mPropertiesChangedSinceLastUpdate = true; diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 27b113a2b..ad0510f6e 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -3334,8 +3334,35 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG /*vectorFlipStats = split(splitFlipStat[1],'%');*/ flipStats = splitFlipStat[1]; } - MTGAbility * a = NEW AAFlip(observer, id, card, target,flipStats); - return a; + if(flipStats == "Tomoya the Revealer" || + flipStats == "Tok-Tok, Volcano Born" || + flipStats == "Tobita, Master of Winds" || + flipStats == "Stabwhisker the Odious" || + flipStats == "Shidako, Broodmistress" || + flipStats == "Sasaya's Essence" || + flipStats == "Rune-Tail's Essence" || + flipStats == "Nighteyes the Desecrator" || + flipStats == "Kuon's Essence" || + flipStats == "Kenzo the Hardhearted" || + flipStats == "Kaiso, Memory of Loyalty" || + flipStats == "Ichiga, Who Topples Oaks" || + flipStats == "Homura's Essence" || + flipStats == "Scarmaker" || + flipStats == "Goka the Unjust" || + flipStats == "Erayo's Essence" || + flipStats == "Jaraku the Interloper" || + flipStats == "Azamuki, Treachery Incarnate" || + flipStats == "Autumn-Tail, Kitsune Sage" || + flipStats == "Dokai, Weaver of Life" ) + {//old flip cards kamigawa + MTGAbility * a = NEW AAFlip(observer, id, card, target,flipStats,true); + return a; + } + else//regular transform + { + MTGAbility * a = NEW AAFlip(observer, id, card, target,flipStats); + return a; + } } //Change Power/Toughness