diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 74b3dfb9c..40207411c 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -3483,6 +3483,7 @@ MTGCardInstance * OriginalSrc; MTGCardInstance * storedTarget; MTGAbility * storedAbility; MTGAbility * clonedStored; +MTGAbility * mainAbility; string menu; AADynamic(GameObserver* observer, int id, MTGCardInstance * card, Damageable * _target,int type = 0,int effect = 0,int who = 0,int amountsource = 1,MTGAbility * storedAbility = NULL, ManaCost * _cost = NULL); diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index 21d8bae04..774a1164a 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -243,15 +243,17 @@ public: class MTGBlockRule: public PermanentAbility { public: + string blockmenu; + TargetChooser * tcb; + MTGAbility * blocker; + MTGAbility * blockAbility; int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL); int reactToClick(MTGCardInstance * card); virtual ostream& toString(ostream& out) const; MTGBlockRule(GameObserver* observer, int _id); - const char * getMenuText() - { - return "Blocker"; - } + const char * getMenuText(); virtual MTGBlockRule * clone() const; + ~MTGBlockRule(); }; /* Persist Rule */ diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index b574e04e1..79dabf87c 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1758,6 +1758,7 @@ ActivatedAbility(observer, id, card, _cost, 0),type(type),effect(effect),who(who menu = ""; OriginalSrc = source; clonedStored = NULL; + mainAbility = NULL; } int AADynamic::resolve() @@ -1934,58 +1935,58 @@ int AADynamic::resolve() { case DYNAMIC_ABILITY_EFFECT_STRIKE://deal damage { - AADamager * a = NEW AADamager(game, this->GetId(), source,tosrc == true?(Targetable*)OriginalSrc:(Targetable*)_target,sourceamountstring); - activateMainAbility(a,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target); + mainAbility = NEW AADamager(game, this->GetId(), source,tosrc == true?(Targetable*)OriginalSrc:(Targetable*)_target,sourceamountstring); + activateMainAbility(mainAbility,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target); if(eachother) { - AADamager * a = NEW AADamager(game, this->GetId(), source,tosrc == true?(Targetable*)OriginalSrc:(Targetable*)_target,targetamountstring); - activateMainAbility(a,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target); + mainAbility = NEW AADamager(game, this->GetId(), source,tosrc == true?(Targetable*)OriginalSrc:(Targetable*)_target,targetamountstring); + activateMainAbility(mainAbility,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target); } return 1; break; } case DYNAMIC_ABILITY_EFFECT_DRAW://draw cards { - AADrawer * a = NEW AADrawer(game, this->GetId(), source,_target,NULL, sourceamountstring); - return activateMainAbility(a,source,_target); + mainAbility = NEW AADrawer(game, this->GetId(), source,_target,NULL, sourceamountstring); + return activateMainAbility(mainAbility,source,_target); break; } case DYNAMIC_ABILITY_EFFECT_LIFEGAIN://gain life { - AALifer * a = NEW AALifer(game, this->GetId(), source,_target, sourceamountstring); - return activateMainAbility(a,source,_target); + mainAbility = NEW AALifer(game, this->GetId(), source,_target, sourceamountstring); + return activateMainAbility(mainAbility,source,_target); break; } case DYNAMIC_ABILITY_EFFECT_PUMPPOWER://pump power { - PTInstant * a = NEW PTInstant(game, this->GetId(), source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target,NEW WParsedPT(sourceamount,0)); - return activateMainAbility(a,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target); + mainAbility = NEW PTInstant(game, this->GetId(), source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target,NEW WParsedPT(sourceamount,0)); + return activateMainAbility(mainAbility,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target); break; } case DYNAMIC_ABILITY_EFFECT_PUMPTOUGHNESS://pump toughness { - PTInstant * a = NEW PTInstant(game, this->GetId(), source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target,NEW WParsedPT(0,sourceamount)); - return activateMainAbility(a,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target); + mainAbility = NEW PTInstant(game, this->GetId(), source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target,NEW WParsedPT(0,sourceamount)); + return activateMainAbility(mainAbility,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target); break; } case DYNAMIC_ABILITY_EFFECT_PUMPBOTH://pump both { - PTInstant * a = NEW PTInstant(game, this->GetId(), source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target,NEW WParsedPT(sourceamount,sourceamount)); - return activateMainAbility(a,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target); + mainAbility = NEW PTInstant(game, this->GetId(), source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target,NEW WParsedPT(sourceamount,sourceamount)); + return activateMainAbility(mainAbility,source,tosrc == true?OriginalSrc:(MTGCardInstance*)_target); break; } case DYNAMIC_ABILITY_EFFECT_LIFELOSS://lose life { string altered = "-"; altered.append(sourceamountstring); - AALifer * a = NEW AALifer(game, this->GetId(), source,_target, altered); - return activateMainAbility(a,source,_target); + mainAbility = NEW AALifer(game, this->GetId(), source,_target, altered); + return activateMainAbility(mainAbility,source,_target); break; } case DYNAMIC_ABILITY_EFFECT_DEPLETE://deplete cards { - AADepleter * a = NEW AADepleter(game, this->GetId(), source,_target, sourceamountstring); - return activateMainAbility(a,source,_target); + mainAbility = NEW AADepleter(game, this->GetId(), source,_target, sourceamountstring); + return activateMainAbility(mainAbility,source,_target); break; } case DYNAMIC_ABILITY_EFFECT_COUNTERSONEONE: @@ -2015,7 +2016,9 @@ int AADynamic::activateMainAbility(MTGAbility * toActivate,MTGCardInstance * sou return 1; } toActivate->oneShot = true; + toActivate->forceDestroy = 1; toActivate->resolve(); + SAFE_DELETE(toActivate); return 1; } diff --git a/projects/mtg/src/ExtraCost.cpp b/projects/mtg/src/ExtraCost.cpp index 5ebf54b85..ac7fcbd52 100644 --- a/projects/mtg/src/ExtraCost.cpp +++ b/projects/mtg/src/ExtraCost.cpp @@ -317,7 +317,7 @@ int MillCost::doPay() MTGCardInstance * _target = (MTGCardInstance *) target; if (target) { - source->storedCard = target; + source->storedCard = (MTGCardInstance*)_target->controller()->game->library->cards[_target->controller()->game->library->nb_cards - 1]; _target->controller()->game->putInZone( _target->controller()->game->library->cards[_target->controller()->game->library->nb_cards - 1], _target->controller()->game->library, _target->controller()->game->graveyard); @@ -339,7 +339,7 @@ MillExileCost::MillExileCost(TargetChooser *_tc) int MillExileCost::doPay() { MTGCardInstance * _target = (MTGCardInstance *) target; - source->storedCard = target; + source->storedCard = (MTGCardInstance*)_target->controller()->game->library->cards[_target->controller()->game->library->nb_cards - 1]; if (target) { _target->controller()->game->putInZone( diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index fb212138e..947ba72bd 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -1494,6 +1494,9 @@ MTGBlockRule::MTGBlockRule(GameObserver* observer, int _id) : PermanentAbility(observer, _id) { aType = MTGAbility::MTG_BLOCK_RULE; + tcb = NULL; + blocker = NULL; + blockAbility = NULL; } int MTGBlockRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) @@ -1503,7 +1506,13 @@ int MTGBlockRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) ) { if (card->canBlock() && !card->isPhased) + { + if(card->isDefenser()) + blockmenu = "Remove Blocker"; + else + blockmenu = "Assign To Block"; return 1; + } } return 0; } @@ -1515,17 +1524,45 @@ int MTGBlockRule::reactToClick(MTGCardInstance * card) MTGCardInstance * currentOpponent = card->isDefenser(); bool result = false; int canDefend = 0; - while (!result) + if(card->controller()->isHuman()) { - currentOpponent = game->currentPlayer->game->inPlay->getNextAttacker(currentOpponent); - canDefend = card->toggleDefenser(currentOpponent); + if(!currentOpponent) + { - DebugTrace("Defenser Toggle: " << card->getName() << endl - << "- canDefend: " << (canDefend == 0) << endl - << "- currentOpponent: " << currentOpponent); - result = (canDefend || currentOpponent == NULL); + SAFE_DELETE(blockAbility); + TargetChooserFactory tf(card->getObserver()); + tcb = tf.createTargetChooser("blockable",card); + tcb->targetter = NULL; + blocker = NEW AABlock(card->getObserver(),-1,card,NULL); + blocker->oneShot = true; + blocker->forceDestroy = 1; + blocker->canBeInterrupted = false; + blockAbility = NEW GenericTargetAbility(game, "choose attacker","blockers",-1, card,tcb, blocker); + blockAbility->oneShot = true; + blockAbility->forceDestroy = 1; + blockAbility->canBeInterrupted = false; + return blockAbility->reactToTargetClick(card); + } + else + card->toggleDefenser(NULL); } - return 1; + else + while (!result) + { + currentOpponent = game->currentPlayer->game->inPlay->getNextAttacker(currentOpponent); + canDefend = card->toggleDefenser(currentOpponent); + + DebugTrace("Defenser Toggle: " << card->getName() << endl + << "- canDefend: " << (canDefend == 0) << endl + << "- currentOpponent: " << currentOpponent); + result = (canDefend || currentOpponent == NULL); + } + return 1; +} + +const char * MTGBlockRule::getMenuText() +{ + return blockmenu.c_str(); } ostream& MTGBlockRule::toString(ostream& out) const @@ -1538,6 +1575,12 @@ MTGBlockRule * MTGBlockRule::clone() const { return NEW MTGBlockRule(*this); } + +MTGBlockRule::~MTGBlockRule() +{ + SAFE_DELETE(blockAbility); +} + // // Attacker chooses blockers order //