@@ -6200,8 +6200,10 @@ class AADepleter: public ActivatedAbilityTP
|
||||
public:
|
||||
string nbcardsStr;
|
||||
bool toexile;
|
||||
bool colorrepeat;
|
||||
bool namerepeat;
|
||||
AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost = NULL,
|
||||
int who = TargetChooser::UNSET, bool toexile = false);
|
||||
int who = TargetChooser::UNSET, bool toexile = false, bool colorrepeat = false, bool namerepeat = false);
|
||||
int resolve();
|
||||
const string getMenuText();
|
||||
AADepleter * clone() const;
|
||||
|
||||
@@ -62,8 +62,9 @@ int OrderedAIAction::getEfficiency(AADamager * aad)
|
||||
// I can't remember as I type this in which condition we use one or the other for this function, if you find out please replace this comment
|
||||
int OrderedAIAction::getEfficiency()
|
||||
{
|
||||
if (efficiency > -1)
|
||||
return efficiency;
|
||||
//commented out the below becuase I noticed it prevented ai from updating the given abilities with new eff %.
|
||||
//if (efficiency > -1)
|
||||
// return efficiency;
|
||||
if (!ability)
|
||||
return 0;
|
||||
GameObserver * g = owner->getObserver();
|
||||
@@ -335,6 +336,16 @@ int OrderedAIAction::getEfficiency()
|
||||
}
|
||||
case MTGAbility::MANA_PRODUCER://only way to hit this condition is nested manaabilities, ai skips manaproducers by defualt when finding an ability to use.
|
||||
{
|
||||
AManaProducer * manamaker = dynamic_cast<AManaProducer*>(a);
|
||||
GenericActivatedAbility * GAA = dynamic_cast<GenericActivatedAbility*>(ability);
|
||||
AForeach * forMana = dynamic_cast<AForeach*>(GAA->ability);
|
||||
if (manamaker && forMana)
|
||||
{
|
||||
int outPut = forMana->checkActivation();
|
||||
if (ability->getCost() && outPut > int(ability->getCost()->getConvertedCost() +1) && currentPhase == MTG_PHASE_FIRSTMAIN && ability->source->controller()->game->hand->nb_cards > 1)
|
||||
efficiency = 90;//might be a bit random, but better than never using them.
|
||||
}
|
||||
else
|
||||
efficiency = 0;
|
||||
break;
|
||||
}
|
||||
@@ -635,6 +646,10 @@ int OrderedAIAction::getEfficiency()
|
||||
{
|
||||
efficiency += 55;
|
||||
}
|
||||
else if (dynamic_cast<MTGSuspendRule *>(a))
|
||||
{
|
||||
efficiency += 55;
|
||||
}
|
||||
SAFE_DELETE(transAbility);
|
||||
return efficiency;
|
||||
}
|
||||
|
||||
@@ -1099,8 +1099,8 @@ AADamager * AADamager::clone() const
|
||||
|
||||
|
||||
//AADepleter
|
||||
AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost, int who, bool toexile) :
|
||||
ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbcardsStr(nbcardsStr),toexile(toexile)
|
||||
AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost, int who, bool toexile, bool colorrepeat, bool namerepeat) :
|
||||
ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbcardsStr(nbcardsStr),toexile(toexile), colorrepeat(colorrepeat), namerepeat(namerepeat)
|
||||
{
|
||||
}
|
||||
int AADepleter::resolve()
|
||||
@@ -1110,16 +1110,124 @@ AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card,
|
||||
{
|
||||
WParsedInt numCards(nbcardsStr, NULL, source);
|
||||
MTGLibrary * library = player->game->library;
|
||||
for (int i = 0; i < numCards.getValue(); i++)
|
||||
if (colorrepeat && library->nb_cards)
|
||||
{
|
||||
if (library->nb_cards)
|
||||
bool repeating = false;
|
||||
do
|
||||
{
|
||||
if(toexile)
|
||||
player->game->putInZone(library->cards[library->nb_cards - 1], library, player->game->exile);
|
||||
else
|
||||
player->game->putInZone(library->cards[library->nb_cards - 1], library, player->game->graveyard);
|
||||
repeating = false;
|
||||
vector<MTGCardInstance*>found;
|
||||
for (int i = 0; i < numCards.getValue(); i++)
|
||||
{
|
||||
if (library->nb_cards)
|
||||
{
|
||||
if(library->nb_cards > i)
|
||||
found.push_back(library->cards[(library->nb_cards - 1) - i]);
|
||||
}
|
||||
}
|
||||
|
||||
for (vector<MTGCardInstance*>::iterator it = found.begin(); it != found.end(); it++)
|
||||
{
|
||||
MTGCardInstance * cardFirst = *it;
|
||||
if (cardFirst->isLand())
|
||||
continue;
|
||||
for (int i = Constants::MTG_COLOR_GREEN; i <= Constants::MTG_COLOR_WHITE; ++i)
|
||||
{
|
||||
if (cardFirst->hasColor(i))
|
||||
{
|
||||
for (vector<MTGCardInstance*>::iterator secondit = found.begin(); secondit != found.end(); secondit++)
|
||||
{
|
||||
MTGCardInstance * cardSecond = *secondit;
|
||||
if (cardSecond->isLand())
|
||||
continue;
|
||||
if (cardSecond->hasColor(i) && cardFirst != cardSecond)
|
||||
{
|
||||
repeating = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
if (found.size())
|
||||
{
|
||||
MTGCardInstance * toMove = found.back();
|
||||
if (toMove)
|
||||
{
|
||||
if (toexile)
|
||||
player->game->putInZone(toMove, library, player->game->exile);
|
||||
else
|
||||
player->game->putInZone(toMove, library, player->game->graveyard);
|
||||
found.pop_back();
|
||||
}
|
||||
}
|
||||
} while (found.size());
|
||||
|
||||
} while (repeating);
|
||||
}
|
||||
else if (namerepeat && library->nb_cards)
|
||||
{
|
||||
bool repeating = false;
|
||||
do
|
||||
{
|
||||
repeating = false;
|
||||
vector<MTGCardInstance*>found;
|
||||
for (int i = 0; i < numCards.getValue(); i++)
|
||||
{
|
||||
if (library->nb_cards)
|
||||
{
|
||||
if (library->nb_cards > i)
|
||||
found.push_back(library->cards[(library->nb_cards - 1) - i]);
|
||||
}
|
||||
}
|
||||
|
||||
for (vector<MTGCardInstance*>::iterator it = found.begin(); it != found.end(); it++)
|
||||
{
|
||||
MTGCardInstance * cardFirst = *it;
|
||||
for (vector<MTGCardInstance*>::iterator secondit = found.begin(); secondit != found.end(); secondit++)
|
||||
{
|
||||
MTGCardInstance * cardSecond = *secondit;
|
||||
if (cardSecond->name == cardFirst->name && cardFirst != cardSecond)
|
||||
{
|
||||
repeating = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
if (found.size())
|
||||
{
|
||||
MTGCardInstance * toMove = found.back();
|
||||
if (toMove)
|
||||
{
|
||||
if (toexile)
|
||||
player->game->putInZone(toMove, library, player->game->exile);
|
||||
else
|
||||
player->game->putInZone(toMove, library, player->game->graveyard);
|
||||
found.pop_back();
|
||||
}
|
||||
}
|
||||
} while (found.size());
|
||||
} while (repeating);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < numCards.getValue(); i++)
|
||||
{
|
||||
if (library->nb_cards)
|
||||
{
|
||||
if (toexile)
|
||||
player->game->putInZone(library->cards[library->nb_cards - 1], library, player->game->exile);
|
||||
else
|
||||
player->game->putInZone(library->cards[library->nb_cards - 1], library, player->game->graveyard);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -2820,8 +2820,14 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
||||
vector<string> splitDeplete = parseBetween(s, "deplete:", " ", false);
|
||||
if (splitDeplete.size())
|
||||
{
|
||||
bool namerepeat = false;
|
||||
bool colorrepeat = false;
|
||||
if (splitDeplete[0].find("color") != string::npos)
|
||||
colorrepeat = true;
|
||||
if (splitDeplete[0].find("name") != string::npos)
|
||||
namerepeat = true;
|
||||
Targetable * t = spell ? spell->getNextTarget() : NULL;
|
||||
MTGAbility * a = NEW AADepleter(observer, id, card, t , splitDeplete[1], NULL, who, false);
|
||||
MTGAbility * a = NEW AADepleter(observer, id, card, t , splitDeplete[1], NULL, who, false, colorrepeat, namerepeat);
|
||||
a->oneShot = 1;
|
||||
return a;
|
||||
}
|
||||
@@ -2830,8 +2836,14 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
||||
vector<string> splitIngest = parseBetween(s, "ingest:", " ", false);
|
||||
if (splitIngest.size())
|
||||
{
|
||||
bool namerepeat = false;
|
||||
bool colorrepeat = false;
|
||||
if (splitIngest[0].find("coloringest") != string::npos)
|
||||
colorrepeat = true;
|
||||
if (splitIngest[0].find("nameingest") != string::npos)
|
||||
namerepeat = true;
|
||||
Targetable * t = spell ? spell->getNextTarget() : NULL;
|
||||
MTGAbility * a = NEW AADepleter(observer, id, card, t , splitIngest[1], NULL, who, true);
|
||||
MTGAbility * a = NEW AADepleter(observer, id, card, t , splitIngest[1], NULL, who, true, colorrepeat, namerepeat);
|
||||
a->oneShot = 1;
|
||||
return a;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user