diff --git a/projects/mtg/include/MTGGameZones.h b/projects/mtg/include/MTGGameZones.h index 0c6158fda..371e9f97a 100644 --- a/projects/mtg/include/MTGGameZones.h +++ b/projects/mtg/include/MTGGameZones.h @@ -165,6 +165,7 @@ public: void untapAll(); MTGCardInstance * getNextAttacker(MTGCardInstance * previous); MTGCardInstance * getNextLurer(MTGCardInstance * previous); + MTGCardInstance * findALurer(); virtual ostream& toString(ostream&) const; const char * getName(){return "battlefield";} }; diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index d32d15037..b601bd130 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -247,6 +247,7 @@ public: TargetChooser * tcb; MTGAbility * blocker; MTGAbility * blockAbility; + int receiveEvent(WEvent * event); int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL); int reactToClick(MTGCardInstance * card); virtual ostream& toString(ostream& out) const; diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index 5322429bd..6e20f1358 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -785,6 +785,19 @@ MTGCardInstance * MTGInPlay::getNextLurer(MTGCardInstance * previous) return NULL; } +MTGCardInstance * MTGInPlay::findALurer() +{ + for (int i = 0; i < nb_cards; i++) + { + MTGCardInstance * current = cards[i]; + if (current->isAttacker() && current->has(Constants::LURE)) + { + return current; + } + } + return NULL; +} + void MTGInPlay::untapAll() { int i; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 8c07ef649..8bc8295f9 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -1499,6 +1499,33 @@ PermanentAbility(observer, _id) blockAbility = NULL; } +int MTGBlockRule::receiveEvent(WEvent *e) +{ + if (WEventCombatStepChange * event = dynamic_cast(e)) + { + if (TRIGGERS == event->step) + { + Player * p = game->currentPlayer; + MTGCardInstance * lurer = p->game->inPlay->findALurer(); + if(lurer) + { + MTGGameZone * z = p->opponent()->game->inPlay; + for (int i = 0; i < z->nb_cards; i++) + { + MTGCardInstance * card = z->cards[i]; + if ((card->defenser && !card->defenser->has(Constants::LURE))||!card->defenser) + if(card->canBlock(lurer)) + card->setDefenser(lurer); + //force a block on a lurer, the player has a chance to set his own choice on multiple lures + //but this action can not be ignored. + } + } + return 1; + } + } + return 0; +} + int MTGBlockRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) { if (currentPhase == MTG_PHASE_COMBATBLOCKERS && !game->isInterrupting @@ -1549,14 +1576,10 @@ int MTGBlockRule::reactToClick(MTGCardInstance * card) else { bool lured = false; - int lureFound = 0; - MTGCardInstance * lurers = NULL; - while(!lureFound) + MTGCardInstance * lurers = game->currentPlayer->game->inPlay->findALurer(); + if(lurers) { - lurers = game->currentPlayer->game->inPlay->getNextLurer(lurers); - lureFound = (lurers == NULL || lurers->attacker); - if(lurers) - lured = true; + lured = true; } while (!result) { diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index 6bb489efc..23e402489 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -1543,14 +1543,10 @@ bool BlockableChooser::canTarget(Targetable * target,bool withoutProtections) if(!card->isAttacker() || !source->canBlock(card)) return false; bool lured = false; - int lureFound = 0; - MTGCardInstance * lurers = NULL; - while(!lureFound) + MTGCardInstance * lurers = observer->currentPlayer->game->inPlay->findALurer(); + if(lurers) { - lurers = card->controller()->game->inPlay->getNextLurer(lurers); - lureFound = (lurers == NULL || lurers->attacker); - if(lurers) - lured = true; + lured = true; } if(lured && card->controller()->inPlay()->hasAbility(Constants::LURE) && !card->has(Constants::LURE)) return false;