From 52de1e7b020ea0eeb7084b67fdcc8b7beb5a6497 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 5 Jun 2016 12:39:11 +0800 Subject: [PATCH 1/4] Trinisphere TODO: Morph and Kicker... Morph can be done but how to implement the increased total cost with kicker? multi kicker? manual kicker??? Count the mana pool if you can pay the cost+kicker if less than 3 increase it??? --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 7 +++++ projects/mtg/include/MTGCardInstance.h | 3 +- projects/mtg/src/GameObserver.cpp | 19 +++++++++++++ projects/mtg/src/MTGCardInstance.cpp | 30 +++++++++++++++----- 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 1129e3e3a..1064b35c8 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -105485,6 +105485,13 @@ mana={5} type=Artifact [/card] [card] +name=Trinisphere +auto=this(untapped) lord(*[-land]|hand,library,exile,graveyard) trinisphere forcedalive +text=As long as Trinisphere is untapped, each spell that would cost less than three mana to cast costs three mana to cast. (Additional mana in the cost may be paid with any color of mana or colorless mana. For example, a spell that would cost {1}{B} to cast costs {2}{B} to cast instead.) +mana={3} +type=Artifact +[/card] +[card] name=Trinket Mage auto=may moveTo(myhand) target(artifact[manacost<=1]|mylibrary) text=When Trinket Mage enters the battlefield, you may search your library for an artifact card with converted mana cost 1 or less, reveal that card, and put it into your hand. If you do, shuffle your library. diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 52f61a807..bad9b8322 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -255,7 +255,8 @@ public: bool isTargetter(); int cardistargetter; int myconvertedcost; - ManaCost * computeNewCost(MTGCardInstance * card,ManaCost * oldCost, ManaCost * refCost,bool onlyTrinisphere = false); + ManaCost * computeNewCost(MTGCardInstance * card,ManaCost * oldCost, ManaCost * refCost,bool noTrinisphere = false); + int countTrini; void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index e52576bd6..7a75cf6c0 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -1137,6 +1137,25 @@ void GameObserver::Affinity() card->getManaCost()->remove(color,1); } }//end3 + //trinisphere... now how to implement kicker recomputation + + if(card->has(Constants::TRINISPHERE)) + { + for(int jj = card->getManaCost()->getConvertedCost(); jj < 3; jj++) + { + card->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT, 1); + card->countTrini++; + } + } + else + { + if(card->countTrini) + { + card->getManaCost()->remove(Constants::MTG_COLOR_ARTIFACT, card->countTrini); + card->countTrini=0; + } + } + SAFE_DELETE(original); }//end } diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 956f60a35..a60fdd421 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -198,6 +198,7 @@ void MTGCardInstance::initMTGCI() storedSourceCard = NULL; myPair = NULL; miracle = false; + countTrini = 0; for (int i = 0; i < ManaCost::MANA_PAID_WITH_SUSPEND +1; i++) alternateCostPaid[i] = 0; @@ -922,12 +923,11 @@ JQuadPtr MTGCardInstance::getIcon() return WResourceManager::Instance()->RetrieveCard(this, CACHE_THUMB); } -ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * newCost, ManaCost * refCost, bool onlyTrinisphere) +ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * newCost, ManaCost * refCost, bool noTrinisphere) { if(!card) return NULL; - if(!onlyTrinisphere) - { + if(card->getIncreasedManaCost()->getConvertedCost()) newCost->add(card->getIncreasedManaCost()); if(card->getReducedManaCost()->getConvertedCost()) @@ -1013,11 +1013,27 @@ ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * new newCost->remove(color,1); }//end3 SAFE_DELETE(original); + + if(!noTrinisphere) + { + //trinisphere... now how to implement kicker recomputation + if(card->has(Constants::TRINISPHERE)) + { + for(int jj = newCost->getConvertedCost(); jj < 3; jj++) + { + newCost->add(Constants::MTG_COLOR_ARTIFACT, 1); + card->countTrini++; + } + } + else + { + if(card->countTrini) + { + newCost->remove(Constants::MTG_COLOR_ARTIFACT, card->countTrini); + card->countTrini=0; + } + } } - /*//trinisphere must be here below// - if(card->has(Constants::TRINISPHERE)) - for(int jj = newCost->getConvertedCost(); jj < 3; jj++) - newCost->add(Constants::MTG_COLOR_ARTIFACT, 1);*/ return newCost; } From cd83cfdc8708210f5937c593a3ac4bacd19a557b Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 5 Jun 2016 13:01:55 +0800 Subject: [PATCH 2/4] Removed Forced Castcard, Suspend and other without paying manacost using these must be recomputed for costs... --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 1064b35c8..1129e3e3a 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -105485,13 +105485,6 @@ mana={5} type=Artifact [/card] [card] -name=Trinisphere -auto=this(untapped) lord(*[-land]|hand,library,exile,graveyard) trinisphere forcedalive -text=As long as Trinisphere is untapped, each spell that would cost less than three mana to cast costs three mana to cast. (Additional mana in the cost may be paid with any color of mana or colorless mana. For example, a spell that would cost {1}{B} to cast costs {2}{B} to cast instead.) -mana={3} -type=Artifact -[/card] -[card] name=Trinket Mage auto=may moveTo(myhand) target(artifact[manacost<=1]|mylibrary) text=When Trinket Mage enters the battlefield, you may search your library for an artifact card with converted mana cost 1 or less, reveal that card, and put it into your hand. If you do, shuffle your library. From 5196424fbec6a98d45279fe8b7978c695261f5bf Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 5 Jun 2016 13:15:30 +0800 Subject: [PATCH 3/4] Overload and PayZero are affected by cost increaser --- projects/mtg/src/AllAbilities.cpp | 20 ++++--------- projects/mtg/src/MTGRules.cpp | 48 ++++++++++++++++++------------- 2 files changed, 33 insertions(+), 35 deletions(-) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 0abfcd422..3d86feaef 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1305,25 +1305,15 @@ int GenericPaidAbility::resolve() { must = true; //cost increase - reduce + trinisphere effect ability todo... - if(((MTGCardInstance *)target)->getIncreasedManaCost()->getConvertedCost()) - optionalCost->add(((MTGCardInstance *)target)->getIncreasedManaCost()); - if(((MTGCardInstance *)target)->getReducedManaCost()->getConvertedCost()) - optionalCost->remove(((MTGCardInstance *)target)->getReducedManaCost()); - //trinisphere effect must be hardcoded...here.. - /*if(((MTGCardInstance *)target)->has(Constants::TRINISPHERE)) + optionalCost = ((MTGCardInstance *)target)->computeNewCost(((MTGCardInstance *)target),optionalCost,optionalCost); + if(optionalCost->extraCosts) { - if(optionalCost->getConvertedCost() == 2) - optionalCost->add(Constants::MTG_COLOR_ARTIFACT, 1); - else if(optionalCost->getConvertedCost() == 1) - optionalCost->add(Constants::MTG_COLOR_ARTIFACT, 2); - else if(optionalCost->getConvertedCost() < 1) - optionalCost->add(Constants::MTG_COLOR_ARTIFACT, 3); - }*/ + for(unsigned int i = 0; i < optionalCost->extraCosts->costs.size();i++) + optionalCost->extraCosts->costs[i]->setSource(((MTGCardInstance *)target)); + } } if(asAlternate && nomenu && optionalCost->getConvertedCost() < 1) - { nomenuAbility->resolve(); - } else { MenuAbility * a1 = NEW MenuAbility(game, this->GetId(), target, source, must, selection, NULL, newName); diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index d6ff3bae9..7911f9462 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -1216,10 +1216,12 @@ int MTGPayZeroRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) return 0; Player * player = game->currentlyActing(); ManaCost * cost = NEW ManaCost(ManaCost::parseManaCost("{0}",NULL,NULL)); - if(card->getIncreasedManaCost()->getConvertedCost()) - cost->add(card->getIncreasedManaCost()); - if(card->getReducedManaCost()->getConvertedCost()) - cost->remove(card->getReducedManaCost()); + ManaCost * newCost = card->computeNewCost(card,cost,cost); + if(newCost->extraCosts) + for(unsigned int i = 0; i < newCost->extraCosts->costs.size();i++) + { + newCost->extraCosts->costs[i]->setSource(card); + } if(card->isLand()) return 0; @@ -1234,7 +1236,7 @@ int MTGPayZeroRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) else CustomName = "Zero Cast From Anywhere"; - return MTGAlternativeCostRule::isReactingToClick(card, mana, cost); + return MTGAlternativeCostRule::isReactingToClick(card, mana, newCost); } int MTGPayZeroRule::reactToClick(MTGCardInstance * card) @@ -1243,14 +1245,16 @@ int MTGPayZeroRule::reactToClick(MTGCardInstance * card) return 0; ManaCost * cost = NEW ManaCost(ManaCost::parseManaCost("{0}",NULL,NULL)); - if(card->getIncreasedManaCost()->getConvertedCost()) - cost->add(card->getIncreasedManaCost()); - if(card->getReducedManaCost()->getConvertedCost()) - cost->remove(card->getReducedManaCost()); + ManaCost * newCost = card->computeNewCost(card,cost,cost); + if(newCost->extraCosts) + for(unsigned int i = 0; i < newCost->extraCosts->costs.size();i++) + { + newCost->extraCosts->costs[i]->setSource(card); + } card->paymenttype = MTGAbility::PAYZERO_COST; - return MTGAlternativeCostRule::reactToClick(card, cost, ManaCost::MANA_PAID); + return MTGAlternativeCostRule::reactToClick(card, newCost, ManaCost::MANA_PAID); } ostream& MTGPayZeroRule::toString(ostream& out) const @@ -1276,10 +1280,12 @@ int MTGOverloadRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) return 0; Player * player = game->currentlyActing(); ManaCost * cost = NEW ManaCost(card->model->data->getManaCost()->getAlternative()); - if(card->getIncreasedManaCost()->getConvertedCost()) - cost->add(card->getIncreasedManaCost()); - if(card->getReducedManaCost()->getConvertedCost()) - cost->remove(card->getReducedManaCost()); + ManaCost * newCost = card->computeNewCost(card,cost,cost); + if(newCost->extraCosts) + for(unsigned int i = 0; i < newCost->extraCosts->costs.size();i++) + { + newCost->extraCosts->costs[i]->setSource(card); + } if (card->isLand()) return 0; @@ -1288,7 +1294,7 @@ int MTGOverloadRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card))) return 0; - return MTGAlternativeCostRule::isReactingToClick(card, mana, cost); + return MTGAlternativeCostRule::isReactingToClick(card, mana, newCost); } int MTGOverloadRule::reactToClick(MTGCardInstance * card) @@ -1297,14 +1303,16 @@ int MTGOverloadRule::reactToClick(MTGCardInstance * card) return 0; ManaCost * cost = NEW ManaCost(card->model->data->getManaCost()->getAlternative()); - if(card->getIncreasedManaCost()->getConvertedCost()) - cost->add(card->getIncreasedManaCost()); - if(card->getReducedManaCost()->getConvertedCost()) - cost->remove(card->getReducedManaCost()); + ManaCost * newCost = card->computeNewCost(card,cost,cost); + if(newCost->extraCosts) + for(unsigned int i = 0; i < newCost->extraCosts->costs.size();i++) + { + newCost->extraCosts->costs[i]->setSource(card); + } card->paymenttype = MTGAbility::OVERLOAD_COST; - return MTGAlternativeCostRule::reactToClick(card, cost, ManaCost::MANA_PAID_WITH_OVERLOAD, true); + return MTGAlternativeCostRule::reactToClick(card, newCost, ManaCost::MANA_PAID_WITH_OVERLOAD, true); } ostream& MTGOverloadRule::toString(ostream& out) const From fbfc712d4cf4d437198159ca70f1f0915a5c2fa4 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 5 Jun 2016 13:57:57 +0800 Subject: [PATCH 4/4] Morph --- projects/mtg/src/MTGRules.cpp | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 7911f9462..a148c262b 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -1095,7 +1095,9 @@ int MTGMorphCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *) Player * player = game->currentlyActing(); //Player * currentPlayer = game->currentPlayer; - if (!player->game->hand->hasCard(card)) + if (!player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card)) + return 0; + if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card))) return 0; if (!card->getManaCost()->getMorph()) return 0; @@ -1109,7 +1111,12 @@ int MTGMorphCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *) if (card->controller()->game->playRestrictions->canPutIntoZone(card, card->controller()->game->stack) == PlayRestriction::CANT_PLAY) return 0; ManaCost * playerMana = player->getManaPool(); - ManaCost * morph = card->getManaCost()->getMorph(); + ManaCost * morph = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getMorph()),card->getManaCost()->getMorph()); + if(morph->extraCosts) + for(unsigned int i = 0; i < morph->extraCosts->costs.size();i++) + { + morph->extraCosts->costs[i]->setSource(card); + } #ifdef WIN32 ManaCost * cost = card->getManaCost(); @@ -1117,7 +1124,7 @@ int MTGMorphCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *) #endif //cost of card. - if (morph && playerMana->canAfford(morph)) + if (playerMana->canAfford(morph)) { return 1; } @@ -1132,8 +1139,13 @@ int MTGMorphCostRule::reactToClick(MTGCardInstance * card) return 0; Player * player = game->currentlyActing(); ManaCost * cost = card->getManaCost(); - ManaCost * morph = card->getManaCost()->getMorph(); ManaCost * playerMana = player->getManaPool(); + ManaCost * morph = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getMorph()),card->getManaCost()->getMorph()); + if(morph->extraCosts) + for(unsigned int i = 0; i < morph->extraCosts->costs.size();i++) + { + morph->extraCosts->costs[i]->setSource(card); + } //this handles extra cost payments at the moment a card is played. if (playerMana->canAfford(morph)) { @@ -1155,7 +1167,7 @@ int MTGMorphCostRule::reactToClick(MTGCardInstance * card) } //------------------------------------------------------------------------ ManaCost * previousManaPool = NEW ManaCost(player->getManaPool()); - player->getManaPool()->pay(card->getManaCost()->getMorph()); + player->getManaPool()->pay(morph); card->getManaCost()->getMorph()->doPayExtra(); int payResult = ManaCost::MANA_PAID_WITH_MORPH; //if morph has a extra payment thats set, this code pays it.the if statement is 100% needed as it would cause a crash on cards that dont have the morph cost. @@ -1169,6 +1181,12 @@ int MTGMorphCostRule::reactToClick(MTGCardInstance * card) card->morphed = true; card->isMorphed = true; MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->stack); + copy->getManaCost()->resetCosts();//Morph has no ManaCost on stack + copy->setColor(0,1); + copy->types.clear(); + string cre = "Creature"; + copy->setType(cre.c_str()); + copy->basicAbilities.reset(); Spell * spell = NULL; spell = game->mLayers->stackLayer()->addSpell(copy, NULL, spellCost, payResult, 0); spell->source->morphed = true;