removed eradicate ability and replaced it with a far more flexable solution which is

added new card discriptor [share!variable!]
the variables for this so far are
name <---eradicate effect targetting
color <--radiance effect targetting
types <--the plague cycles

it is important to note that a target IS REQUIRED before this, meaning it has to be used below a target= or after the targetting of an && ability...otherwise it will simply default to the source cards variables.
this solution provides a much more generic version without sacrificing the effectiveness of the eradicate set which was limited only to eradicate style cards(which ALSO required a target)

coding exsample 
[card]
name=Eradicate
target=creature[-black]
auto=all(*[share!name!]|targetcontrollerhand) moveto(exile)
auto=all(*[share!name!]|targetcontrollerlibrary) moveto(exile)
auto=all(*[share!name!]|targetcontrollergraveyard)moveto(exile)
auto=all(*[share!name!]|targetcontrollerbattlefield) moveto(exile)
mana={2}{b}{b}
type=sorcery
[/card]

you will notice something strange above, for this change to work i had to fix the bug with "targetcontrollerBLAH" zone targetting...tho my fix was a patchwork fix, it does indeed provide the targets controller...we need to find the root cause of why initToZone is not returning the correct "target" variable to this function.
if the source does not have a target it defaults to source.
before it there was no target, which there never is a correct target returned as noted by the fact that 0 cards exist with targetcontroller zone targetting in WAGIC however theres a considerably large card pool for this.

enjoy :)
docs going to kill me for this lol.
This commit is contained in:
omegablast2002@yahoo.com
2011-01-22 12:30:42 +00:00
parent d581a72c1d
commit 946df16af5
7 changed files with 85 additions and 113 deletions

View File

@@ -3423,17 +3423,6 @@ string menu;
~AADYNAMIC();
};
/* removes a card and all with the same name as it from the game */
class AAEradicate: public ActivatedAbility
{
public:
int type;
AAEradicate(int id, MTGCardInstance * card, MTGCardInstance * _target,int type = 0, ManaCost * _cost = NULL, int doTap = 0);
int resolve();
const char * getMenuText();
AAEradicate * clone() const;
};
/* switch power and toughness of target */
class ASwapPT: public InstantAbility
{

View File

@@ -55,6 +55,10 @@ class CardDescriptor: public MTGCardInstance{
MTGCardInstance * match(MTGCardInstance * card);
MTGCardInstance * match(MTGGameZone * zone);
MTGCardInstance * nextmatch(MTGGameZone * zone, MTGCardInstance * previous);
int nameComparisonMode;
int colorComparisonMode;
string compareName;
};
#endif

View File

@@ -1246,95 +1246,6 @@ AADYNAMIC::~AADYNAMIC()
SAFE_DELETE(storedAbility);
}
// Eradicate
AAEradicate::AAEradicate(int id, MTGCardInstance * card, MTGCardInstance * _target,int type, ManaCost * _cost, int doTap) :
ActivatedAbility(id, card, _cost, 0, doTap),type(type)
{
target = _target;
}
int AAEradicate::resolve()
{
MTGCardInstance * _target = (MTGCardInstance *) target;
if (_target)
{
while (_target->next)
_target = _target->next; //This is for cards such as rampant growth
string name= _target->name;
int cardtotal = _target->controller()->game->battlefield->nb_cards
+ _target->controller()->game->hand->nb_cards
+_target->controller()->game->graveyard->nb_cards
+_target->controller()->game->library->nb_cards;
Player * victem = _target->controller();
victem->game->putInExile(_target);
MTGGameZone * g = victem->game->graveyard;
MTGGameZone * l = victem->game->library;
MTGGameZone * h = victem->game->hand;
MTGGameZone * i = victem->game->inPlay;
while(_target->controller()->inPlay()->hasName(name) || _target->controller()->game->graveyard->hasName(name)|| _target->controller()->game->library->hasName(name)|| _target->controller()->game->hand->hasName(name))
{
for (int k = 0; k < g->nb_cards; k++)
{
MTGCardInstance * card = g->cards[k];
if(card->name == name)
victem->game->putInZone(card,g,card->controller()->game->exile);
if(k > g->nb_cards)
{
k = 0;
}
}
for (int t = 0; t < l->nb_cards; t++)
{
MTGCardInstance * card = l->cards[t];
if(card->name == name)
victem->game->putInZone(card,l,card->controller()->game->exile);
if(t > l->nb_cards)
{
t = 0;
}
}
for (int w = 0; w < h->nb_cards; w++)
{
MTGCardInstance * card = h->cards[w];
if(card->name == name)
victem->game->putInZone(card,h,card->controller()->game->exile);
if(w > h->nb_cards)
{
w = 0;
}
}
for (int o = 0; o < i->nb_cards; o++)
{
MTGCardInstance * card = i->cards[o];
if(card->name == name)
victem->game->putInZone(card,i,card->controller()->game->exile);
if(o > i->nb_cards)
{
o = 0;
}
}
}
}
return 1;
}
const char * AAEradicate::getMenuText()
{
return "eradicate";
}
AAEradicate * AAEradicate::clone() const
{
AAEradicate * a = NEW AAEradicate(*this);
a->isClone = 1;
return a;
}
//AALifer
AALifer::AALifer(int _id, MTGCardInstance * card, Targetable * _target, string life_s, WParsedInt * life, ManaCost * _cost, int _tap, int who) :
ActivatedAbilityTP(_id, card, _target, _cost, _tap, who),life_s(life_s), life(life)

