Psyringe - added quantifiable target restrictions. Whenever you use square brackets [] to specify attributes of a target, you can use the operators <=, >= and = to specify quantities for power, toughness, and/or converted manacost. See added cards for examples.
Limitations: - Operators for "greater than", "less than", "unequal" have not been implemented, but if a card actually needs them, you can use a preceding minus sign to negate a comparison. Example: -power=3 means "power not equal to 3", -toughness<=3 means "toughness>3". - You can't use spaces when specifying such restrictions. Write "power<=3" instead of "power <= 3" - You now need to use a space before the "<" and ">" commands that count the matches for lord(), foreach(), all() and aslongas(). So far we always did use spaces in front of them without actually needing to, now we need to. - manacost restrictions don't take "X" costs into account. Example: Mistmeadow Skulkin (FUT) has protection from manacost>=3. Blaze has a converted manacost of 1, but when you cast it with an X of 2, then it actually has a converted manacost of 3 while on the stack, and Mistmeadow Skulkin would be protected from it, but currently it isn't. Please review the code, I'll add a few remarks/questions of my own.
This commit is contained in:
@@ -483,7 +483,7 @@ mana={2}{U}
|
|||||||
[card]
|
[card]
|
||||||
text={T}: Target creature with power 2 or less is unblockable this turn.
|
text={T}: Target creature with power 2 or less is unblockable this turn.
|
||||||
id=134758
|
id=134758
|
||||||
alias=1285
|
auto={T}:unblockable target(creature[power<=2])
|
||||||
name=Crafty Pathmage
|
name=Crafty Pathmage
|
||||||
rarity=C
|
rarity=C
|
||||||
type=Creature
|
type=Creature
|
||||||
|
|||||||
@@ -346,7 +346,7 @@ toughness=4
|
|||||||
[card]
|
[card]
|
||||||
text={2}, {T}:Target creature with power 2 or less is unblockable this turn.
|
text={2}, {T}:Target creature with power 2 or less is unblockable this turn.
|
||||||
id=1025
|
id=1025
|
||||||
alias=1285
|
auto={T}:unblockable target(creature[power<=2])
|
||||||
name=Tawnos's Wand
|
name=Tawnos's Wand
|
||||||
rarity=U
|
rarity=U
|
||||||
mana={4}
|
mana={4}
|
||||||
|
|||||||
@@ -267,6 +267,19 @@ auto=foreach(creature|myBattlefield) draw:1
|
|||||||
auto=foreach(creature|myBattlefield) life:-1
|
auto=foreach(creature|myBattlefield) life:-1
|
||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
|
id=130346
|
||||||
|
name=Mistmeadow Skulk
|
||||||
|
mana={1}{W}
|
||||||
|
type=Creature
|
||||||
|
subtype=Kithkin Rogue
|
||||||
|
power=1
|
||||||
|
toughness=1
|
||||||
|
text=Lifelink, protection from converted mana cost 3 or greater
|
||||||
|
auto=protection from(*[manacost>=3])
|
||||||
|
abilities=lifelink
|
||||||
|
rarity=U
|
||||||
|
[/card]
|
||||||
|
[card]
|
||||||
id=136138
|
id=136138
|
||||||
name=Nessian Courser
|
name=Nessian Courser
|
||||||
rarity=C
|
rarity=C
|
||||||
|
|||||||
@@ -741,17 +741,6 @@ text=All Slivers have "When this permanent comes into play, you may fateseal 1."
|
|||||||
rarity=C
|
rarity=C
|
||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
id=130346
|
|
||||||
name=Mistmeadow Skulk
|
|
||||||
mana={1}{W}
|
|
||||||
type=Creature
|
|
||||||
subtype=Kithkin Rogue
|
|
||||||
power=1
|
|
||||||
toughness=1
|
|
||||||
text=Lifelink, protection from converted mana cost 3 or greater
|
|
||||||
rarity=U
|
|
||||||
[/card]
|
|
||||||
[card]
|
|
||||||
id=136154
|
id=136154
|
||||||
name=Molten Disaster
|
name=Molten Disaster
|
||||||
mana={X}{R}{R}
|
mana={X}{R}{R}
|
||||||
|
|||||||
@@ -206,6 +206,30 @@ auto={2}{T}:add{U}
|
|||||||
rarity=U
|
rarity=U
|
||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
|
id=3013
|
||||||
|
name=Aysen Bureaucrats
|
||||||
|
mana={1}{W}
|
||||||
|
type=Creature
|
||||||
|
subtype=Human Advisor
|
||||||
|
power=1
|
||||||
|
toughness=1
|
||||||
|
text={T}: Tap target creature with power 2 or less.
|
||||||
|
auto={T}:tap target(creature[power<=2])
|
||||||
|
rarity=C
|
||||||
|
[/card]
|
||||||
|
[card]
|
||||||
|
id=3014
|
||||||
|
name=Aysen Bureaucrats
|
||||||
|
mana={1}{W}
|
||||||
|
type=Creature
|
||||||
|
subtype=Human Advisor
|
||||||
|
power=1
|
||||||
|
toughness=1
|
||||||
|
text={T}: Tap target creature with power 2 or less.
|
||||||
|
auto={T}:tap target(creature[power<=2])
|
||||||
|
rarity=C
|
||||||
|
[/card]
|
||||||
|
[card]
|
||||||
id=3015
|
id=3015
|
||||||
name=Aysen Crusader
|
name=Aysen Crusader
|
||||||
mana={2}{W}{W}
|
mana={2}{W}{W}
|
||||||
|
|||||||
@@ -23,17 +23,6 @@ text={2}, {T}, Sacrifice Apocalypse Chime: Destroy all nontoken permanents from
|
|||||||
rarity=R
|
rarity=R
|
||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
id=3014
|
|
||||||
name=Aysen Bureaucrats
|
|
||||||
mana={1}{W}
|
|
||||||
type=Creature
|
|
||||||
subtype=Human Advisor
|
|
||||||
power=1
|
|
||||||
toughness=1
|
|
||||||
text={T}: Tap target creature with power 2 or less.
|
|
||||||
rarity=C
|
|
||||||
[/card]
|
|
||||||
[card]
|
|
||||||
id=2936
|
id=2936
|
||||||
name=Baki's Curse
|
name=Baki's Curse
|
||||||
mana={2}{U}{U}
|
mana={2}{U}{U}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ type=Land
|
|||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
text={1}, {T}: Target 1/1 creature gets +1/+2 until end of turn.
|
text={1}, {T}: Target 1/1 creature gets +1/+2 until end of turn.
|
||||||
|
auto={1}{T}: 1/2 target(creature[power=1;toughness=1])
|
||||||
id=2393
|
id=2393
|
||||||
name=Aegis of the Meek
|
name=Aegis of the Meek
|
||||||
rarity=R
|
rarity=R
|
||||||
@@ -1531,6 +1532,7 @@ type=Instant
|
|||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
text={2}, {T}: Target creature with power 3 or less gains flying until end of turn.
|
text={2}, {T}: Target creature with power 3 or less gains flying until end of turn.
|
||||||
|
auto={2}{T}: flying target(creature[power<=3])
|
||||||
id=2435
|
id=2435
|
||||||
name=Whalebone Glider
|
name=Whalebone Glider
|
||||||
rarity=U
|
rarity=U
|
||||||
|
|||||||
@@ -964,6 +964,7 @@ abilities=legendary
|
|||||||
text={T}: Add {G} to your mana pool. {T}: Target 1/1 creature gets +1/+2 until end of turn.
|
text={T}: Add {G} to your mana pool. {T}: Target 1/1 creature gets +1/+2 until end of turn.
|
||||||
id=1703
|
id=1703
|
||||||
auto={T}:Add {G}
|
auto={T}:Add {G}
|
||||||
|
auto={T}: 1/2 target(creature[power=1;toughness=1])
|
||||||
name=Pendelhaven
|
name=Pendelhaven
|
||||||
rarity=U
|
rarity=U
|
||||||
type=Land
|
type=Land
|
||||||
|
|||||||
@@ -345,7 +345,7 @@ toughness=2
|
|||||||
text={T}: Target creature with power 2 or less is unblockable this turn.
|
text={T}: Target creature with power 2 or less is unblockable this turn.
|
||||||
id=3441
|
id=3441
|
||||||
name=Dwarven Nomad
|
name=Dwarven Nomad
|
||||||
alias=1285
|
auto={T}:unblockable target(creature[power<=2])
|
||||||
type=Creature
|
type=Creature
|
||||||
subtype=Dwarf Nomad
|
subtype=Dwarf Nomad
|
||||||
rarity=C
|
rarity=C
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ toughness=0
|
|||||||
[card]
|
[card]
|
||||||
text={T}: Target creature with power 2 or less is unblockable this turn.
|
text={T}: Target creature with power 2 or less is unblockable this turn.
|
||||||
id=40060
|
id=40060
|
||||||
alias=1285
|
auto={T}:unblockable target(creature[power<=2])
|
||||||
name=Crafty Pathmage
|
name=Crafty Pathmage
|
||||||
rarity=C
|
rarity=C
|
||||||
mana={2}{U}
|
mana={2}{U}
|
||||||
|
|||||||
@@ -608,6 +608,7 @@ toughness=1
|
|||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
text={T}: Target creature with power 2 or less is unblockable this turn.
|
text={T}: Target creature with power 2 or less is unblockable this turn.
|
||||||
|
auto={T}:unblockable target(creature[power<=2])
|
||||||
id=1285
|
id=1285
|
||||||
name=Dwarven Warriors
|
name=Dwarven Warriors
|
||||||
rarity=C
|
rarity=C
|
||||||
@@ -1406,6 +1407,15 @@ mana={1}
|
|||||||
type=Artifact
|
type=Artifact
|
||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
|
text=Creatures with power 3 or greater don't untap during their controllers' untap steps.
|
||||||
|
auto=lord(creature[power>=3]) doesnotuntap
|
||||||
|
id=1125
|
||||||
|
name=Meekstone
|
||||||
|
rarity=R
|
||||||
|
type=Artifact
|
||||||
|
mana={1}
|
||||||
|
[/card]
|
||||||
|
[card]
|
||||||
id=1210
|
id=1210
|
||||||
name=Merfolk of the Pearl Trident
|
name=Merfolk of the Pearl Trident
|
||||||
rarity=C
|
rarity=C
|
||||||
|
|||||||
@@ -264,15 +264,6 @@ type=Enchantment
|
|||||||
mana={3}{R}
|
mana={3}{R}
|
||||||
[/card]
|
[/card]
|
||||||
[card]
|
[card]
|
||||||
text=Creatures with power 3 or greater don't untap during their controllers' untap steps.
|
|
||||||
id=1125
|
|
||||||
name=Meekstone
|
|
||||||
rarity=R
|
|
||||||
color=Artifact
|
|
||||||
type=Artifact
|
|
||||||
mana={1}
|
|
||||||
[/card]
|
|
||||||
[card]
|
|
||||||
text=Flying, banding
|
text=Flying, banding
|
||||||
#Banding not supported in Wagic 0.9
|
#Banding not supported in Wagic 0.9
|
||||||
abilities=Flying, banding
|
abilities=Flying, banding
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ generic/wither.txt
|
|||||||
#Specific Cards
|
#Specific Cards
|
||||||
########################
|
########################
|
||||||
act_of_treason.txt
|
act_of_treason.txt
|
||||||
|
aegis_of_the_meek.txt
|
||||||
aether_mutation.txt
|
aether_mutation.txt
|
||||||
afflict.txt
|
afflict.txt
|
||||||
akron_legionnaire.txt
|
akron_legionnaire.txt
|
||||||
@@ -93,6 +94,7 @@ ashen_firebeast.txt
|
|||||||
ashen_firebeast2.txt
|
ashen_firebeast2.txt
|
||||||
aura_mutation.txt
|
aura_mutation.txt
|
||||||
avarice_totem.txt
|
avarice_totem.txt
|
||||||
|
aysen_bureaucrats.txt
|
||||||
baneslayer_angel.txt
|
baneslayer_angel.txt
|
||||||
baneslayer_angel2.txt
|
baneslayer_angel2.txt
|
||||||
barbed_sliver.txt
|
barbed_sliver.txt
|
||||||
@@ -174,6 +176,7 @@ drift_of_the_dead.txt
|
|||||||
dromad_purebred.txt
|
dromad_purebred.txt
|
||||||
dross_harvester.txt
|
dross_harvester.txt
|
||||||
duskwalker.txt
|
duskwalker.txt
|
||||||
|
dwarven_warriors.txt
|
||||||
ebony_horse.txt
|
ebony_horse.txt
|
||||||
ekundu_cyclops1_i218.txt
|
ekundu_cyclops1_i218.txt
|
||||||
ekundu_cyclops2_i218.txt
|
ekundu_cyclops2_i218.txt
|
||||||
@@ -266,6 +269,7 @@ lord_of_the_pit.txt
|
|||||||
lord_of_the_pit2.txt
|
lord_of_the_pit2.txt
|
||||||
master_decoy.txt
|
master_decoy.txt
|
||||||
master_of_etherium.txt
|
master_of_etherium.txt
|
||||||
|
meekstone.txt
|
||||||
memory_erosion.txt
|
memory_erosion.txt
|
||||||
millstone.txt
|
millstone.txt
|
||||||
misc01.txt
|
misc01.txt
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
#NAME: Aegis of the Meek
|
||||||
|
#DESC: "{1}{T}: Target 1/1 creature
|
||||||
|
#DESC: gets +1/+2 until end of turn."
|
||||||
|
#DESC: Test tries some illegal targets
|
||||||
|
#DESC: before settling on a legal one.
|
||||||
|
[INIT]
|
||||||
|
firstmain
|
||||||
|
[PLAYER1]
|
||||||
|
inplay:Aegis of the Meek,Raging Goblin,Steppe Lynx,Savannah Lions,Courier Hawk
|
||||||
|
hand:Swords to Plowshares
|
||||||
|
manapool:{W}{W}
|
||||||
|
[PLAYER2]
|
||||||
|
[DO]
|
||||||
|
Aegis of the Meek
|
||||||
|
Steppe Lynx
|
||||||
|
Savannah Lions
|
||||||
|
Courier Hawk
|
||||||
|
Raging Goblin
|
||||||
|
Swords to Plowshares
|
||||||
|
Raging Goblin
|
||||||
|
[ASSERT]
|
||||||
|
firstmain
|
||||||
|
[PLAYER1]
|
||||||
|
inplay:Aegis of the Meek,Steppe Lynx,Savannah Lions,Courier Hawk
|
||||||
|
graveyard:Swords to Plowshares
|
||||||
|
life:22
|
||||||
|
[PLAYER2]
|
||||||
|
[END]
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
#NAME: Aysen Bureaucrats
|
||||||
|
#DESC: "{T}: Tap target creature with power 2 or less."
|
||||||
|
#DESC: Test tries to tap an illegal
|
||||||
|
#DESC: target before tapping the
|
||||||
|
#DESC: legal one.
|
||||||
|
[INIT]
|
||||||
|
firstmain
|
||||||
|
[PLAYER1]
|
||||||
|
inplay:Aysen Bureaucrats,Spark Elemental,Grizzly Bears
|
||||||
|
hand:Assassinate
|
||||||
|
manapool:{2}{B}
|
||||||
|
[PLAYER2]
|
||||||
|
[DO]
|
||||||
|
Aysen Bureaucrats
|
||||||
|
Spark Elemental
|
||||||
|
Grizzly Bears
|
||||||
|
Assassinate
|
||||||
|
Grizzly Bears
|
||||||
|
[ASSERT]
|
||||||
|
firstmain
|
||||||
|
[PLAYER1]
|
||||||
|
inplay:Aysen Bureaucrats,Spark Elemental
|
||||||
|
graveyard:Grizzly Bears,Assassinate
|
||||||
|
[PLAYER2]
|
||||||
|
[END]
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
#NAME: Dwarven Warriors
|
||||||
|
#DESC: "{T}: Target creature with power 2
|
||||||
|
#DESC: or less is unblockable this turn."
|
||||||
|
[INIT]
|
||||||
|
firstmain
|
||||||
|
[PLAYER1]
|
||||||
|
inplay:Dwarven Warriors,Grizzly Bears
|
||||||
|
[PLAYER2]
|
||||||
|
inplay:Craw Wurm
|
||||||
|
[DO]
|
||||||
|
Dwarven Warriors
|
||||||
|
Grizzly Bears
|
||||||
|
next
|
||||||
|
next
|
||||||
|
Grizzly Bears
|
||||||
|
next
|
||||||
|
Craw Wurm
|
||||||
|
next
|
||||||
|
next
|
||||||
|
[ASSERT]
|
||||||
|
combatend
|
||||||
|
[PLAYER1]
|
||||||
|
inplay:Dwarven Warriors,Grizzly Bears
|
||||||
|
[PLAYER2]
|
||||||
|
inplay:Craw Wurm
|
||||||
|
life:18
|
||||||
|
[END]
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
#NAME: Meekstone
|
||||||
|
#DESC: "Creatures with power 3 or
|
||||||
|
#DESC: greater don't untap during
|
||||||
|
#DESC: their controllers' untap steps."
|
||||||
|
[INIT]
|
||||||
|
secondmain
|
||||||
|
[PLAYER1]
|
||||||
|
inplay:Meekstone,Flood
|
||||||
|
manapool:{U}{U}{U}{U}
|
||||||
|
[PLAYER2]
|
||||||
|
inplay:Grizzly Bears,War Mammoth,1373,1374,1375
|
||||||
|
hand:Assassinate
|
||||||
|
[DO]
|
||||||
|
Flood
|
||||||
|
Grizzly Bears
|
||||||
|
Flood
|
||||||
|
War Mammoth
|
||||||
|
eot
|
||||||
|
next
|
||||||
|
next
|
||||||
|
next
|
||||||
|
1373
|
||||||
|
1374
|
||||||
|
1375
|
||||||
|
Assassinate
|
||||||
|
Grizzly Bears
|
||||||
|
War Mammoth
|
||||||
|
[ASSERT]
|
||||||
|
firstmain
|
||||||
|
[PLAYER1]
|
||||||
|
inplay:Meekstone,Flood
|
||||||
|
[PLAYER2]
|
||||||
|
inplay:Grizzly Bears,1373,1374,1375
|
||||||
|
graveyard:War Mammoth,Assassinate
|
||||||
|
[END]
|
||||||
@@ -11,12 +11,28 @@
|
|||||||
#define CD_OR 1
|
#define CD_OR 1
|
||||||
#define CD_AND 2
|
#define CD_AND 2
|
||||||
|
|
||||||
|
enum ENUM_COMPARISON_MODES
|
||||||
|
{
|
||||||
|
COMPARISON_NONE = 0, // Needs to remain 0 for quick if(comparison_mode) checks
|
||||||
|
COMPARISON_AT_MOST,
|
||||||
|
COMPARISON_AT_LEAST,
|
||||||
|
COMPARISON_EQUAL,
|
||||||
|
COMPARISON_GREATER,
|
||||||
|
COMPARISON_LESS,
|
||||||
|
COMPARISON_UNEQUAL
|
||||||
|
};
|
||||||
|
|
||||||
class CardDescriptor: public MTGCardInstance{
|
class CardDescriptor: public MTGCardInstance{
|
||||||
protected:
|
protected:
|
||||||
MTGCardInstance * match_or(MTGCardInstance * card);
|
MTGCardInstance * match_or(MTGCardInstance * card);
|
||||||
MTGCardInstance * match_and(MTGCardInstance * card);
|
MTGCardInstance * match_and(MTGCardInstance * card);
|
||||||
|
bool valueInRange(int comparisonMode, int value, int criterion);
|
||||||
public:
|
public:
|
||||||
int mode;
|
int mode;
|
||||||
|
int powerComparisonMode;
|
||||||
|
int toughnessComparisonMode;
|
||||||
|
int manacostComparisonMode;
|
||||||
|
int convertedManacost; // might fit better into MTGCardInstance?
|
||||||
int init();
|
int init();
|
||||||
CardDescriptor();
|
CardDescriptor();
|
||||||
void unsecureSetTapped(int i);
|
void unsecureSetTapped(int i);
|
||||||
|
|||||||
@@ -91,8 +91,6 @@ public:
|
|||||||
|
|
||||||
class CreatureTargetChooser:public TargetZoneChooser{
|
class CreatureTargetChooser:public TargetZoneChooser{
|
||||||
public:
|
public:
|
||||||
int maxpower;
|
|
||||||
int maxtoughness;
|
|
||||||
CreatureTargetChooser(int * _zones, int _nbzones,MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false);
|
CreatureTargetChooser(int * _zones, int _nbzones,MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false);
|
||||||
CreatureTargetChooser(MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false);
|
CreatureTargetChooser(MTGCardInstance * card = NULL, int _maxtargets = 1, bool other = false);
|
||||||
virtual bool canTarget(Targetable * _card);
|
virtual bool canTarget(Targetable * _card);
|
||||||
|
|||||||
@@ -3,9 +3,14 @@
|
|||||||
#include "../include/Subtypes.h"
|
#include "../include/Subtypes.h"
|
||||||
#include "../include/Counters.h"
|
#include "../include/Counters.h"
|
||||||
|
|
||||||
|
|
||||||
CardDescriptor::CardDescriptor(): MTGCardInstance(){
|
CardDescriptor::CardDescriptor(): MTGCardInstance(){
|
||||||
init();
|
init();
|
||||||
mode = CD_AND;
|
mode = CD_AND;
|
||||||
|
powerComparisonMode = COMPARISON_NONE;
|
||||||
|
toughnessComparisonMode = COMPARISON_NONE;
|
||||||
|
manacostComparisonMode = COMPARISON_NONE;
|
||||||
|
convertedManacost = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CardDescriptor::init(){
|
int CardDescriptor::init(){
|
||||||
@@ -29,6 +34,26 @@ void CardDescriptor::setNegativeSubtype( string value){
|
|||||||
addType(-id);
|
addType(-id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Very generic function to compare a value to a criterion.
|
||||||
|
// Should be easily transferable to a more generic class if desired.
|
||||||
|
bool CardDescriptor::valueInRange(int comparisonMode, int value, int criterion){
|
||||||
|
switch (comparisonMode){
|
||||||
|
case COMPARISON_AT_MOST:
|
||||||
|
return (value <= criterion);
|
||||||
|
case COMPARISON_AT_LEAST:
|
||||||
|
return (value >= criterion);
|
||||||
|
case COMPARISON_EQUAL:
|
||||||
|
return (value == criterion);
|
||||||
|
case COMPARISON_GREATER:
|
||||||
|
return (value > criterion);
|
||||||
|
case COMPARISON_LESS:
|
||||||
|
return (value < criterion);
|
||||||
|
case COMPARISON_UNEQUAL:
|
||||||
|
return (value != criterion);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
MTGCardInstance * CardDescriptor::match_or(MTGCardInstance * card){
|
MTGCardInstance * CardDescriptor::match_or(MTGCardInstance * card){
|
||||||
int found = 1;
|
int found = 1;
|
||||||
for (int i = 0; i< nb_types; i++){
|
for (int i = 0; i< nb_types; i++){
|
||||||
@@ -65,6 +90,12 @@ MTGCardInstance * CardDescriptor::match_or(MTGCardInstance * card){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found) return NULL;
|
if (!found) return NULL;
|
||||||
|
|
||||||
|
// Quantified restrictions are always AND-ed:
|
||||||
|
if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power) ) return NULL;
|
||||||
|
if (toughnessComparisonMode && !valueInRange(toughnessComparisonMode, card->getToughness(), toughness) ) return NULL;
|
||||||
|
if (manacostComparisonMode && !valueInRange(manacostComparisonMode, card->getManaCost()->getConvertedCost(), convertedManacost) ) return NULL;
|
||||||
|
|
||||||
return card;
|
return card;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,6 +117,11 @@ MTGCardInstance * CardDescriptor::match_and(MTGCardInstance * card){
|
|||||||
match = NULL;
|
match = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power) ) match = NULL;
|
||||||
|
if (toughnessComparisonMode && !valueInRange(toughnessComparisonMode, card->getToughness(), toughness) ) match = NULL;
|
||||||
|
if (manacostComparisonMode && !valueInRange(manacostComparisonMode, card->getManaCost()->getConvertedCost(), convertedManacost) ) match = NULL;
|
||||||
|
|
||||||
return match;
|
return match;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -364,10 +364,10 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
|||||||
|
|
||||||
int mini = 0;
|
int mini = 0;
|
||||||
int maxi = 0;
|
int maxi = 0;
|
||||||
found = s.find(">");
|
found = s.find(" >");
|
||||||
if (found !=string::npos) mini = atoi(s.substr(found+1,1).c_str());
|
if (found !=string::npos) mini = atoi(s.substr(found+2,1).c_str());
|
||||||
found = s.find("<");
|
found = s.find(" <");
|
||||||
if (found !=string::npos) maxi = atoi(s.substr(found+1,1).c_str());
|
if (found !=string::npos) maxi = atoi(s.substr(found+2,1).c_str());
|
||||||
switch(i){
|
switch(i){
|
||||||
case 0: result = NEW ALord(id, card, lordTargets, lordIncludeSelf, a); break;
|
case 0: result = NEW ALord(id, card, lordTargets, lordIncludeSelf, a); break;
|
||||||
case 1: result = NEW AForeach(id, card, _target,lordTargets, lordIncludeSelf, a,mini,maxi); break;
|
case 1: result = NEW AForeach(id, card, _target,lordTargets, lordIncludeSelf, a,mini,maxi); break;
|
||||||
@@ -1351,13 +1351,6 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1285: //Dwarven Warriors
|
|
||||||
{
|
|
||||||
CreatureTargetChooser * tc = NEW CreatureTargetChooser(card);
|
|
||||||
tc->maxpower = 2;
|
|
||||||
game->addObserver(NEW ABasicAbilityModifierUntilEOT(_id, card, Constants::UNBLOCKABLE, NULL,tc));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1288: //EarthBind
|
case 1288: //EarthBind
|
||||||
{
|
{
|
||||||
game->addObserver(NEW AEarthbind(_id, card, card->target));
|
game->addObserver(NEW AEarthbind(_id, card, card->target));
|
||||||
@@ -1435,15 +1428,6 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){
|
|||||||
game->addObserver(NEW AInstantPowerToughnessModifierUntilEOT(id, card, card->target, NEW WParsedPT(power,toughness)));
|
game->addObserver(NEW AInstantPowerToughnessModifierUntilEOT(id, card, card->target, NEW WParsedPT(power,toughness)));
|
||||||
}
|
}
|
||||||
|
|
||||||
case 1703: //Pendelhaven
|
|
||||||
{
|
|
||||||
CreatureTargetChooser * tc = NEW CreatureTargetChooser(card);
|
|
||||||
tc->maxpower = 1;
|
|
||||||
tc->maxtoughness =1;
|
|
||||||
game->addObserver(NEW ATargetterPowerToughnessModifierUntilEOT(id, card, NEW WParsedPT(1,2), NEW ManaCost(),tc));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Addons ICE-AGE Cards
|
//Addons ICE-AGE Cards
|
||||||
|
|
||||||
case 2474: //Minion of Leshrac
|
case 2474: //Minion of Leshrac
|
||||||
@@ -1456,25 +1440,8 @@ void AbilityFactory::addAbilities(int _id, Spell * spell){
|
|||||||
game->addObserver(NEW AShieldOfTheAge( _id, card));
|
game->addObserver(NEW AShieldOfTheAge( _id, card));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 2435: //Whalebone Glider
|
|
||||||
{
|
|
||||||
int cost[] = {Constants::MTG_COLOR_ARTIFACT,2};
|
|
||||||
CreatureTargetChooser * tc = NEW CreatureTargetChooser(card);
|
|
||||||
tc->maxpower = 3;
|
|
||||||
game->addObserver(NEW ABasicAbilityModifierUntilEOT(_id, card, Constants::FLYING, NEW ManaCost(cost,1),tc));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2393: //Aegis of the Meek work but work also for 0/1 creatures... :D
|
|
||||||
{
|
|
||||||
int cost[] = {Constants::MTG_COLOR_ARTIFACT,1};
|
|
||||||
CreatureTargetChooser * tc = NEW CreatureTargetChooser(card);
|
|
||||||
tc->maxpower = 1;
|
|
||||||
tc->maxtoughness =1;
|
|
||||||
game->addObserver(NEW ATargetterPowerToughnessModifierUntilEOT(id, card, NEW WParsedPT(1,2), NEW ManaCost(cost,1),tc));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- addon Mirage ---
|
// --- addon Mirage ---
|
||||||
|
|
||||||
case 3410: //Seed of Innocence
|
case 3410: //Seed of Innocence
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -121,6 +121,40 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
|
|||||||
nbminuses++;
|
nbminuses++;
|
||||||
attribute=attribute.substr(1);
|
attribute=attribute.substr(1);
|
||||||
}
|
}
|
||||||
|
int comparisonMode = COMPARISON_NONE;
|
||||||
|
int comparisonCriterion = 0;
|
||||||
|
if (attribute.size() > 1){
|
||||||
|
size_t operatorPosition = attribute.find("=",1);
|
||||||
|
if (operatorPosition != string::npos){
|
||||||
|
comparisonCriterion = atoi(attribute.substr(operatorPosition+1,attribute.size()-operatorPosition-1).c_str());
|
||||||
|
switch (attribute[operatorPosition-1]){
|
||||||
|
case '<':
|
||||||
|
if (minus){
|
||||||
|
comparisonMode = COMPARISON_GREATER;
|
||||||
|
}else{
|
||||||
|
comparisonMode = COMPARISON_AT_MOST;
|
||||||
|
}
|
||||||
|
operatorPosition--;
|
||||||
|
break;
|
||||||
|
case '>':
|
||||||
|
if (minus){
|
||||||
|
comparisonMode = COMPARISON_LESS;
|
||||||
|
}else{
|
||||||
|
comparisonMode = COMPARISON_AT_LEAST;
|
||||||
|
}
|
||||||
|
operatorPosition--;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (minus){
|
||||||
|
comparisonMode = COMPARISON_UNEQUAL;
|
||||||
|
}else{
|
||||||
|
comparisonMode = COMPARISON_EQUAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
attribute = attribute.substr(0,operatorPosition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//Attacker
|
//Attacker
|
||||||
if (attribute.find("attacking") != string::npos){
|
if (attribute.find("attacking") != string::npos){
|
||||||
if (minus){
|
if (minus){
|
||||||
@@ -142,6 +176,18 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
|
|||||||
}else{
|
}else{
|
||||||
cd->unsecureSetTapped(1);
|
cd->unsecureSetTapped(1);
|
||||||
}
|
}
|
||||||
|
//Power restrictions
|
||||||
|
}else if (attribute.find("power") != string::npos){
|
||||||
|
cd->setPower(comparisonCriterion);
|
||||||
|
cd->powerComparisonMode = comparisonMode;
|
||||||
|
//Toughness restrictions
|
||||||
|
}else if (attribute.find("toughness") != string::npos){
|
||||||
|
cd->setToughness(comparisonCriterion);
|
||||||
|
cd->toughnessComparisonMode = comparisonMode;
|
||||||
|
//Manacost restrictions
|
||||||
|
}else if (attribute.find("manacost") != string::npos){
|
||||||
|
cd->convertedManacost = comparisonCriterion;
|
||||||
|
cd->manacostComparisonMode = comparisonMode;
|
||||||
}else{
|
}else{
|
||||||
int attributefound = 0;
|
int attributefound = 0;
|
||||||
//Colors
|
//Colors
|
||||||
@@ -474,8 +520,6 @@ DescriptorTargetChooser::~DescriptorTargetChooser(){
|
|||||||
CreatureTargetChooser::CreatureTargetChooser( MTGCardInstance * card, int _maxtargets, bool other):TargetZoneChooser(card, _maxtargets, other){
|
CreatureTargetChooser::CreatureTargetChooser( MTGCardInstance * card, int _maxtargets, bool other):TargetZoneChooser(card, _maxtargets, other){
|
||||||
int default_zones[] = {MTGGameZone::MY_BATTLEFIELD, MTGGameZone::OPPONENT_BATTLEFIELD};
|
int default_zones[] = {MTGGameZone::MY_BATTLEFIELD, MTGGameZone::OPPONENT_BATTLEFIELD};
|
||||||
init(default_zones,2);
|
init(default_zones,2);
|
||||||
maxpower= -1;
|
|
||||||
maxtoughness= -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CreatureTargetChooser::CreatureTargetChooser(int * _zones, int nbzones, MTGCardInstance * card, int _maxtargets, bool other):TargetZoneChooser(card, _maxtargets, other){
|
CreatureTargetChooser::CreatureTargetChooser(int * _zones, int nbzones, MTGCardInstance * card, int _maxtargets, bool other):TargetZoneChooser(card, _maxtargets, other){
|
||||||
@@ -485,8 +529,6 @@ CreatureTargetChooser::CreatureTargetChooser(int * _zones, int nbzones, MTGCardI
|
|||||||
}else{
|
}else{
|
||||||
init(_zones, nbzones);
|
init(_zones, nbzones);
|
||||||
}
|
}
|
||||||
maxpower = -1;
|
|
||||||
maxtoughness= -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -494,8 +536,6 @@ bool CreatureTargetChooser::canTarget(Targetable * target){
|
|||||||
if (!TargetZoneChooser::canTarget(target)) return false;
|
if (!TargetZoneChooser::canTarget(target)) return false;
|
||||||
if (target->typeAsTarget() == TARGET_CARD){
|
if (target->typeAsTarget() == TARGET_CARD){
|
||||||
MTGCardInstance * card = (MTGCardInstance *) target;
|
MTGCardInstance * card = (MTGCardInstance *) target;
|
||||||
if (maxpower != -1 && card->power > maxpower) return false;
|
|
||||||
if (maxtoughness != -1 && card->toughness > maxtoughness) return false;
|
|
||||||
return card->isCreature();
|
return card->isCreature();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user