Added X to the filters for this() and thisforeach(), for use with {X} costed activated abilities, although it should theoretically work with spells as well if necessary.
This commit is contained in:
Binary file not shown.
@@ -400,6 +400,9 @@ class GenericActivatedAbility:public ActivatedAbility, public NestedAbility{
|
||||
|
||||
int resolve(){
|
||||
counters++;
|
||||
SAFE_DELETE(ability->cost);
|
||||
ability->cost = abilityCost->Diff(cost);
|
||||
SAFE_DELETE(abilityCost);
|
||||
ability->target = target; //may have been updated...
|
||||
if (ability) return ability->resolve();
|
||||
return 0;
|
||||
@@ -1896,7 +1899,14 @@ public:
|
||||
|
||||
int resolve(){
|
||||
//TODO check if ability is oneShot ?
|
||||
if (td->match(source) > 0){
|
||||
int match;
|
||||
if (!td->compareAbility){
|
||||
match = td->match(source);
|
||||
}else{
|
||||
match = td->match(this);
|
||||
}
|
||||
|
||||
if (match){
|
||||
addAbilityToGame();
|
||||
}else{
|
||||
removeAbilityFromGame();
|
||||
@@ -1961,7 +1971,12 @@ class AThisForEach:public MTGAbility, public NestedAbility{
|
||||
|
||||
int resolve(){
|
||||
//TODO check if ability is oneShot ?
|
||||
int matches = td->match(source);
|
||||
int matches;
|
||||
if (!td->compareAbility){
|
||||
matches = td->match(source);
|
||||
}else{
|
||||
matches = td->match(this);
|
||||
}
|
||||
if (matches > 0) {
|
||||
if (abilities.size()){
|
||||
removeAbilityFromGame();
|
||||
|
||||
@@ -12,12 +12,12 @@ using namespace std;
|
||||
|
||||
class CardPrimitive {
|
||||
protected:
|
||||
ManaCost manaCost;
|
||||
vector<string> ftdText;
|
||||
int init();
|
||||
string lcname;
|
||||
|
||||
public:
|
||||
ManaCost manaCost;
|
||||
string text;
|
||||
string name;
|
||||
|
||||
|
||||
@@ -158,9 +158,11 @@ class ActivatedAbility:public MTGAbility{
|
||||
CLEANUP = 56,
|
||||
AFTER_EOT = 57,
|
||||
};
|
||||
ManaCost * abilityCost;
|
||||
int restrictions;
|
||||
int needsTapping;
|
||||
ActivatedAbility(int id, MTGCardInstance * card,ManaCost * _cost = NULL, int _restrictions = NO_RESTRICTION,int tap = 1);
|
||||
virtual ~ActivatedAbility();
|
||||
virtual int reactToClick(MTGCardInstance * card);
|
||||
virtual int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL);
|
||||
virtual int reactToTargetClick(Targetable * object);
|
||||
|
||||
@@ -12,9 +12,11 @@
|
||||
|
||||
class ThisDescriptor{
|
||||
public:
|
||||
int compareAbility;
|
||||
int comparisonMode;
|
||||
int comparisonCriterion;
|
||||
virtual int match(MTGCardInstance * card) = 0;
|
||||
virtual int match(MTGAbility * ability) = 0;
|
||||
int matchValue(int value);
|
||||
};
|
||||
|
||||
@@ -27,6 +29,7 @@ class ThisCounter:public ThisDescriptor{
|
||||
public:
|
||||
Counter * counter;
|
||||
virtual int match(MTGCardInstance * card);
|
||||
virtual int match(MTGAbility * ability) {return 0;};
|
||||
ThisCounter(Counter * _counter);
|
||||
ThisCounter(int power, int toughness, int nb, const char * name);
|
||||
~ThisCounter();
|
||||
@@ -35,19 +38,29 @@ class ThisCounter:public ThisDescriptor{
|
||||
class ThisCounterAny:public ThisDescriptor{
|
||||
public:
|
||||
virtual int match(MTGCardInstance *card);
|
||||
virtual int match(MTGAbility * ability) {return 0;};
|
||||
ThisCounterAny(int nb);
|
||||
};
|
||||
|
||||
class ThisPower:public ThisDescriptor{
|
||||
public:
|
||||
virtual int match(MTGCardInstance * card);
|
||||
virtual int match(MTGAbility * ability) {return 0;};
|
||||
ThisPower(int power);
|
||||
};
|
||||
|
||||
class ThisToughness:public ThisDescriptor{
|
||||
public:
|
||||
virtual int match(MTGCardInstance * card);
|
||||
virtual int match(MTGAbility * ability) {return 0;};
|
||||
ThisToughness(int toughness);
|
||||
};
|
||||
|
||||
class ThisX:public ThisDescriptor{
|
||||
public:
|
||||
virtual int match(MTGAbility * ability);
|
||||
virtual int match(MTGCardInstance * card) {return 0;};
|
||||
ThisX(int x);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1813,6 +1813,7 @@ NestedAbility::NestedAbility(MTGAbility * _ability){
|
||||
|
||||
ActivatedAbility::ActivatedAbility(int id, MTGCardInstance * card, ManaCost * _cost, int restrictions,int tap):MTGAbility(id,card), restrictions(restrictions), needsTapping(tap){
|
||||
cost = _cost;
|
||||
abilityCost = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1856,13 +1857,17 @@ int ActivatedAbility::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
||||
int ActivatedAbility::reactToClick(MTGCardInstance * card){
|
||||
// if (cost) cost->setExtraCostsAction(this, card);
|
||||
if (!isReactingToClick(card)) return 0;
|
||||
Player * player = game->currentlyActing();
|
||||
if (cost){
|
||||
if (!cost->isExtraPaymentSet()){
|
||||
game->waitForExtraPayment = cost->extraCosts;
|
||||
return 0;
|
||||
}
|
||||
ManaCost * previousManaPool = NEW ManaCost(player->getManaPool());
|
||||
game->currentlyActing()->getManaPool()->pay(cost);
|
||||
cost->doPayExtra();
|
||||
abilityCost = previousManaPool->Diff(player->getManaPool());
|
||||
delete previousManaPool;
|
||||
}
|
||||
if (needsTapping && source->isInPlay()) source->tap();
|
||||
fireAbility();
|
||||
@@ -1873,14 +1878,18 @@ int ActivatedAbility::reactToClick(MTGCardInstance * card){
|
||||
|
||||
int ActivatedAbility::reactToTargetClick(Targetable * object){
|
||||
if (!isReactingToTargetClick(object)) return 0;
|
||||
Player * player = game->currentlyActing();
|
||||
if (cost){
|
||||
if (object->typeAsTarget() == TARGET_CARD) cost->setExtraCostsAction(this, (MTGCardInstance *) object);
|
||||
if (!cost->isExtraPaymentSet()){
|
||||
game->waitForExtraPayment = cost->extraCosts;
|
||||
return 0;
|
||||
}
|
||||
ManaCost * previousManaPool = NEW ManaCost(player->getManaPool());
|
||||
game->currentlyActing()->getManaPool()->pay(cost);
|
||||
cost->doPayExtra();
|
||||
abilityCost = previousManaPool->Diff(player->getManaPool());
|
||||
delete previousManaPool;
|
||||
}
|
||||
if (needsTapping && source->isInPlay()) source->tap();
|
||||
fireAbility();
|
||||
@@ -1888,6 +1897,12 @@ int ActivatedAbility::reactToTargetClick(Targetable * object){
|
||||
|
||||
}
|
||||
|
||||
ActivatedAbility::~ActivatedAbility(){
|
||||
if (!isClone){
|
||||
SAFE_DELETE(abilityCost);
|
||||
}
|
||||
}
|
||||
|
||||
ostream& ActivatedAbility::toString(ostream& out) const
|
||||
{
|
||||
out << "ActivatedAbility ::: restrictions : " << restrictions
|
||||
|
||||
@@ -144,15 +144,28 @@ ThisDescriptor * ThisDescriptorFactory::createThisDescriptor(string s){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// X
|
||||
found = s.find("x");
|
||||
if (found != string::npos) {
|
||||
ThisX * td = NEW ThisX(criterion);
|
||||
if (td){
|
||||
td->comparisonMode = mode;
|
||||
return td;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ThisCounter::ThisCounter(Counter * _counter){
|
||||
compareAbility = 0;
|
||||
counter = _counter;
|
||||
comparisonCriterion = counter->nb;
|
||||
}
|
||||
|
||||
ThisCounter::ThisCounter(int power, int toughness, int nb, const char * name){
|
||||
compareAbility = 0;
|
||||
counter = NEW Counter(NULL,name,power,toughness);
|
||||
comparisonCriterion = nb;
|
||||
}
|
||||
@@ -184,6 +197,7 @@ ThisCounter::~ThisCounter() {
|
||||
}
|
||||
|
||||
ThisPower::ThisPower(int power){
|
||||
compareAbility = 0;
|
||||
comparisonCriterion = power;
|
||||
}
|
||||
|
||||
@@ -192,6 +206,7 @@ int ThisPower::match(MTGCardInstance * card){
|
||||
}
|
||||
|
||||
ThisToughness::ThisToughness(int toughness){
|
||||
compareAbility = 0;
|
||||
comparisonCriterion = toughness;
|
||||
}
|
||||
|
||||
@@ -200,6 +215,7 @@ int ThisToughness::match(MTGCardInstance * card){
|
||||
}
|
||||
|
||||
ThisCounterAny::ThisCounterAny(int nb){
|
||||
compareAbility = 0;
|
||||
comparisonCriterion = nb;
|
||||
}
|
||||
|
||||
@@ -209,4 +225,13 @@ int ThisCounterAny::match(MTGCardInstance * card){
|
||||
result += card->counters->counters[i]->nb;
|
||||
}
|
||||
return matchValue(result);
|
||||
}
|
||||
|
||||
ThisX::ThisX(int x){
|
||||
comparisonCriterion = x;
|
||||
compareAbility = 1;
|
||||
}
|
||||
|
||||
int ThisX::match(MTGAbility * ability){
|
||||
return matchValue(ability->cost->hasX());
|
||||
}
|
||||
Reference in New Issue
Block a user