it was reported to me that cards such as Isleback Spawn were not actually working correctly, to fix these i added a compareZone function to aslongas and a tag to use when you want to compare different like zones, example:

lets say in the case of Isleback Spawn you want to see if ANY player has less then 20 cards.

auto=aslongas(*|library) 4/8 <21 compare

this will check if either you or your opponent has less then 20 cards. rather then adding the total cards in both libraries.

over the last weeks ive seen this cards code change atleast 3 times. this should be the final version for it and any other cards like it.
This commit is contained in:
omegablast2002@yahoo.com
2011-03-28 16:39:30 +00:00
parent 33c12745b0
commit 565ee57372
2 changed files with 38 additions and 7 deletions

View File

@@ -2347,11 +2347,14 @@ public:
MTGAbility * a;
int includeSelf;
int mini, maxi;
bool miniFound, maxiFound;
bool miniFound, maxiFound, compareZone;
int amount[2];
AAsLongAs(int _id, MTGCardInstance * _source, Damageable * _target, TargetChooser * _tc, int _includeSelf,
MTGAbility * ability, int mini = 0, int maxi = 0,bool miniFound = false,bool maxiFound = false) :
ListMaintainerAbility(_id, _source, _target), NestedAbility(ability), mini(mini), maxi(maxi),miniFound(miniFound),maxiFound(maxiFound)
MTGAbility * ability, int mini = 0, int maxi = 0,bool miniFound = false,bool maxiFound = false,bool compareZone = false) :
ListMaintainerAbility(_id, _source, _target), NestedAbility(ability), mini(mini), maxi(maxi),miniFound(miniFound),maxiFound(maxiFound),compareZone(compareZone)
{
for (int j = 0; j < 2; j++)
amount[j] = 0;
tc = _tc;
includeSelf = _includeSelf;
tc->targetter = NULL;
@@ -2368,17 +2371,38 @@ public:
}
void findMatchingAmount()
{
int Value = 0;
GameObserver * game = game->GetInstance();
for (int i = 0; i < 2; i++)
{
Player * p = game->players[i];
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library };
for (int k = 0; k < 4; k++)
{
MTGGameZone * zone = zones[k];
Value = zone->countByCanTarget(tc);
}
amount[i] = Value;
}
}
int SorterFunction()
{
updateTargets();
int size = 0;
size = (int) cards.size();
if(compareZone)
findMatchingAmount();
//compare like tc zones to find a matching amount.
//if any player has less/more of Tc targetable cards, ability is valid.
/////////////////DO NOT REFACTOR THIS SECTION/////////////////////////////////////////
//these were seperated becuase previous methods were far too confusing to understand//
//////////////////////////////////////////////////////////////////////////////////////
if (miniFound)
{
if (size > mini)
if (size > mini || (compareZone && (amount[0] > mini || amount[1] > mini)))
{
addAbilityToGame();
}
@@ -2389,7 +2413,7 @@ public:
}
if (maxiFound)
{
if (size < maxi)
if (size < maxi || (compareZone && (amount[0] < maxi || amount[1] < maxi)))
{
addAbilityToGame();
}

View File

@@ -1304,6 +1304,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
int maxi = 0;
bool miniFound = false;
bool maxiFound = false;
bool compareZone = false;
found = s.find(" >");
if (found != string::npos)
@@ -1318,7 +1319,13 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
maxi = atoi(s.substr(found + 2, 3).c_str());
maxiFound = true;
}
found = s.find("compare");
if (found != string::npos)
{
compareZone = true;
}
switch (i)
{
case 0:
@@ -1333,7 +1340,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
{
miniFound = true;
}
result = NEW AAsLongAs(id, card, _target, lordTargets, lordIncludeSelf, a, mini, maxi,miniFound,maxiFound);
result = NEW AAsLongAs(id, card, _target, lordTargets, lordIncludeSelf, a, mini, maxi,miniFound,maxiFound,compareZone);
}
break;
case 3: