From 5f1874edae7069217d545f9bd2981fdf76e6189c Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 1 Mar 2017 06:36:10 +0800 Subject: [PATCH] planeswalker attack --- projects/mtg/include/MTGCardInstance.h | 1 + projects/mtg/include/MTGDefinitions.h | 3 ++- projects/mtg/include/MTGRules.h | 2 +- projects/mtg/src/AllAbilities.cpp | 7 +++++++ projects/mtg/src/MTGAbility.cpp | 2 +- projects/mtg/src/MTGCardInstance.cpp | 19 +++++++++++++++++++ projects/mtg/src/MTGDefinitions.cpp | 3 ++- projects/mtg/src/MTGRules.cpp | 8 +++++--- projects/mtg/src/Player.cpp | 2 ++ 9 files changed, 40 insertions(+), 7 deletions(-) diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index fa7803ee0..4e84b29a1 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -171,6 +171,7 @@ public: int canBlock(); int canBlock(MTGCardInstance * opponent); int canAttack(); + int canPWAttack(); int isAttacker(); Targetable * isAttacking; MTGCardInstance * storedCard; diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index 86486e21a..e48bfa906 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, + CANTATTACKPW = 147, + NB_BASIC_ABILITIES = 148, RARITY_S = 'S', //Special Rarity RARITY_M = 'M', //Mythics diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index 45cd82c56..76362fe44 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -279,7 +279,7 @@ public: MTGAttackRule(GameObserver* observer, int _id); const string getMenuText() { - return "Attacker"; + return "Attack Player"; } int receiveEvent(WEvent * event); virtual MTGAttackRule * clone() const; diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 99236b420..8b8268c83 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1158,7 +1158,14 @@ AADamager::AADamager(GameObserver* observer, int _id, MTGCardInstance * _source, { MTGCardInstance * _target = dynamic_cast(target); if(_target && _target->hasType(Subtypes::TYPE_PLANESWALKER)) + { + if(d.size()) + { + WParsedInt parsedNum(d, NULL, source); + return _("Deal " + parsedNum.getStringValue() + " Damage to " + _target->name).c_str(); + } return _target->name.c_str(); + } if(redirected) { if(d.size()) diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 3e62c1919..ae0e396fa 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -743,7 +743,7 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe check = restriction[i].find("didnotcastnontoken"); if(check != string::npos) { - restriction.push_back("lastturn(*[-token]|mystack,mybattlefield)~lessthan~1"); + restriction.push_back("lastturn(*[-token]|opponentstack,opponentbattlefield)~lessthan~1"); } check = restriction[i].find("paid("); diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 63bcc6707..0d54374f9 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -690,6 +690,25 @@ int MTGCardInstance::canAttack() return 1; } +int MTGCardInstance::canPWAttack() +{ + if (has(Constants::CANTATTACKPW)) + return 0; + if (has(Constants::FLYERSONLY) && !has(Constants::FLYING)) + return 0; + if (tapped) + return 0; + if (hasSummoningSickness()) + return 0; + if (has(Constants::DEFENSER) && !has(Constants::CANATTACK)) + return 0; + if (!isCreature()) + return 0; + if (!isInPlay(observer)) + return 0; + return 1; +} + int MTGCardInstance::addToToughness(int value) { toughness += value; diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 2f1ac37d8..c776d4310 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..753f67e00 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -1862,8 +1862,10 @@ int MTGAttackRule::receiveEvent(WEvent *e) card->setAttacker(0); if (card->isAttacker() && !card->has(Constants::VIGILANCE)) card->tap(); - if (card->isAttacker() && card->has(Constants::CANTATTACK)) + if (card->isAttacker() && card->has(Constants::CANTATTACK) && (card->isAttacking && ((Damageable*)card->isAttacking)->type_as_damageable == Damageable::DAMAGEABLE_PLAYER)) card->toggleAttacker();//if a card has cantattack, then you cant + if (card->isAttacker() && card->has(Constants::CANTATTACKPW) && (card->isAttacking && ((Damageable*)card->isAttacking)->type_as_damageable == Damageable::DAMAGEABLE_PLAYER)) + card->toggleAttacker(); } return 1; } @@ -1915,7 +1917,7 @@ int MTGPlaneswalkerAttackRule::isReactingToClick(MTGCardInstance * card, ManaCos return 0; if (card->isAttacker()) return 1; - if (card->canAttack() && card->attackPlaneswalkerCost < 1) + if (card->canPWAttack() && card->attackPlaneswalkerCost < 1) return 1; } return 0; @@ -1972,7 +1974,7 @@ bool MTGPlaneswalkerAttackRule::select(Target* t) if (CardView* c = dynamic_cast(t)) { MTGCardInstance * card = c->getCard(); - if (card->canAttack() && !card->isPhased) + if (card->canPWAttack() && !card->isPhased) return true; } return false; diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 33bb22994..cb2309c86 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -262,6 +262,8 @@ bool Player::hasPossibleAttackers() MTGCardInstance * c = z->cards[j]; if (c->canAttack() && c->isCreature()) return true; + if (c->canPWAttack() && c->isCreature() && c->controller()->opponent()->inPlay()->hasType("planeswalker")) + return true; } return false; }