diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index a3928cc75..1f93a7ef7 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -42,6 +42,7 @@ public: int skippingTurn; int extraTurn; int drawCounter; + vector prowledTypes; vectorcurses; Player(GameObserver *observer, string deckFile, string deckFileSmall, MTGDeck * deck = NULL); virtual ~Player(); diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index 3fbbda012..aff70bd6b 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -153,6 +153,15 @@ int Damage::resolve() if(!_target->inPlay()->hasAbility(Constants::POISONSHROUD)) _target->poisonCount += damage;//this will be changed to poison counters. _target->damageCount += damage; + if ( typeOfDamage == 1 && target == source->controller()->opponent() )//add vector prowledtypes. + { + vector values = MTGAllCards::getCreatureValuesById(); + for (size_t i = 0; i < values.size(); ++i) + { + if ( source->hasSubtype( values[i] ) && find(source->controller()->prowledTypes.begin(), source->controller()->prowledTypes.end(), values[i])==source->controller()->prowledTypes.end() ) + source->controller()->prowledTypes.push_back(values[i]); + } + } } else if (target->type_as_damageable == DAMAGEABLE_PLAYER && (source->has(Constants::POISONTOXIC) || source->has(Constants::POISONTWOTOXIC) || source->has(Constants::POISONTHREETOXIC))) @@ -161,6 +170,15 @@ int Damage::resolve() Player * _target = (Player *) target; a = target->dealDamage(damage); target->damageCount += damage; + if ( typeOfDamage == 1 && target == source->controller()->opponent() )//add vector prowledtypes. + { + vector values = MTGAllCards::getCreatureValuesById(); + for (size_t i = 0; i < values.size(); ++i) + { + if ( source->hasSubtype( values[i] ) && find(source->controller()->prowledTypes.begin(), source->controller()->prowledTypes.end(), values[i])==source->controller()->prowledTypes.end() ) + source->controller()->prowledTypes.push_back(values[i]); + } + } if(!_target->inPlay()->hasAbility(Constants::POISONSHROUD)) { if (source->has(Constants::POISONTOXIC)) @@ -197,6 +215,15 @@ int Damage::resolve() ((MTGCardInstance*)source)->damageToOpponent = true; } target->lifeLostThisTurn += damage; + if ( typeOfDamage == 1 && target == source->controller()->opponent() )//add vector prowledtypes. + { + vector values = MTGAllCards::getCreatureValuesById(); + for (size_t i = 0; i < values.size(); ++i) + { + if ( source->hasSubtype( values[i] ) && find(source->controller()->prowledTypes.begin(), source->controller()->prowledTypes.end(), values[i])==source->controller()->prowledTypes.end() ) + source->controller()->prowledTypes.push_back(values[i]); + } + } WEvent * lifed = NEW WEventLife((Player*)target,-damage); observer->receiveEvent(lifed); } diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 44e5d017a..cfa63dc4c 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -204,6 +204,7 @@ void GameObserver::nextGamePhase() cleanupPhase(); currentPlayer->damageCount = 0; currentPlayer->drawCounter = 0; + currentPlayer->prowledTypes.clear(); currentPlayer->opponent()->damageCount = 0; //added to clear odcount currentPlayer->preventable = 0; mLayers->actionLayer()->cleanGarbage(); //clean abilities history for this turn; @@ -230,6 +231,7 @@ void GameObserver::nextGamePhase() } mLayers->actionLayer()->Update(0); currentPlayer->drawCounter = 0; + currentPlayer->prowledTypes.clear(); currentPlayer->lifeLostThisTurn = 0; currentPlayer->opponent()->lifeLostThisTurn = 0; currentPlayer->doesntEmpty->remove(currentPlayer->doesntEmpty); diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 797c7cdeb..e9897e3e0 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -341,6 +341,22 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe return 0; } + check = restriction[i].find("prowl"); + if(check != string::npos) + { + bool isProwled = false; + for (size_t i = 0; i < card->controller()->prowledTypes.size(); ++i) + { + if ( card->hasSubtype( card->controller()->prowledTypes[i] )) + { + isProwled = true; + break; + } + } + if(!isProwled) + return 0; + } + check = restriction[i].find("ownerscontrol"); if(check != string::npos) { diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 58cdfdf3b..2792c5a11 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -33,6 +33,7 @@ Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck * skippingTurn = 0; extraTurn = 0; drawCounter = 0; + prowledTypes.clear(); doesntEmpty = NEW ManaCost(); poolDoesntEmpty = NEW ManaCost(); if (deck != NULL)