diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index fa7803ee0..82cd9c42a 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -170,7 +170,7 @@ public: MTGCardInstance * banding; // If belongs to a band when attacking int canBlock(); int canBlock(MTGCardInstance * opponent); - int canAttack(); + int canAttack( bool pwcheck = false ); int isAttacker(); Targetable * isAttacking; MTGCardInstance * storedCard; diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index 86486e21a..07d95d2ec 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -266,7 +266,8 @@ class Constants HIDDENFACE = 144, ANYTYPEOFMANA = 145, NECROED = 146, - NB_BASIC_ABILITIES = 147, + CANTPWATTACK = 147, + NB_BASIC_ABILITIES = 148, RARITY_S = 'S', //Special Rarity RARITY_M = 'M', //Mythics diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index a31981179..79cf7b47c 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -368,10 +368,13 @@ void CardGui::Render() JQuadPtr ssMask = card->getObserver()->getResourceManager()->GetQuad("white"); //choose attacker mask - if(card->isInPlay(game) && (card->hasSummoningSickness() || card->attackCost > 0) && !card->isPhased && card->isCreature()) + if(card->isInPlay(game) && card->isCreature() + && ((!card->canAttack() || (card->attackCost > 0)) && (!card->canAttack(true) || (card->attackPlaneswalkerCost > 0))) + && !card->isPhased && !card->didattacked ) { - if(game->getCurrentGamePhase() > MTG_PHASE_FIRSTMAIN && game->getCurrentGamePhase() < MTG_PHASE_SECONDMAIN && - card->controller() == game->currentPlayer && game->currentPlayer->hasPossibleAttackers()) + if(game->getCurrentGamePhase() > MTG_PHASE_FIRSTMAIN + && game->getCurrentGamePhase() < MTG_PHASE_SECONDMAIN + && card->controller() == game->currentPlayer ) { if(card->controller()->isHuman() && ssMask) { diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 63bcc6707..62294f983 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -671,12 +671,20 @@ Player * MTGCardInstance::controller() return lastController; } -int MTGCardInstance::canAttack() +int MTGCardInstance::canAttack( bool pwcheck ) { - if (has(Constants::CANTATTACK)) - return 0; - if (has(Constants::FLYERSONLY) && !has(Constants::FLYING)) - return 0; + if(!pwcheck) + { + if (has(Constants::CANTATTACK)) + return 0; + if (has(Constants::FLYERSONLY) && !has(Constants::FLYING)) + return 0; + } + else + { + if (has(Constants::CANTPWATTACK)) + return 0; + } if (tapped) return 0; if (hasSummoningSickness()) diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 2f1ac37d8..9f2ad9e41 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -177,7 +177,8 @@ const char* Constants::MTGBasicAbilities[] = { "cantcrew", "hiddenface",//test for hiding card "anytypeofmana", - "necroed"//hide necored + "necroed",//hide necored + "cantpwattack" }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 9c4e75428..0b389b9d4 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -1863,7 +1863,27 @@ int MTGAttackRule::receiveEvent(WEvent *e) if (card->isAttacker() && !card->has(Constants::VIGILANCE)) card->tap(); if (card->isAttacker() && card->has(Constants::CANTATTACK)) - card->toggleAttacker();//if a card has cantattack, then you cant + { + if(card->isAttacking) + { + Damageable * dtarget = ((Damageable *)card->isAttacking); + if(dtarget->type_as_damageable == Damageable::DAMAGEABLE_PLAYER) + card->toggleAttacker();//if a card has cantattack, then you cant + } + } + else if (card->isAttacker() && card->has(Constants::CANTPWATTACK)) + { + if(card->isAttacking) + { + Damageable * dtarget = ((Damageable *)card->isAttacking); + if(dtarget->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) + { + MTGCardInstance * ctarget = ((MTGCardInstance *)card->isAttacking); + if(ctarget->hasType(Subtypes::TYPE_PLANESWALKER)) + card->toggleAttacker();//if a card has cantpwattack, then you cant + } + } + } } return 1; } @@ -1915,7 +1935,7 @@ int MTGPlaneswalkerAttackRule::isReactingToClick(MTGCardInstance * card, ManaCos return 0; if (card->isAttacker()) return 1; - if (card->canAttack() && card->attackPlaneswalkerCost < 1) + if (card->canAttack(true) && card->attackPlaneswalkerCost < 1) return 1; } return 0; @@ -1972,7 +1992,7 @@ bool MTGPlaneswalkerAttackRule::select(Target* t) if (CardView* c = dynamic_cast(t)) { MTGCardInstance * card = c->getCard(); - if (card->canAttack() && !card->isPhased) + if (card->canAttack(true) && !card->isPhased) return true; } return false; diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 33bb22994..29986408c 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -260,7 +260,7 @@ bool Player::hasPossibleAttackers() for (int j = 0; j < nbcards; ++j) { MTGCardInstance * c = z->cards[j]; - if (c->canAttack() && c->isCreature()) + if ((c->canAttack(true) || c->canAttack()) && c->isCreature()) return true; } return false;