From 4b9f94c9ae1232164535750998e0b8efdf4e99cb Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Sep 2015 17:11:40 +0800 Subject: [PATCH] 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";