Added a new rule to flip back modal dual face card on each phase and after each action, fixed "Aladdin's Lamp" and "Turntimber Symbiosis" primitives, allowed the AI to play back side of modal dual face cards, improved the "doubleside" keyword to flip modal dual face cards, improved filters to target flipped cards using the "isflipped" keyword, fixed a crash when zone pointer was null in GameObserver::logAction method.

This commit is contained in:
Vittorio Alfieri
2021-04-28 17:03:29 +02:00
parent ac273b1947
commit 79716a4533
9 changed files with 93 additions and 13 deletions
+4 -2
View File
@@ -632,9 +632,11 @@ int OrderedAIAction::getEfficiency()
efficiency = 90;
}
}
else if (dynamic_cast<AATurnSide *>(a))
else if (AATurnSide * ats = dynamic_cast<AATurnSide *>(a))
{
efficiency = 0; // AI does not have to use the doubleside ability to avoid loops.
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;
}
else if (ATokenCreator * atc = dynamic_cast<ATokenCreator *>(a))
{
+21 -4
View File
@@ -4349,12 +4349,15 @@ 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){
fcard = MTGCollection()->getCardByName(_SideName);
if(!fcard) return 0;
sideCard = NEW MTGCardInstance(fcard, _target->controller()->game);
_target->nameOrig = _target->name;
_target->name = sideCard->name;
_target->setName(sideCard->name);
if(!sideCard) return 0;
if(sideCard->getManaCost()){
if(_target->getManaCost()->getAlternative()){
@@ -4367,6 +4370,7 @@ int AATurnSide::resolve()
fcard = MTGCollection()->getCardByName(_target->nameOrig);
if(!fcard) return 0;
_target->name = _target->nameOrig;
_target->setName(_target->nameOrig);
_target->nameOrig = "";
sideCard = NEW MTGCardInstance(fcard, _target->controller()->game);
if(!sideCard) return 0;
@@ -4375,13 +4379,26 @@ int AATurnSide::resolve()
_target->getManaCost()->copy(sideCard->getManaCost()); // Restore the original side cost mana symbols.
}
}
for (int i = ((int)_target->types.size())-1; i >= 0; --i) // Load all the types from the current side
_target->removeType(_target->types[i]);
for (int i = 0; i < ((int)sideCard->types.size()); i++)
_target->addType(sideCard->types[i]);
if(_target->owner->playMode != Player::MODE_TEST_SUITE)
{
_target->setMTGId(sideCard->getMTGId());
_target->setId = sideCard->setId;
}
_target->power = sideCard->power;
_target->life = sideCard->life;
_target->toughness = sideCard->toughness;
_target->origpower = sideCard->origpower;
_target->origtoughness = sideCard->origtoughness;
_target->basepower = sideCard->basepower;
_target->basetoughness = sideCard->basetoughness;
_target->types = sideCard->types;
_target->text = sideCard->text;
_target->formattedText = sideCard->formattedText;
_target->magicText = sideCard->magicText;
_target->colors = sideCard->colors;
_target->basicAbilities = sideCard->basicAbilities;
_target->isFlipped = !_target->isFlipped;
_target->mPropertiesChangedSinceLastUpdate = true;
SAFE_DELETE(sideCard);
return 1;
}
+5
View File
@@ -281,6 +281,11 @@ MTGCardInstance * CardDescriptor::match(MTGCardInstance * card)
match = NULL;
}
if (isFlipped != card->isFlipped)
{
match = NULL;
}
if ((tapped == -1 && card->isTapped()) || (tapped == 1 && !card->isTapped()))
{
match = NULL;
+12
View File
@@ -1544,6 +1544,18 @@ bool CardGui::FilterCard(MTGCard * _card,string filter)
cd.isToken = 1;
}
}
//Has been flipped
else if (attribute.find("isflipped") != string::npos)
{
if (minus)
{
cd.isFlipped = false;
}
else
{
cd.isFlipped = true;
}
}
//Has x in cost
else if (attribute.find("hasx") != string::npos)
{
+2 -1
View File
@@ -2125,8 +2125,9 @@ void GameObserver::logAction(Player* player, const string& s) {
void GameObserver::logAction(MTGCardInstance* card, MTGGameZone* zone, size_t index, int result) {
stringstream stream;
if(zone == NULL) zone = card->currentZone;
string zoneName = (zone != NULL)?zone->getName():"UnknownZone"; // Fixed a crash when zone pointer was null.
stream << "p" << ((card->controller()==players[0])?"1.":"2.")
<< zone->getName()<< "[" << index << "] "
<< zoneName << "[" << index << "] "
<< result << card->getLCName();
logAction(stream.str());
}
+12
View File
@@ -590,6 +590,18 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
cd->isToken = 1;
}
}
//Has been flipped
else if (attribute.find("isflipped") != string::npos)
{
if (minus)
{
cd->isFlipped = false;
}
else
{
cd->isFlipped = true;
}
}
//Has x in cost
else if (attribute.find("hasx") != string::npos)
{