diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 0b2d7fdf5..d466a1ebb 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -88,6 +88,7 @@ public: bool graveEffects; bool exileEffects; bool suspended; + bool miracle; int chooseacolor; string chooseasubtype; int coinSide;//1 = tails diff --git a/projects/mtg/include/MTGGameZones.h b/projects/mtg/include/MTGGameZones.h index a2fab5992..fa1c78468 100644 --- a/projects/mtg/include/MTGGameZones.h +++ b/projects/mtg/include/MTGGameZones.h @@ -131,6 +131,7 @@ class MTGGameZone { class MTGLibrary: public MTGGameZone { public: + bool miracle;//we already consider a card a miracle drawn from here. vectorplaceOnTop; virtual ostream& toString(ostream&) const; const char * getName(){return "library";} diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 1e08324da..44e5d017a 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -209,6 +209,7 @@ void GameObserver::nextGamePhase() mLayers->actionLayer()->cleanGarbage(); //clean abilities history for this turn; mLayers->stackLayer()->garbageCollect(); //clean stack history for this turn; mLayers->actionLayer()->Update(0); + currentPlayer->game->library->miracle = false; for (int i = 0; i < 2; i++) { //Cleanup of each player's gamezones diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index c01ae80ac..797c7cdeb 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -333,6 +333,14 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe if(!isMorbid) return 0; } + + check = restriction[i].find("miracle"); + if(check != string::npos) + { + if(!card->miracle) + return 0; + } + check = restriction[i].find("ownerscontrol"); if(check != string::npos) { diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 75ee1b4dc..a9c3e7042 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -100,6 +100,7 @@ void MTGCardInstance::copy(MTGCardInstance * card) castMethod = castMethodBackUP; backupTargets = this->backupTargets; storedCard = oldStored; + miracle = false; } MTGCardInstance::~MTGCardInstance() @@ -171,6 +172,7 @@ void MTGCardInstance::initMTGCI() storedCard = NULL; storedSourceCard = NULL; myPair = NULL; + miracle = false; for (int i = 0; i < ManaCost::MANA_PAID_WITH_SUSPEND +1; i++) alternateCostPaid[i] = 0; diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index 7db789360..25ecc6fc3 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -242,18 +242,27 @@ void MTGPlayerCards::drawFromLibrary() } if(putInZone(toMove, library, hand)) + { toMove->currentZone = hand; + if (!library->miracle) + { + library->miracle = true; + toMove->miracle = true; + } + } } void MTGPlayerCards::resetLibrary() { SAFE_DELETE(library); library = NEW MTGLibrary(); + library->miracle = false; } void MTGPlayerCards::init() { library = NEW MTGLibrary(); + library->miracle = false; graveyard = NEW MTGGraveyard(); hand = NEW MTGHand(); inPlay = NEW MTGInPlay();