From 4b9f94c9ae1232164535750998e0b8efdf4e99cb Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Sep 2015 17:11:40 +0800 Subject: [PATCH 1/4] added auraward, added event for unattach, added statebased check for protection from quality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit auraward -> an exception for protection from quality used for aura, like flickering ward added event for unattach added state based check for protection from quality. 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. --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 11 +++++++++++ projects/mtg/include/MTGDefinitions.h | 3 ++- projects/mtg/include/WEvent.h | 6 ++++++ projects/mtg/src/AllAbilities.cpp | 2 ++ projects/mtg/src/GameObserver.cpp | 20 ++++++++++++++++++++ projects/mtg/src/GuiPlay.cpp | 2 ++ projects/mtg/src/MTGDefinitions.cpp | 3 ++- projects/mtg/src/WEvent.cpp | 11 +++++++++++ 8 files changed, 56 insertions(+), 2 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 619247009..d8d7777d0 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 @@ -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/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index a04139580..a070722a1 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 0430190ad..890762796 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 327970347..047608339 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 b82960119..a87f85dd7 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 0ab99501d..4fdc1fde4 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 1b7d602d2..ba7362fbb 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 b125dc1ee..df09f764c 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"; From ae59e75be1c9cb688467237c9be89bac6012f194 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Sep 2015 19:46:18 +0800 Subject: [PATCH 2/4] Create pledge_protection.txt --- .../mtg/bin/Res/test/pledge_protection.txt | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 projects/mtg/bin/Res/test/pledge_protection.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 000000000..364af6a76 --- /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] From 2fbfdbcb03c546111a02a95f930ff2d756f3ee44 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Sep 2015 19:48:02 +0800 Subject: [PATCH 3/4] lowercase --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index d8e200a16..53d678a78 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -26110,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 From 800172f93ec5479be96c7cd789719c0bba9e5c9b Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Sep 2015 19:49:20 +0800 Subject: [PATCH 4/4] Update _tests.txt --- projects/mtg/bin/Res/test/_tests.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 0b94c47ff..c55f155e7 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