From 8265253388e6184a9ee0fba281186da477b487aa Mon Sep 17 00:00:00 2001 From: zethfoxster Date: Wed, 6 Jul 2016 20:26:18 -0400 Subject: [PATCH 1/2] fixed a issue with dredge where it was entering the stack even tho dredging itself is a replacement effect. --- projects/mtg/src/MTGRules.cpp | 49 ++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 6fbf93c05..d2e72a9bf 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -2774,11 +2774,9 @@ WEvent * MTGDredgeRule::replace(WEvent * event) Player * p = game->players[i]; if (e->player == p) { + int Dredgers = 0; for(int draw = 0;draw < e->nb_cards;draw++) { - tcb = tf.createTargetChooser("dredgeable",card); - tcb->targetter = NULL; - vectorselection; //look for other draw replacement effects list::iterator it; @@ -2802,27 +2800,36 @@ WEvent * MTGDredgeRule::replace(WEvent * event) } } - //there is a memleak here that i have no idea what causes it. - dredgeAbility = NEW dredgeCard(game, game->mLayers->actionLayer()->getMaxId(), card,NULL); - dredgeAbility->oneShot = true; - targetAbility = NEW GenericTargetAbility(game, "Dredge A Card","",game->mLayers->actionLayer()->getMaxId(), card,tcb->clone(),dredgeAbility->clone()); - targetAbility->oneShot = true; - SAFE_DELETE(dredgeAbility); + //there is a memleak here that i have no idea what causes it. got it reduced to just 4 bytes but its still bothering me. + if (Dredgers < e->nb_cards) + { + tcb = tf.createTargetChooser("dredgeable", card); + tcb->targetter = NULL; - targetAbilityAdder = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), card,NULL,targetAbility->clone()); - targetAbilityAdder->oneShot = true; - SAFE_DELETE(targetAbility); - MTGAbility * setDredge = targetAbilityAdder->clone(); - SAFE_DELETE(targetAbilityAdder); - setDredge->oneShot = true; + dredgeAbility = NEW dredgeCard(game, game->mLayers->actionLayer()->getMaxId(), card, NULL); + dredgeAbility->oneShot = true; + dredgeAbility->canBeInterrupted = false; + targetAbility = NEW GenericTargetAbility(game, "Dredge A Card", "", game->mLayers->actionLayer()->getMaxId(), card, tcb->clone(), dredgeAbility->clone()); + SAFE_DELETE(tcb); + SAFE_DELETE(dredgeAbility); + targetAbility->oneShot = true; + targetAbility->canBeInterrupted = false; + targetAbilityAdder = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), card, NULL, targetAbility->clone()); + targetAbilityAdder->oneShot = true; + SAFE_DELETE(targetAbility); + MTGAbility * setDredge = targetAbilityAdder->clone(); + SAFE_DELETE(targetAbilityAdder); + setDredge->oneShot = true; - selection.push_back(setDredge); - targetAbility1 = NEW AADrawer(game, this->GetId(), card,card,NULL, "1",TargetChooser::CONTROLLER,true); - selection.push_back(targetAbility1); - MTGAbility * menuChoice = NEW MenuAbility(game, this->GetId(), card, card,true,selection,card->controller(),"Dredge or Draw"); + selection.push_back(setDredge); + targetAbility1 = NEW AADrawer(game, this->GetId(), card, card, NULL, "1", TargetChooser::CONTROLLER, true); + targetAbility1->canBeInterrupted = false; + selection.push_back(targetAbility1); + MTGAbility * menuChoice = NEW MenuAbility(game, this->GetId(), card, card, true, selection, card->controller(), "Dredge or Draw"); - menuChoice->addToGame(); - SAFE_DELETE(tcb); + menuChoice->addToGame(); + + } } SAFE_DELETE(event); From 066c40d9c1001e224cd9271098d81d4adfbb4eac Mon Sep 17 00:00:00 2001 From: zethfoxster Date: Wed, 6 Jul 2016 22:04:59 -0400 Subject: [PATCH 2/2] close library, exile, or graveyard after we "move" cards from it. --- projects/mtg/include/GameObserver.h | 1 + projects/mtg/src/GameObserver.cpp | 1 + projects/mtg/src/GuiStatic.cpp | 2 ++ projects/mtg/src/MTGGameZones.cpp | 11 +++++++++++ 4 files changed, 15 insertions(+) diff --git a/projects/mtg/include/GameObserver.h b/projects/mtg/include/GameObserver.h index 03fe778c2..0e1a096eb 100644 --- a/projects/mtg/include/GameObserver.h +++ b/projects/mtg/include/GameObserver.h @@ -81,6 +81,7 @@ class GameObserver{ int oldGamePhase; TargetChooser * targetChooser; CardDisplay * OpenedDisplay; + GuiGameZone * guiOpenDisplay; DuelLayers * mLayers; ReplacementEffects *replacementEffects; vector players; //created outside diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 03463f74f..78db68e96 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -98,6 +98,7 @@ GameObserver::GameObserver(WResourceManager *output, JGE* input) cardWaitingForTargets = NULL; mExtraPayment = NULL; OpenedDisplay = NULL; + guiOpenDisplay = NULL; gameOver = NULL; phaseRing = NULL; replacementEffects = NEW ReplacementEffects(); diff --git a/projects/mtg/src/GuiStatic.cpp b/projects/mtg/src/GuiStatic.cpp index 1ec667c15..d224a0a05 100644 --- a/projects/mtg/src/GuiStatic.cpp +++ b/projects/mtg/src/GuiStatic.cpp @@ -151,11 +151,13 @@ void GuiGameZone::toggleDisplay() { if (showCards) { + cd->zone->owner->getObserver()->guiOpenDisplay = NULL; showCards = 0; cd->zone->owner->getObserver()->OpenedDisplay = NULL; } else if(!cd->zone->owner->getObserver()->OpenedDisplay)//one display at a time please. { + cd->zone->owner->getObserver()->guiOpenDisplay = this; showCards = 1; cd->init(zone); cd->zone->owner->getObserver()->OpenedDisplay = cd; diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index d8b4940d1..9f4e6e572 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -363,6 +363,16 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone if (!card->isToken) to = g->players[i]->game->exile; } + + + if (from == g->players[i]->game->library || from == g->players[i]->game->graveyard || from == g->players[i]->game->exile) + { + if (g->guiOpenDisplay) + { + g->ButtonPressed(g->guiOpenDisplay); + } + } + } //all cards that go from the hand to the graveyard is ALWAYS a discard. if ((to == g->players[0]->game->graveyard || to == g->players[1]->game->graveyard) && (from == g->players[0]->game->hand || from @@ -370,6 +380,7 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone { card->discarded = true; } + //When a card is moved from inPlay to inPlay (controller change, for example), it is still the same object if ((to == g->players[0]->game->inPlay || to == g->players[1]->game->inPlay) && (from == g->players[0]->game->inPlay || from == g->players[1]->game->inPlay))