diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 1abaf0276..392c89eb4 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -3256,6 +3256,7 @@ public: } else { + a->forcedAlive = 1; a->addToGame(); abilities[d] = a; } @@ -3278,6 +3279,7 @@ public: if (abilities.find(card) != abilities.end() && !(forceDestroy == -1 && forcedAlive == 1)) //only embelms have forcedestroy = -1 and forcedalive = 1 { + abilities[card]->forcedAlive = 0; game->removeObserver(abilities[card]); abilities.erase(card); } @@ -6160,7 +6162,7 @@ public: { if(forceDestroy != -1) return 1; - if(!(source->hasType(Subtypes::TYPE_INSTANT)||source->hasType(Subtypes::TYPE_INSTANT)) && !source->isInPlay(game)) + if(!(source->hasType(Subtypes::TYPE_INSTANT)||source->hasType(Subtypes::TYPE_SORCERY)) && !source->isInPlay(game)) return 1; return 0; } diff --git a/projects/mtg/include/GameObserver.h b/projects/mtg/include/GameObserver.h index 0e1a096eb..6b5fddb79 100644 --- a/projects/mtg/include/GameObserver.h +++ b/projects/mtg/include/GameObserver.h @@ -124,6 +124,7 @@ class GameObserver{ void gameStateBasedEffects(); void enchantmentStatus(); void Affinity(); + bool AffinityNeedsUpdate; void addObserver(MTGAbility * observer); bool removeObserver(ActionElement * observer); void startGame(GameType, Rules * rules); diff --git a/projects/mtg/src/CardPrimitive.cpp b/projects/mtg/src/CardPrimitive.cpp index 0ed61cd68..bddc43ed4 100644 --- a/projects/mtg/src/CardPrimitive.cpp +++ b/projects/mtg/src/CardPrimitive.cpp @@ -426,6 +426,9 @@ uint8_t CardPrimitive::ConvertColorToBitMask(int inColor) case Constants::MTG_COLOR_LAND: value = kColorBitMask_Land; break; + case Constants::MTG_COLOR_WASTE://the true colorless mana shares the kbitmask of land. kbitmask dictates the color of the quad(no image boarder), and the symbol. nothing more. + value = kColorBitMask_Land; + break; default: break; diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 3d65cd041..37736c980 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -53,6 +53,7 @@ void GameObserver::cleanup() actionsList.clear(); gameTurn.clear(); OpenedDisplay = NULL; + AffinityNeedsUpdate = false; } GameObserver::~GameObserver() @@ -1079,7 +1080,24 @@ void GameObserver::Affinity() } } } - //////////////////////////// + ///we handle trisnisphere seperately because its a desaster. + 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; + } + } + /////////////////////// bool NewAffinityFound = false; for (unsigned int na = 0; na < card->cardsAbilities.size(); na++) { @@ -1092,30 +1110,31 @@ void GameObserver::Affinity() } } bool DoReduceIncrease = false; - if (card->has(Constants::AFFINITYARTIFACTS) || + if ( + (card->has(Constants::AFFINITYARTIFACTS) || card->has(Constants::AFFINITYFOREST) || card->has(Constants::AFFINITYGREENCREATURES) || card->has(Constants::AFFINITYISLAND) || card->has(Constants::AFFINITYMOUNTAIN) || card->has(Constants::AFFINITYPLAINS) || card->has(Constants::AFFINITYSWAMP) || - card->has(Constants::TRINISPHERE) || card->getIncreasedManaCost()->getConvertedCost() || card->getReducedManaCost()->getConvertedCost() || NewAffinityFound) + && + AffinityNeedsUpdate + ) DoReduceIncrease = true; if (!DoReduceIncrease) continue; + //above we check if there are even any cards that effect cards manacost - //if there are none, leave this function. manacost->copy( is a very expensive funtion - //1mb a sec to run at all time even when no known reducers or increasers are in play. - //memory snapshot shots pointed to this as such a heavy load that games with many cards inplay - //would slow to a crawl. //only do any of the following if a card with the stated ability is in your hand. //kicker is an addon to normal cost, suspend is not casting. add cost as needed EXACTLY as seen below. card->getManaCost()->resetCosts(); - ManaCost * newCost = NEW ManaCost(); + ManaCost *newCost = NEW ManaCost(); newCost->copy(card->computeNewCost(card, card->getManaCost(), card->model->data->getManaCost())); + card->getManaCost()->copy(newCost); SAFE_DELETE(newCost); if (card->getManaCost()->getAlternative()) @@ -1170,6 +1189,7 @@ void GameObserver::Affinity() }//end } } + AffinityNeedsUpdate = false; } void GameObserver::Render() @@ -1579,6 +1599,7 @@ int GameObserver::receiveEvent(WEvent * e) SAFE_DELETE(ev); eventsQueue.pop(); } + AffinityNeedsUpdate = true; return result; } diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index e5fc325fe..9fcbee96d 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -970,6 +970,14 @@ ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * Cos string type = ""; ManaCost * original = NEW ManaCost(); original->copy(Data); + Cost->copy(original); + if (Cost->extraCosts) + { + for (unsigned int i = 0; i < Cost->extraCosts->costs.size(); i++) + { + Cost->extraCosts->costs[i]->setSource(card); + } + } if (card->getIncreasedManaCost()->getConvertedCost() || card->getReducedManaCost()->getConvertedCost()) {//start1 if (card->getIncreasedManaCost()->getConvertedCost()) @@ -1076,6 +1084,13 @@ ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * Cos Cost->extraCosts->costs[i]->setSource(card); } } + if (Cost->extraCosts) + { + for (unsigned int i = 0; i < Cost->extraCosts->costs.size(); i++) + { + Cost->extraCosts->costs[i]->setSource(card); + } + } int reduce = 0; if (card->has(Constants::AFFINITYGREENCREATURES)) {