added auraward, added event for unattach, added statebased check for protection from quality

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.
This commit is contained in:
Anthony Calosa
2015-09-22 17:11:40 +08:00
parent 11bd885fb4
commit 4b9f94c9ae
8 changed files with 56 additions and 2 deletions

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -5428,6 +5428,8 @@ int AEquip::unequip()
game->removeObserver(currentAbilities[i]);
}
currentAbilities.clear();
WEvent * e = NEW WEventCardUnattached(source);
game->receiveEvent(e);
return 1;
}

View File

@@ -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<AEquip*> (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))

View File

@@ -406,6 +406,8 @@ int GuiPlay::receiveEventPlus(WEvent * e)
}
else if (dynamic_cast<WEventCardChangeType*> (e))
Replace();
else if (dynamic_cast<WEventCardUnattached*> (e))
Replace();
Replace();
return 0;
}

View File

@@ -142,7 +142,8 @@ const char* Constants::MTGBasicAbilities[] = {
"evadebigger",
"spellmastery",
"nolifegain",
"nolifegainopponent"
"nolifegainopponent",
"auraward"
};
map<string,int> Constants::MTGBasicAbilitiesMap;

View File

@@ -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";