Added abilities for cards which have to return battlefield or hand instead of graveyard (e.g. just like exiledeath ability), improved fresh attribute management also for card moved in hand, library, commandzone and for instants and sorcery spells, added/fixed primitives.

This commit is contained in:
valfieri
2020-12-16 12:21:57 +01:00
parent b09763d89e
commit 3e7ef8c77c
8 changed files with 178 additions and 82 deletions
+12
View File
@@ -589,6 +589,18 @@ int PutInGraveyard::resolve()
card->controller()->game->putInZone(card, zone, card->owner->game->exile);
return 1;
}
if (card->basicAbilities[(int)Constants::HANDDEATH])
{
card->controller()->game->putInZone(card, zone, card->owner->game->hand);
return 1;
}
if (card->basicAbilities[(int)Constants::INPLAYDEATH] || card->basicAbilities[(int)Constants::INPLAYTAPDEATH])
{
card->controller()->game->putInZone(card, zone, card->owner->game->battlefield);
if(card->basicAbilities[(int)Constants::INPLAYTAPDEATH])
card->tap(true);
return 1;
}
if (zone == observer->players[0]->game->inPlay || zone == observer->players[1]->game->inPlay)
{
card->controller()->game->putInZone(card, zone, card->owner->game->graveyard);
+7 -1
View File
@@ -4925,6 +4925,9 @@ int AbilityFactory::abilityEfficiency(MTGAbility * a, Player * p, int mode, Targ
badAbilities[(int)Constants::NOMANA] = true;
badAbilities[(int)Constants::ONLYMANA] = true;
badAbilities[(int)Constants::EXILEDEATH] = true;
badAbilities[(int)Constants::HANDDEATH] = true;
badAbilities[(int)Constants::INPLAYDEATH] = true;
badAbilities[(int)Constants::INPLAYTAPDEATH] = true;
badAbilities[(int)Constants::WEAK] = true;
badAbilities[(int)Constants::NOLIFEGAIN] = true;
badAbilities[(int)Constants::NOLIFEGAINOPPONENT] = true;
@@ -5741,7 +5744,10 @@ void AbilityFactory::addAbilities(int _id, Spell * spell)
if (card->basicAbilities[(int)Constants::EXILEDEATH])
{
card->controller()->game->putInZone(card, card->getCurrentZone(), card->owner->game->exile);
}
else if (card->basicAbilities[(int)Constants::HANDDEATH])
{
card->controller()->game->putInZone(card, card->getCurrentZone(), card->owner->game->hand);
}
else if (card->alternateCostPaid[ManaCost::MANA_PAID_WITH_BUYBACK] > 0)
{
+12
View File
@@ -510,6 +510,18 @@ int MTGCardInstance::toGrave( bool forced )
p->game->putInZone(this, p->game->inPlay, owner->game->exile);
return 1;
}
if (basicAbilities[(int)Constants::HANDDEATH])
{
p->game->putInZone(this, p->game->inPlay, owner->game->hand);
return 1;
}
if (basicAbilities[(int)Constants::INPLAYDEATH] || basicAbilities[(int)Constants::INPLAYTAPDEATH])
{
p->game->putInZone(this, p->game->inPlay, owner->game->battlefield);
if(basicAbilities[(int)Constants::INPLAYTAPDEATH])
tap(true);
return 1;
}
if (!basicAbilities[(int)Constants::INDESTRUCTIBLE])
{
p->game->putInZone(this, p->game->inPlay, owner->game->graveyard);
+4 -1
View File
@@ -198,7 +198,10 @@ const char* Constants::MTGBasicAbilities[] = {
"partner", //Has partner ability
"canbecommander", //Can be a commander (eg. some planeswalkers can)
"iscommander", //It's the current commander
"threeblockers" //It can be blocked just by 3 creatures or more.
"threeblockers", //It can be blocked just by 3 creatures or more.
"handdeath", //It goes in hand after death.
"inplaydeath", //It goes back in play untapped after death.
"inplaytapdeath" //It goes back in play tapped after death.
};
map<string,int> Constants::MTGBasicAbilitiesMap;
+13 -3
View File
@@ -385,10 +385,20 @@ void MTGPlayerCards::showHand()
// Moves a card to its owner's graveyard
MTGCardInstance * MTGPlayerCards::putInGraveyard(MTGCardInstance * card)
{
if (card->basicAbilities[(int)Constants::EXILEDEATH])
if (card->getCurrentZone() != card->controller()->game->hand && card->basicAbilities[(int)Constants::EXILEDEATH])
{
putInZone(card, card->getCurrentZone(), card->owner->game->exile);
return putInZone(card, card->getCurrentZone(), card->owner->game->exile);
}
else if (card->getCurrentZone() != card->controller()->game->hand && card->basicAbilities[(int)Constants::HANDDEATH])
{
return putInZone(card, card->getCurrentZone(), card->owner->game->hand);
}
else if (card->getCurrentZone() != card->controller()->game->hand && (card->basicAbilities[(int)Constants::INPLAYDEATH] || card->basicAbilities[(int)Constants::INPLAYTAPDEATH]))
{
MTGCardInstance* ret = putInZone(card, card->getCurrentZone(), card->owner->game->battlefield);
if(card->basicAbilities[(int)Constants::INPLAYTAPDEATH])
ret->tap(true);
return ret;
}
return putInZone(card, card->currentZone, card->owner->game->graveyard);
}