force a lure block when the players decide they want to skip the action, a lurer MUST be blocked if the defending creature can block it. this action can not be skipped.

This commit is contained in:
omegablast2002@yahoo.com
2013-01-25 14:25:26 +00:00
parent f1032c64b5
commit 0db78c0444
5 changed files with 48 additions and 14 deletions

View File

@@ -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";}
};

View File

@@ -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;

View File

@@ -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;

View File

@@ -1499,6 +1499,33 @@ PermanentAbility(observer, _id)
blockAbility = NULL;
}
int MTGBlockRule::receiveEvent(WEvent *e)
{
if (WEventCombatStepChange * event = dynamic_cast<WEventCombatStepChange*>(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)
{

View File

@@ -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;