diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index f35888d066..53d678a785 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -9246,6 +9246,7 @@ type=Artifact [/card] [card] name=Black Ward +abilities=auraward target=creature auto=protection from black text=Enchant creature -- Enchanted creature has protection from black. This effect doesn't remove Black Ward. @@ -10887,6 +10888,7 @@ type=Instant [/card] [card] name=Blue Ward +abilities=auraward target=creature auto=protection from blue text=Enchant creature -- Enchanted creature has protection from blue. This effect doesn't remove Blue Ward. @@ -16532,6 +16534,7 @@ toughness=2 [/card] [card] name=Cho-Manno's Blessing +abilities=auraward target=creature abilities=flash auto=chooseacolor teach(creature) protection from(*[chosencolor]) chooseend @@ -26107,7 +26110,7 @@ type=Sorcery [/card] [card] name=Dragon Grip -other={2}{R} Name(cast anytime) +other={2}{R} name(cast anytime) otherrestriction=type(creature[power>=4]|mybattlefield)~morethan~0 abilities=spellmastery target=creature @@ -35073,6 +35076,7 @@ toughness=2 [/card] [card] name=Flickering Ward +abilities=auraward target=creature auto=chooseacolor teach(creature) protection from(*[chosencolor]) chooseend auto={W}:moveTo(ownerhand) @@ -35150,6 +35154,7 @@ toughness=2 [/card] [card] name=Floating Shield +abilities=auraward target=creature auto=chooseacolor teach(creature) protection from(*[chosencolor]) chooseend auto={S}:protection from white target(creature) @@ -42027,6 +42032,7 @@ subtype=Aura [/card] [card] name=Green Ward +abilities=auraward target=creature auto=protection from green text=Enchant creature -- Enchanted creature has protection from green. This effect doesn't remove Green Ward. @@ -71570,6 +71576,7 @@ toughness=3 [/card] [card] name=Pentarch Ward +abilities=auraward target=creature auto=chooseacolor teach(creature) protection from(*[chosencolor]) chooseend auto=draw:1 @@ -73677,6 +73684,7 @@ type=Sorcery [/card] [card] name=Pledge of Loyalty +abilities=auraward target=creature auto=aslongas(*[red]|mybattlefield) protection from red auto=aslongas(*[green]|mybattlefield) protection from green @@ -78553,6 +78561,7 @@ type=Sorcery [/card] [card] name=Red Ward +abilities=auraward target=creature auto=protection from red text=Enchant creature -- Enchanted creature has protection from red. This effect doesn't remove Red Ward. @@ -99792,6 +99801,7 @@ toughness=1 [/card] [card] name=Tattoo Ward +abilities=auraward target=creature auto=1/1 auto=protection from(enchantment) @@ -112787,6 +112797,7 @@ type=Instant [/card] [card] name=White Ward +abilities=auraward target=creature auto=protection from white text=Enchant creature -- Enchanted creature has protection from white. This effect doesn't remove White Ward. diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 0b94c47ff8..c55f155e70 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -526,6 +526,7 @@ pillory_of_the_sleepless2_i188.txt pillory_of_the_sleepless3_i188.txt pillory_of_the_sleepless4_i188.txt plague_rats.txt +pledge_protection.txt plumes_of_peace_i260.txt pouncing_jaguar_i425.txt power_armor.txt diff --git a/projects/mtg/bin/Res/test/pledge_protection.txt b/projects/mtg/bin/Res/test/pledge_protection.txt new file mode 100644 index 0000000000..364af6a760 --- /dev/null +++ b/projects/mtg/bin/Res/test/pledge_protection.txt @@ -0,0 +1,46 @@ +#Testing Protection +#702.16c A permanent or player with protection can’t be enchanted by Auras that have the stated +#quality. Such Auras attached to the permanent or player with protection will be put into their +#owners’ graveyards as a state-based action. +# +#702.16d A permanent with protection can’t be equipped by Equipment that have the stated quality +#or fortified by Fortifications that have the stated quality. Such Equipment or Fortifications +#become unattached from that permanent as a state-based action, but remain on the battlefield. +[INIT] +FIRSTMAIN +[PLAYER1] +hand:Pledge of Loyalty, Shuko, Holy Strength, Shifting Sky +inplay:Crimson Acolyte +manapool:{W}{W}{W}{W}{U}{U}{U} +[PLAYER2] +[DO] +Holy Strength +Crimson Acolyte +#crimson acolyte becomes 2/3 +Shuko +Shuko +Crimson Acolyte +#crimson acolyte becomes 3/3 +Pledge of Loyalty +Crimson Acolyte +#crimson acolyte becomes 2/1 since you have white permanents, pledge of loyalty grants protection from white +#holy strength is put into the graveyard as state based action :) +Shifting Sky +choice 0 +choice 2 +#after casting shifting sky, choose the color red, and all nonland permanents becomes red +#since shuko becomes red and crimson has protection from red, it will be unattached +#as state based action, pledge of loyalty stays on the creature :) +next +next +Crimson Acolyte +next +eot +[ASSERT] +UNTAP +[PLAYER1] +inplay:Crimson Acolyte, Pledge of Loyalty, Shuko, Shifting Sky +graveyard:Holy Strength +[PLAYER2] +life:19 +[END] diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index a041395802..a070722a14 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -229,7 +229,8 @@ class Constants SPELLMASTERY = 111, NOLIFEGAIN = 112, NOLIFEGAINOPPONENT = 113, - NB_BASIC_ABILITIES = 114, + AURAWARD = 114, + NB_BASIC_ABILITIES = 115, RARITY_S = 'S', //Special Rarity diff --git a/projects/mtg/include/WEvent.h b/projects/mtg/include/WEvent.h index 0430190ad1..8907627961 100644 --- a/projects/mtg/include/WEvent.h +++ b/projects/mtg/include/WEvent.h @@ -273,6 +273,12 @@ struct WEventEmptyManaPool : public WEvent { WEventEmptyManaPool(ManaPool * source); }; +//event when card-equipment unattached +struct WEventCardUnattached : public WEventCardUpdate { + WEventCardUnattached(MTGCardInstance * card); + virtual Targetable * getTarget(int target); +}; + std::ostream& operator<<(std::ostream&, const WEvent&); #endif diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 327970347c..047608339a 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5428,6 +5428,8 @@ int AEquip::unequip() game->removeObserver(currentAbilities[i]); } currentAbilities.clear(); + WEvent * e = NEW WEventCardUnattached(source); + game->receiveEvent(e); return 1; } diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index b82960119b..a87f85dd7a 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -617,6 +617,24 @@ void GameObserver::gameStateBasedEffects() card->myPair->myPair = NULL; card->myPair = NULL; } + //////////////////////////////////////////////////// + //Unattach Equipments that dont have valid targets// + //////////////////////////////////////////////////// + if ((card->target) && card->hasType(Subtypes::TYPE_EQUIPMENT)) + { + if(card->target && isInPlay(card->target) && (card->target)->protectedAgainst(card))//protection from quality + { + for (size_t i = 1; i < mLayers->actionLayer()->mObjects.size(); i++) + { + MTGAbility * a = ((MTGAbility *) mLayers->actionLayer()->mObjects[i]); + AEquip * eq = dynamic_cast (a); + if (eq && eq->source == card) + { + ((AEquip*)a)->unequip(); + } + } + } + } /////////////////////////////////////////////////////// //Remove auras that don't have a valid target anymore// /////////////////////////////////////////////////////// @@ -624,6 +642,8 @@ void GameObserver::gameStateBasedEffects() { if(card->target && !isInPlay(card->target)) players[i]->game->putInGraveyard(card); + if(card->target && isInPlay(card->target) && (card->target)->protectedAgainst(card) && !card->has(Constants::AURAWARD))//protection from quality except aura cards like flickering ward + players[i]->game->putInGraveyard(card); } card->enchanted = false; if (card->target && isInPlay(card->target) && !card->hasType(Subtypes::TYPE_EQUIPMENT) && card->hasSubtype(Subtypes::TYPE_AURA)) diff --git a/projects/mtg/src/GuiPlay.cpp b/projects/mtg/src/GuiPlay.cpp index 0ab99501d5..4fdc1fde45 100644 --- a/projects/mtg/src/GuiPlay.cpp +++ b/projects/mtg/src/GuiPlay.cpp @@ -406,6 +406,8 @@ int GuiPlay::receiveEventPlus(WEvent * e) } else if (dynamic_cast (e)) Replace(); + else if (dynamic_cast (e)) + Replace(); Replace(); return 0; } diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 1b7d602d22..ba7362fbb2 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -142,7 +142,8 @@ const char* Constants::MTGBasicAbilities[] = { "evadebigger", "spellmastery", "nolifegain", - "nolifegainopponent" + "nolifegainopponent", + "auraward" }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/WEvent.cpp b/projects/mtg/src/WEvent.cpp index b125dc1ee0..df09f764ca 100644 --- a/projects/mtg/src/WEvent.cpp +++ b/projects/mtg/src/WEvent.cpp @@ -157,6 +157,11 @@ WEventEmptyManaPool::WEventEmptyManaPool(ManaPool * source) : { } +WEventCardUnattached::WEventCardUnattached(MTGCardInstance * card) : + WEventCardUpdate(card) +{ +} + WEventCombatStepChange::WEventCombatStepChange(CombatStep step) : WEvent(), step(step) { @@ -305,6 +310,12 @@ Targetable * WEventcardDraw::getTarget(Player * player) return NULL; } +Targetable * WEventCardUnattached::getTarget(int target) +{ + if (target) return card; + return NULL; +} + std::ostream& WEvent::toString(std::ostream& out) const { return out << "EVENT";