From e81346f8812c1003c234fe396ef8ba3a5dfaa5b5 Mon Sep 17 00:00:00 2001 From: zethfoxster Date: Thu, 14 Jul 2016 20:28:19 -0400 Subject: [PATCH] more work on cascade, I think I figured out what was causing a weird crash. --- projects/mtg/include/AllAbilities.h | 1 + projects/mtg/include/GameObserver.h | 1 + projects/mtg/include/MTGCardInstance.h | 1 + projects/mtg/src/AllAbilities.cpp | 13 +++++++++--- projects/mtg/src/GameObserver.cpp | 10 +++++++++ projects/mtg/src/MTGAbility.cpp | 28 ++++++++++++++++++++------ 6 files changed, 45 insertions(+), 9 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 392c89eb4..5681d7994 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -6208,6 +6208,7 @@ class AACascade: public ActivatedAbility { public: string nbcardsStr; + MTGCardInstance * castingThis; vectorselectedCards; vectoroldOrder; vectornewOrder; diff --git a/projects/mtg/include/GameObserver.h b/projects/mtg/include/GameObserver.h index 6b5fddb79..2f520043c 100644 --- a/projects/mtg/include/GameObserver.h +++ b/projects/mtg/include/GameObserver.h @@ -133,6 +133,7 @@ class GameObserver{ int isInPlay(MTGCardInstance * card); int isInGrave(MTGCardInstance * card); int isInExile(MTGCardInstance * card); + int isInHand(MTGCardInstance * card); virtual void Update(float dt); void Render(); void ButtonPressed(PlayGuiObject*); diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 4a59bb206..b06b2e656 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -92,6 +92,7 @@ public: bool isPhased; bool isCascaded; int phasedTurn; + bool handEffects; bool graveEffects; bool exileEffects; bool suspended; diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 83056f210..e5ced563c 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1143,6 +1143,7 @@ AACascade::AACascade(GameObserver* observer, int _id, MTGCardInstance * _source, selectedCards.clear(); oldOrder.clear(); newOrder.clear(); + castingThis = NULL; } int AACascade::resolve() { @@ -1171,10 +1172,9 @@ int AACascade::resolve() { if (!viable->isLand() && (viable->getManaCost()->getConvertedCost() < source->getManaCost()->getConvertedCost())) { - - toCastCard(viable); viable = player->game->putInZone(viable, library, exile); viable->isCascaded = true; + castingThis = viable; found = true; } else @@ -1193,7 +1193,7 @@ int AACascade::resolve() { if (exile->cards[j]->isCascaded) { - MTGCardInstance * CardToPutBack = exile->cards[j];//player->game->putInZone(exile->cards[j], exile, library); + MTGCardInstance * CardToPutBack = exile->cards[j];; CardToPutBack->isCascaded = false; selectedCards.push_back(CardToPutBack); } @@ -1213,6 +1213,13 @@ int AACascade::resolve() selectedCards.pop_back(); } } while (selectedCards.size()); + + if (castingThis) + { + while (castingThis->next) + castingThis = castingThis->next; + toCastCard(castingThis); + } } ////////////////////////////////////// return 1; diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index faa869fdb..7cca9d03e 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -1568,7 +1568,17 @@ int GameObserver::isInExile(MTGCardInstance * card) } return 0; } +int GameObserver::isInHand(MTGCardInstance * card) +{ + for (int i = 0; i < 2; i++) + { + MTGGameZone * hand = players[i]->game->hand; + if (players[i]->game->isInZone(card, hand)) + return 1; + } + return 0; +} void GameObserver::cleanupPhase() { currentPlayer->cleanupPhase(); diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index dbd525a22..42285fc82 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -3982,13 +3982,14 @@ int AbilityFactory::getAbilities(vector * v, Spell * spell, MTGCar { card->graveEffects = false; card->exileEffects = false; - + card->handEffects = false; for (int i = 0; i < 2; ++i) { MTGPlayerCards * zones = observer->players[i]->game; if (dest == zones->hand) { magicText = card->magicTexts["hand"]; + card->handEffects = true; break; } if (dest == zones->graveyard) @@ -4891,6 +4892,8 @@ int MTGAbility::testDestroy() return 1; if (forceDestroy == -1) return 0; + if (source->handEffects && game->isInHand(source)) + return 0; if(source->graveEffects && game->isInGrave(source)) return 0; if(source->exileEffects && game->isInExile(source)) @@ -5934,13 +5937,26 @@ int AManaProducer::isReactingToClick(MTGCardInstance * _card, ManaCost * mana) int result = 0; if (!mana) mana = game->currentlyActing()->getManaPool(); - if (_card == source && (!tap || !source->isTapped()) && game->currentlyActing()->game->inPlay->hasCard(source) - && (source->hasType(Subtypes::TYPE_LAND) || !tap || !source->hasSummoningSickness()) && !source->isPhased) + //please do not condense the following, I broke it apart for readability, it was far to difficult to tell what exactly happened before with it all in a single line. + //and far to prone to bugs. + if (_card == source) { - ManaCost * cost = getCost(); - if (!cost || (mana->canAfford(cost) && (!cost->extraCosts || cost->extraCosts->canPay())))/*counter cost bypass react to click*/ + if (!tap || (tap && !source->isTapped())) { - result = 1; + if (!source->hasSummoningSickness()) + { + if (game->currentlyActing()->game->inPlay->hasCard(source) && source->hasType(Subtypes::TYPE_LAND)) + { + if (!source->isPhased) + { + ManaCost * cost = getCost(); + if (!cost || (mana->canAfford(cost) && (!cost->extraCosts || cost->extraCosts->canPay())))/*counter cost bypass react to click*/ + { + result = 1; + } + } + } + } } } return result;