Fixed primitives, changed type of "isFlipped" card variable from bool to int and fixed a related bug on targeting cards with "isFlipped" attribute, improved "disturb" ability (now fi you counter a card casted with disturb it correctly goes to exile), added "decayed" ability, added two new zone alias "mycommandplay" and "opponentcommandplay" for targeting Battlefield and CommandZone at the same time.

This commit is contained in:
Vittorio Alfieri
2021-09-06 17:31:36 +02:00
parent ccae9673e6
commit 9dabf121d3
15 changed files with 47 additions and 34 deletions

View File

@@ -635,7 +635,7 @@ int OrderedAIAction::getEfficiency()
{
efficiency = 0; // AI does not have to use the doubleside ability to avoid loops but it can randomly choose to flip card and cast its back side.
if(std::rand() % 2)
ats->source->isFlipped = !ats->source->isFlipped;
ats->source->isFlipped = (ats->source->isFlipped > 0)?0:1;
}
else if (ATokenCreator * atc = dynamic_cast<ATokenCreator *>(a))
{

View File

@@ -585,7 +585,7 @@ Interruptible(observer, id)
int PutInGraveyard::resolve()
{
MTGGameZone * zone = card->getCurrentZone();
if (card->basicAbilities[(int)Constants::EXILEDEATH] || card->basicAbilities[(int)Constants::GAINEDEXILEDEATH])
if (card->basicAbilities[(int)Constants::EXILEDEATH] || card->basicAbilities[(int)Constants::GAINEDEXILEDEATH] || (card->basicAbilities[(int)Constants::HASDISTURB] && card->alternateCostPaid[ManaCost::MANA_PAID_WITH_RETRACE] == 1))
{
card->basicAbilities[(int)Constants::GAINEDEXILEDEATH] = 0;
card->controller()->game->putInZone(card, zone, card->owner->game->exile);

View File

@@ -2461,7 +2461,7 @@ AACounter::AACounter(GameObserver* observer, int id, MTGCardInstance * source, M
if (target)
{
MTGCardInstance * _target = (MTGCardInstance *) target;
if(_target->isFlipped && _target->hasType(Subtypes::TYPE_PLANESWALKER))//is flipping pw
if(_target->isFlipped > 0 && _target->hasType(Subtypes::TYPE_PLANESWALKER))//is flipping pw
return 0;
AbilityFactory af(game);
@@ -4606,9 +4606,9 @@ int AATurnSide::resolve()
if(_target->mutation && _target->parentCards.size() > 0) return 0; // Mutated down cards cannot be turned, they will follow the fate of top-card
MTGCard * fcard;
MTGCardInstance* sideCard;
if(_target->controller()->isAI() && _target->isFlipped) _target->isFlipped = false; // If it's AI calling back we just have to reset isFLipped flag and then return.
if(!_target->isFlipped && _SideName == "") return 0; // No need to turn front if card has not been flipped before.
if(!_target->isFlipped){
if(_target->controller()->isAI() && _target->isFlipped > 0) _target->isFlipped = 0; // If it's AI calling back we just have to reset isFLipped flag and then return.
if(_target->isFlipped == 0 && _SideName == "") return 0; // No need to turn front if card has not been flipped before.
if(_target->isFlipped == 0){
if(_SideName == "backside" && _target->backSide != "")
_SideName = _target->backSide; // Added to allow to turn a card on its backside.
fcard = MTGCollection()->getCardByName(_SideName);
@@ -4673,7 +4673,7 @@ int AATurnSide::resolve()
_target->formattedText = sideCard->formattedText;
_target->magicText = sideCard->magicText;
_target->colors = sideCard->colors;
_target->isFlipped = !_target->isFlipped;
_target->isFlipped = (_target->isFlipped > 0)?0:1;
_target->mPropertiesChangedSinceLastUpdate = true;
SAFE_DELETE(sideCard);
return 1;
@@ -4704,7 +4704,7 @@ int AAFlip::resolve()
int activatedanyability = 0;
MTGCardInstance * Flipper = (MTGCardInstance*)source;
this->oneShot = true;
if(Flipper->isFlipped && forcetype == "")
if(Flipper->isFlipped > 0 && forcetype == "")
{
game->removeObserver(this);
return 0;
@@ -4735,7 +4735,7 @@ int AAFlip::resolve()
}
AbilityFactory af(game);
_target->isFlipped = true;
_target->isFlipped = 1;
GameObserver * game = _target->getObserver();
if(flipStats.size())
{
@@ -4929,13 +4929,13 @@ int AAFlip::testDestroy()
MTGCardInstance * _target = (MTGCardInstance *) target;
if(target)
{
if(_target->isFlipped)
if(_target->isFlipped > 0)
{
this->forceDestroy = 1;
//_target->getObserver()->removeObserver(this);
//originally added as a safegaurd to insure the ability was removed
//it's been so long and so much has changed that it appears to do nothing but cause a crash now
_target->isFlipped = false;
_target->isFlipped = 0;
return 1;
}
}

View File

@@ -293,7 +293,7 @@ MTGCardInstance * CardDescriptor::match(MTGCardInstance * card)
match = NULL;
}
if (isFlipped != card->isFlipped)
if ((isFlipped == -1 && card->isFlipped > 0) || (isFlipped == 1 && card->isFlipped == 0))
{
match = NULL;
}

View File

@@ -1561,11 +1561,11 @@ bool CardGui::FilterCard(MTGCard * _card,string filter)
{
if (minus)
{
cd.isFlipped = false;
cd.isFlipped = -1;
}
else
{
cd.isFlipped = true;
cd.isFlipped = 1;
}
}
//Has x in cost

View File

@@ -6223,7 +6223,7 @@ void AbilityFactory::addAbilities(int _id, Spell * spell)
{
MTGPlayerCards * zones = card->controller()->game;
MTGPlayerCards * Endzones = card->owner->game;//put them in thier owners respective zones as per rules.
if (card->basicAbilities[(int)Constants::EXILEDEATH] || card->basicAbilities[(int)Constants::GAINEDEXILEDEATH])
if (card->basicAbilities[(int)Constants::EXILEDEATH] || card->basicAbilities[(int)Constants::GAINEDEXILEDEATH] || (card->basicAbilities[(int)Constants::HASDISTURB] && card->alternateCostPaid[ManaCost::MANA_PAID_WITH_RETRACE] == 1))
{
card->basicAbilities[(int)Constants::GAINEDEXILEDEATH] = 0;
card->controller()->game->putInZone(card, card->getCurrentZone(), card->owner->game->exile);
@@ -6557,7 +6557,7 @@ int ActivatedAbility::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
for(unsigned int k = 0; k < card->getObserver()->mLayers->actionLayer()->mObjects.size(); ++k)
{
ActivatedAbility * check = dynamic_cast<ActivatedAbility*>(card->getObserver()->mLayers->actionLayer()->mObjects[k]);
turnSide = card->isFlipped && !card->isInPlay(card->getObserver());
turnSide = card->isFlipped > 0 && !card->isInPlay(card->getObserver());
if(!turnSide && check && check->source == card && check->counters)
return 0;
}

View File

@@ -230,7 +230,7 @@ void MTGCardInstance::initMTGCI()
turningOver = false;
isMorphed = false;
MeldedFrom = "";
isFlipped = false;
isFlipped = 0;
isPhased = false;
isCascaded = false;
phasedTurn = -1;
@@ -512,7 +512,7 @@ int MTGCardInstance::totem(bool noregen)
int MTGCardInstance::toGrave( bool forced )
{
Player * p = controller();
if (basicAbilities[(int)Constants::EXILEDEATH] || basicAbilities[(int)Constants::GAINEDEXILEDEATH])
if (basicAbilities[(int)Constants::EXILEDEATH] || basicAbilities[(int)Constants::GAINEDEXILEDEATH] || (basicAbilities[(int)Constants::HASDISTURB] && alternateCostPaid[ManaCost::MANA_PAID_WITH_RETRACE] == 1))
{
p->game->putInZone(this, p->game->inPlay, owner->game->exile);
basicAbilities[(int)Constants::GAINEDEXILEDEATH] = 0;

View File

@@ -232,7 +232,8 @@ const char* Constants::MTGBasicAbilities[] = {
"isprey", //Creature has been haunted by some other card.
"hasdisturb", //Retrace cost is a disturb cost (e.g. "Beloved Beggar")
"daybound", //Card has daybound (e.g. "Brutal Cathar")
"nightbound" //Card has nightbound (e.g. "Moonrage Brute")
"nightbound", //Card has nightbound (e.g. "Moonrage Brute")
"decayed" //Card has decayd.
};
map<string,int> Constants::MTGBasicAbilitiesMap;

View File

@@ -407,7 +407,7 @@ void MTGPlayerCards::showHand()
// Moves a card to its owner's graveyard
MTGCardInstance * MTGPlayerCards::putInGraveyard(MTGCardInstance * card)
{
if (card->getCurrentZone() != card->controller()->game->hand && (card->basicAbilities[(int)Constants::EXILEDEATH] || card->basicAbilities[(int)Constants::GAINEDEXILEDEATH]))
if (card->getCurrentZone() != card->controller()->game->hand && (card->basicAbilities[(int)Constants::EXILEDEATH] || card->basicAbilities[(int)Constants::GAINEDEXILEDEATH] || (card->basicAbilities[(int)Constants::HASDISTURB] && card->alternateCostPaid[ManaCost::MANA_PAID_WITH_RETRACE] == 1)))
{
MTGCardInstance* ret = putInZone(card, card->getCurrentZone(), card->owner->game->exile);
ret->basicAbilities[(int)Constants::GAINEDEXILEDEATH] = 0;

View File

@@ -269,6 +269,11 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
zones[nbzones++] = MTGGameZone::MY_HAND;
zones[nbzones++] = MTGGameZone::MY_COMMANDZONE;
}
else if (zoneName.compare("mycommandplay") == 0)
{
zones[nbzones++] = MTGGameZone::MY_BATTLEFIELD;
zones[nbzones++] = MTGGameZone::MY_COMMANDZONE;
}
else if (zoneName.compare("opponentcastingzone") == 0)
{
zones[nbzones++] = MTGGameZone::OPPONENT_GRAVEYARD;
@@ -282,6 +287,11 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
zones[nbzones++] = MTGGameZone::OPPONENT_HAND;
zones[nbzones++] = MTGGameZone::OPPONENT_COMMANDZONE;
}
else if (zoneName.compare("opponentcommandplay") == 0)
{
zones[nbzones++] = MTGGameZone::OPPONENT_BATTLEFIELD;
zones[nbzones++] = MTGGameZone::OPPONENT_COMMANDZONE;
}
else if (zoneName.compare("mynonplaynonexile") == 0)
{
zones[nbzones++] = MTGGameZone::MY_GRAVEYARD;
@@ -612,11 +622,11 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
{
if (minus)
{
cd->isFlipped = false;
cd->isFlipped = -1;
}
else
{
cd->isFlipped = true;
cd->isFlipped = 1;
}
}
//Has x in cost