Improved target chooser to allow a multiple selection for player, creature and planeswalkers, now it's possible to use target(player,creature,planeswalkers) as well as target(<variable>player,creature,planeswalkers) and so on. Added abilities for giving exiledeath and handdeath to instant and sorceries (the previous were not working fine), Added ability to identify the cards with Cycling ability as a target, Updated all primitives with cycling ability, fixed all primitives with choose any target ability, Added/fixed primitives from RIX set.
This commit is contained in:
@@ -584,13 +584,15 @@ Interruptible(observer, id)
|
||||
int PutInGraveyard::resolve()
|
||||
{
|
||||
MTGGameZone * zone = card->getCurrentZone();
|
||||
if (card->basicAbilities[(int)Constants::EXILEDEATH])
|
||||
if (card->basicAbilities[(int)Constants::EXILEDEATH] || card->basicAbilities[(int)Constants::GAINEDEXILEDEATH])
|
||||
{
|
||||
card->basicAbilities[(int)Constants::GAINEDEXILEDEATH] = 0;
|
||||
card->controller()->game->putInZone(card, zone, card->owner->game->exile);
|
||||
return 1;
|
||||
}
|
||||
if (card->basicAbilities[(int)Constants::HANDDEATH])
|
||||
if (card->basicAbilities[(int)Constants::HANDDEATH] || card->basicAbilities[(int)Constants::GAINEDHANDDEATH])
|
||||
{
|
||||
card->basicAbilities[(int)Constants::GAINEDHANDDEATH] = 0;
|
||||
card->controller()->game->putInZone(card, zone, card->owner->game->hand);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -4925,7 +4925,9 @@ int AbilityFactory::abilityEfficiency(MTGAbility * a, Player * p, int mode, Targ
|
||||
badAbilities[(int)Constants::NOMANA] = true;
|
||||
badAbilities[(int)Constants::ONLYMANA] = true;
|
||||
badAbilities[(int)Constants::EXILEDEATH] = true;
|
||||
badAbilities[(int)Constants::GAINEDEXILEDEATH] = true;
|
||||
badAbilities[(int)Constants::HANDDEATH] = true;
|
||||
badAbilities[(int)Constants::GAINEDHANDDEATH] = true;
|
||||
badAbilities[(int)Constants::INPLAYDEATH] = true;
|
||||
badAbilities[(int)Constants::INPLAYTAPDEATH] = true;
|
||||
badAbilities[(int)Constants::WEAK] = true;
|
||||
@@ -5741,12 +5743,14 @@ void AbilityFactory::addAbilities(int _id, Spell * spell)
|
||||
{
|
||||
MTGPlayerCards * zones = card->controller()->game;
|
||||
MTGPlayerCards * Endzones = card->owner->game;//put them in thier owners respective zones as per rules.
|
||||
if (card->basicAbilities[(int)Constants::EXILEDEATH])
|
||||
if (card->basicAbilities[(int)Constants::EXILEDEATH] || card->basicAbilities[(int)Constants::GAINEDEXILEDEATH])
|
||||
{
|
||||
card->basicAbilities[(int)Constants::GAINEDEXILEDEATH] = 0;
|
||||
card->controller()->game->putInZone(card, card->getCurrentZone(), card->owner->game->exile);
|
||||
}
|
||||
else if (card->basicAbilities[(int)Constants::HANDDEATH])
|
||||
else if (card->basicAbilities[(int)Constants::HANDDEATH] || card->basicAbilities[(int)Constants::GAINEDHANDDEATH])
|
||||
{
|
||||
card->basicAbilities[(int)Constants::GAINEDHANDDEATH] = 0;
|
||||
card->controller()->game->putInZone(card, card->getCurrentZone(), card->owner->game->hand);
|
||||
}
|
||||
else if (card->alternateCostPaid[ManaCost::MANA_PAID_WITH_BUYBACK] > 0)
|
||||
|
||||
@@ -505,14 +505,16 @@ int MTGCardInstance::totem(bool noregen)
|
||||
int MTGCardInstance::toGrave( bool forced )
|
||||
{
|
||||
Player * p = controller();
|
||||
if (basicAbilities[(int)Constants::EXILEDEATH])
|
||||
if (basicAbilities[(int)Constants::EXILEDEATH] || basicAbilities[(int)Constants::GAINEDEXILEDEATH])
|
||||
{
|
||||
p->game->putInZone(this, p->game->inPlay, owner->game->exile);
|
||||
basicAbilities[(int)Constants::GAINEDEXILEDEATH] = 0;
|
||||
return 1;
|
||||
}
|
||||
if (basicAbilities[(int)Constants::HANDDEATH])
|
||||
if (basicAbilities[(int)Constants::HANDDEATH] || basicAbilities[(int)Constants::GAINEDHANDDEATH])
|
||||
{
|
||||
p->game->putInZone(this, p->game->inPlay, owner->game->hand);
|
||||
basicAbilities[(int)Constants::GAINEDHANDDEATH] = 0;
|
||||
return 1;
|
||||
}
|
||||
if (basicAbilities[(int)Constants::INPLAYDEATH] || basicAbilities[(int)Constants::INPLAYTAPDEATH])
|
||||
|
||||
@@ -201,7 +201,10 @@ const char* Constants::MTGBasicAbilities[] = {
|
||||
"threeblockers", //It can be blocked just by 3 creatures or more.
|
||||
"handdeath", //It goes in hand after death.
|
||||
"inplaydeath", //It goes back in play untapped after death.
|
||||
"inplaytapdeath" //It goes back in play tapped after death.
|
||||
"inplaytapdeath", //It goes back in play tapped after death.
|
||||
"gainedexiledeath", //It goes to exile after death (use just to give add ability to instants and sorceries which originally have not, e.g. with transforms keyword)
|
||||
"gainedhanddeath", //It goes to hand after death (use just to give add ability to instants and sorceries which originally have not, e.g. with transforms keyword)
|
||||
"cycling" //It has cycling ability
|
||||
};
|
||||
|
||||
map<string,int> Constants::MTGBasicAbilitiesMap;
|
||||
|
||||
@@ -385,13 +385,17 @@ void MTGPlayerCards::showHand()
|
||||
// Moves a card to its owner's graveyard
|
||||
MTGCardInstance * MTGPlayerCards::putInGraveyard(MTGCardInstance * card)
|
||||
{
|
||||
if (card->getCurrentZone() != card->controller()->game->hand && card->basicAbilities[(int)Constants::EXILEDEATH])
|
||||
if (card->getCurrentZone() != card->controller()->game->hand && (card->basicAbilities[(int)Constants::EXILEDEATH] || card->basicAbilities[(int)Constants::GAINEDEXILEDEATH]))
|
||||
{
|
||||
return putInZone(card, card->getCurrentZone(), card->owner->game->exile);
|
||||
MTGCardInstance* ret = putInZone(card, card->getCurrentZone(), card->owner->game->exile);
|
||||
ret->basicAbilities[(int)Constants::GAINEDEXILEDEATH] = 0;
|
||||
return ret;
|
||||
}
|
||||
else if (card->getCurrentZone() != card->controller()->game->hand && card->basicAbilities[(int)Constants::HANDDEATH])
|
||||
else if (card->getCurrentZone() != card->controller()->game->hand && (card->basicAbilities[(int)Constants::HANDDEATH] || card->basicAbilities[(int)Constants::GAINEDHANDDEATH]))
|
||||
{
|
||||
return putInZone(card, card->getCurrentZone(), card->owner->game->hand);
|
||||
MTGCardInstance* ret = putInZone(card, card->getCurrentZone(), card->owner->game->hand);
|
||||
ret->basicAbilities[(int)Constants::GAINEDHANDDEATH] = 0;
|
||||
return ret;
|
||||
}
|
||||
else if (card->getCurrentZone() != card->controller()->game->hand && (card->basicAbilities[(int)Constants::INPLAYDEATH] || card->basicAbilities[(int)Constants::INPLAYTAPDEATH]))
|
||||
{
|
||||
@@ -807,6 +811,8 @@ MTGCardInstance * MTGGameZone::removeCard(MTGCardInstance * card, int createCopy
|
||||
copy->lastController = card->controller();
|
||||
copy->previousController = card->controller();
|
||||
copy->basicAbilities[Constants::ISCOMMANDER] = card->basicAbilities[Constants::ISCOMMANDER];
|
||||
copy->basicAbilities[Constants::GAINEDEXILEDEATH] = card->basicAbilities[Constants::GAINEDEXILEDEATH];
|
||||
copy->basicAbilities[Constants::GAINEDHANDDEATH] = card->basicAbilities[Constants::GAINEDHANDDEATH];
|
||||
copy->damageInflictedAsCommander = card->damageInflictedAsCommander;
|
||||
copy->numofcastfromcommandzone = card->numofcastfromcommandzone;
|
||||
for (int i = 0; i < ManaCost::MANA_PAID_WITH_BESTOW +1; i++)
|
||||
|
||||
@@ -121,10 +121,26 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
|
||||
if (found != string::npos)
|
||||
{
|
||||
int maxtargets = 1;
|
||||
size_t several = s.find("<anyamount>");
|
||||
size_t several = s.find("<");
|
||||
if (several != string::npos){
|
||||
size_t idx = s.find(">");
|
||||
if(idx != string::npos){
|
||||
string tmp = s.substr(several+1,idx-1);
|
||||
WParsedInt* parser = NEW WParsedInt(tmp, card);
|
||||
maxtargets = parser->intValue;
|
||||
SAFE_DELETE(parser);
|
||||
}
|
||||
}
|
||||
several = s.find("<anyamount>");
|
||||
if (several != string::npos) maxtargets = TargetChooser::UNLITMITED_TARGETS;
|
||||
found = s.find("creature,planeswalker");
|
||||
if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other, false, "creature,planeswalker"); //Any Damageable target (player, creature, planeswalker)
|
||||
found = s.find("planeswalker,creature");
|
||||
if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other, false, "creature,planeswalker"); //Any Damageable target (player, creature, planeswalker)
|
||||
found = s.find("creature");
|
||||
if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other); //Any Damageable target (player, creature)
|
||||
if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other); //2 Damageable target (player, creature)
|
||||
found = s.find("planeswalker");
|
||||
if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other, false, "planeswalker"); //2 Damageable target (player, planeswalker)
|
||||
return NEW PlayerTargetChooser(observer, card, maxtargets); //Any player
|
||||
}
|
||||
|
||||
@@ -1280,9 +1296,18 @@ bool CardTargetChooser::equals(TargetChooser * tc)
|
||||
TypeTargetChooser::TypeTargetChooser(GameObserver *observer, const char * _type, MTGCardInstance * card, int _maxtargets, bool other,bool targetMin) :
|
||||
TargetZoneChooser(observer, card, _maxtargets, other,targetMin)
|
||||
{
|
||||
int id = MTGAllCards::findType(_type);
|
||||
nbtypes = 0;
|
||||
addType(id);
|
||||
if(!strcmp(_type,"creature,planeswalker")){
|
||||
int id = MTGAllCards::findType("creature");
|
||||
nbtypes = 0;
|
||||
addType(id);
|
||||
id = MTGAllCards::findType("planeswalker");
|
||||
addType(id);
|
||||
}
|
||||
else {
|
||||
int id = MTGAllCards::findType(_type);
|
||||
nbtypes = 0;
|
||||
addType(id);
|
||||
}
|
||||
int default_zones[] = { MTGGameZone::MY_BATTLEFIELD, MTGGameZone::OPPONENT_BATTLEFIELD };
|
||||
init(default_zones, 2);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user