View File

@@ -17,6 +17,9 @@ CardDescriptor::CardDescriptor() : MTGCardInstance()
manacostComparisonMode = COMPARISON_NONE;
counterComparisonMode = COMPARISON_NONE;
convertedManacost = -1;
compareName ="";
nameComparisonMode = COMPARISON_NONE;
colorComparisonMode = COMPARISON_NONE;
}
int CardDescriptor::init()
@@ -154,7 +157,8 @@ MTGCardInstance * CardDescriptor::match_or(MTGCardInstance * card)
return NULL;
if (manacostComparisonMode && !valueInRange(manacostComparisonMode, card->getManaCost()->getConvertedCost(), convertedManacost))
return NULL;
if (nameComparisonMode && compareName != card->name)
return NULL;
return card;
}
@@ -192,7 +196,23 @@ MTGCardInstance * CardDescriptor::match_and(MTGCardInstance * card)
match = NULL;
if (manacostComparisonMode && !valueInRange(manacostComparisonMode, card->getManaCost()->getConvertedCost(), convertedManacost))
match = NULL;
if(nameComparisonMode && compareName != card->name)
match = NULL;
if(colorComparisonMode)
{
bool hasMatch = false;
for (int i=0;i< Constants::MTG_NB_COLORS;i++)
{
if (card->hasColor(i) && colors[i] > 0)
{
hasMatch = true;
}
}
if( !hasMatch )
{
match = NULL;
}
}
return match;
}

View File

@@ -2579,15 +2579,6 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
return a;
}
//eradicate
found = s.find("eradicate");
if (found != string::npos)
{
MTGAbility * a = NEW AAEradicate(id, card, target,1);
a->oneShot = 1;
return a;
}
//identify what a leveler creature will max out at.
found = s.find("maxlevel:");
if (found != string::npos)

View File

@@ -785,8 +785,19 @@ MTGGameZone * MTGGameZone::intToZone(int zoneId, MTGCardInstance * source, MTGCa
p = source->controller();
if (!target)
{
p2 = p;
target = source;//hack ?
if(source->target)
{
//bug case, this is a patchwork fix for now
//we need to find the root cause of why the 2nd variable is not returning the target.
p2 = source->target->controller();
target = source->target;
}
else
{
//bug or bug case default to
p2 = source->controller();
target = source;
}
}
else
p2 = target->controller();

View File

@@ -446,6 +446,52 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
cd->manacostComparisonMode = comparisonMode;
//Counter Restrictions
}
else if (attribute.find("share!") != string::npos)
{
size_t start = attribute.find("share!");
size_t end = attribute.find("!");
string CDtype = attribute.substr(start + 6,end - start);
if( CDtype.find("name") != string::npos )
{
if(card->target)
cd->compareName = card->target->name;
else
cd->compareName = card->name;
cd->nameComparisonMode = COMPARISON_EQUAL;
}
else if( CDtype.find("color") != string::npos )
{
for(int i = 0; i < Constants::MTG_NB_COLORS; i++)
{
if(card->target)
cd->colors[i] = card->target->colors[i];
else
cd->colors[i] = card->colors[i];
}
cd->mode = CD_OR;
}
else if( CDtype.find("types") != string::npos )
{
if(card->target)
{
cd->types = card->target->types;
//remove main types because we only care about subtypes here.
cd->removeType("artifact");
cd->removeType("land");
cd->removeType("enchantment");
cd->removeType("instant");
cd->removeType("sorcery");
cd->removeType("legendary");
cd->removeType("creature");
}
else
{
cd->types = card->types;
}
cd->mode = CD_OR;
}
}
else if (attribute.find("counter") != string::npos)
{
if (attribute.find("{any}") != string::npos)