- fix issue 153 (Tokens should go to graveyard)
- "token" keyword can now be used in the parser with things such as Creature[-token] for "noncreature token"
- Let's stop using "token" as a type
This commit is contained in:
wagic.the.homebrew@gmail.com
2010-01-03 10:08:36 +00:00
parent 69c5dee979
commit 23fe54ae6f
12 changed files with 110 additions and 7 deletions
+1 -1
View File
@@ -511,7 +511,7 @@ abilities=mountainwalk
[card] [card]
text=Whenever a nontoken creature you control is put into a graveyard from the battlefield, put a 1/1 green Saproling creature token onto the battlefield. text=Whenever a nontoken creature you control is put into a graveyard from the battlefield, put a 1/1 green Saproling creature token onto the battlefield.
id=89069 id=89069
auto=@movedto(creature|graveyard) from(myBattlefield):token(Saproling,creature saproling, 1/1,green) auto=@movedto(creature[-token]|graveyard) from(myBattlefield):token(Saproling,creature saproling, 1/1,green)
name=Golgari Germination name=Golgari Germination
rarity=U rarity=U
type=Enchantment type=Enchantment
+2
View File
@@ -165,6 +165,7 @@ death_ward.txt
deja_vu.txt deja_vu.txt
delusions_of_mediocrity.txt delusions_of_mediocrity.txt
dingus_egg.txt dingus_egg.txt
dingus_staff_i153.txt
divergent_growth.txt divergent_growth.txt
doomed_necromancer.txt doomed_necromancer.txt
double_strike_i145.txt double_strike_i145.txt
@@ -230,6 +231,7 @@ goblin_lackey2.txt
goblin_lackey3.txt goblin_lackey3.txt
goblin_lackey4.txt goblin_lackey4.txt
goblin_offensive.txt goblin_offensive.txt
golgari_germination_i153.txt
gravedigger.txt gravedigger.txt
great_defender.txt great_defender.txt
hannas_custody.txt hannas_custody.txt
@@ -0,0 +1,21 @@
#Bug: Tokens don't go to the graveyard
#see: http://code.google.com/p/wagic/issues/detail?id=153
[INIT]
FIRSTMAIN
[PLAYER1]
inplay:1138,dingus staff
hand:shock
manapool:{5}{R}
[PLAYER2]
[DO]
1138
shock
-1138
[ASSERT]
FIRSTMAIN
[PLAYER1]
life:18
inplay:1138,dingus staff
graveyard:shock
[PLAYER2]
[END]
@@ -0,0 +1,21 @@
#Bug: Tokens and graveyard
#see http://code.google.com/p/wagic/issues/detail?id=153
[INIT]
FIRSTMAIN
[PLAYER1]
inplay:grizzly bears,89069
manapool:{R}{R}
hand:lightning bolt,shock
[PLAYER2]
[DO]
lightning bolt
grizzly bears
shock
-89069
[ASSERT]
FIRSTMAIN
[PLAYER1]
graveyard:lightning bolt,grizzly bears,shock
inplay:89069
[PLAYER2]
[END]
+1 -1
View File
@@ -47,7 +47,7 @@ class MTGCardInstance: public CardPrimitive, public MTGCard, public Damageable {
MTGGameZone * currentZone; MTGGameZone * currentZone;
Pos* view; Pos* view;
int regenerateTokens; int regenerateTokens;
bool isToken; int isToken;
int stillInUse(); int stillInUse();
Player * lastController; Player * lastController;
MTGGameZone * getCurrentZone(); MTGGameZone * getCurrentZone();
+10
View File
@@ -64,6 +64,16 @@ class MTGPersistRule:public MTGAbility{
}; };
class MTGTokensCleanup:public MTGAbility{
public:
vector<MTGCardInstance *> list;
MTGTokensCleanup(int _id);
int receiveEvent(WEvent * event);
int testDestroy();
void Update(float dt);
virtual MTGTokensCleanup * clone() const;
};
/* /*
* Rule 420.5e (Legend Rule) * Rule 420.5e (Legend Rule)
* If two or more legendary permanents with the same name are in play, all are put into their * If two or more legendary permanents with the same name are in play, all are put into their
+3 -1
View File
@@ -150,7 +150,9 @@ MTGCardInstance * CardDescriptor::match(MTGCardInstance * card){
match = NULL; match = NULL;
} }
if ((isToken== -1 && card->isToken) || (isToken == 1 && !card->isToken)){
match = NULL;
}
if (attacker == 1){ if (attacker == 1){
if (defenser == &AnyCard){ if (defenser == &AnyCard){
+1
View File
@@ -28,6 +28,7 @@ void DuelLayers::init(){
action->Add(NEW MTGLifelinkRule(-1)); action->Add(NEW MTGLifelinkRule(-1));
action->Add(NEW MTGDeathtouchRule(-1)); action->Add(NEW MTGDeathtouchRule(-1));
action->Add(NEW OtherAbilitiesEventReceiver(-1)); action->Add(NEW OtherAbilitiesEventReceiver(-1));
action->Add(NEW MTGTokensCleanup(-1));
//Other display elements //Other display elements
action->Add(NEW HUDDisplay(-1)); action->Add(NEW HUDDisplay(-1));
+12 -4
View File
@@ -148,12 +148,12 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone
} }
MTGCardInstance * ret = copy; MTGCardInstance * ret = copy;
if (card->isToken){ /*if (card->isToken){
if (to != g->players[0]->game->inPlay && to != g->players[1]->game->inPlay){ if (to != g->players[0]->game->inPlay && to != g->players[1]->game->inPlay){
to = garbage; to = garbage;
ret = NULL; ret = NULL;
} }
} }*/
to->addCard(copy); to->addCard(copy);
copy->changedZoneRecently = 1.f; copy->changedZoneRecently = 1.f;
@@ -211,13 +211,21 @@ MTGCardInstance * MTGGameZone::removeCard(MTGCardInstance * card, int createCopy
nb_cards--; nb_cards--;
cards.erase(cards.begin()+i); cards.erase(cards.begin()+i);
MTGCardInstance * copy = card; MTGCardInstance * copy = card;
if (card->isToken) //TODO better than this ? //if (card->isToken) //TODO better than this ?
return card; // return card;
//card->lastController = card->controller(); //card->lastController = card->controller();
if (createCopy) { if (createCopy) {
copy = NEW MTGCardInstance(card->model,card->owner->game); copy = NEW MTGCardInstance(card->model,card->owner->game);
copy->previous = card; copy->previous = card;
copy->view = card->view; copy->view = card->view;
copy->isToken = card->isToken;
//stupid bug with tokens...
if (card->model == card)
copy->model = copy;
if (card->data == card)
copy->data = copy;
card->next = copy; card->next = copy;
} }
copy->previousZone = this; copy->previousZone = this;
+30
View File
@@ -516,6 +516,36 @@ HUDDisplay::~HUDDisplay(){
} }
MTGTokensCleanup::MTGTokensCleanup(int _id):MTGAbility(_id, NULL){}
int MTGTokensCleanup::receiveEvent(WEvent * e){
if (WEventZoneChange* event = dynamic_cast<WEventZoneChange*>(e)){
if (!event->card->isToken) return 0;
if (event->to == game->players[0]->game->inPlay || event->to == game->players[1]->game->inPlay) return 0;
if (event->to == game->players[0]->game->garbage || event->to == game->players[1]->game->garbage) return 0;
list.push_back(event->card);
return 1;
}
return 0;
}
int MTGTokensCleanup::testDestroy(){return 0;}
void MTGTokensCleanup::Update(float dt){
MTGAbility::Update(dt);
for(size_t i= 0; i < list.size(); ++i){
MTGCardInstance * c = list[i];
c->controller()->game->putInZone(c,c->currentZone, c->controller()->game->garbage);
}
list.clear();
}
MTGTokensCleanup * MTGTokensCleanup::clone() const{
MTGTokensCleanup * a = NEW MTGTokensCleanup(*this);
a->isClone = 1;
return a;
}
/* Legend Rule */ /* Legend Rule */
MTGLegendRule::MTGLegendRule(int _id):ListMaintainerAbility(_id){}; MTGLegendRule::MTGLegendRule(int _id):ListMaintainerAbility(_id){};
+7
View File
@@ -176,6 +176,13 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
}else{ }else{
cd->unsecureSetTapped(1); cd->unsecureSetTapped(1);
} }
//Token
}else if (attribute.find("token") != string::npos){
if (minus){
cd->isToken = -1;
}else{
cd->isToken = 1;
}
//Power restrictions //Power restrictions
}else if (attribute.find("power") != string::npos){ }else if (attribute.find("power") != string::npos){
cd->setPower(comparisonCriterion); cd->setPower(comparisonCriterion);
+1
View File
@@ -12,6 +12,7 @@ Token::Token(string _name, MTGCardInstance * source, int _power, int _toughness)
setMTGId(- source->getMTGId()); setMTGId(- source->getMTGId());
setId = source->setId; setId = source->setId;
model = this; model = this;
data=this;
owner = source->owner; owner = source->owner;
belongs_to=source->controller()->game; belongs_to=source->controller()->game;
attacker = 0; attacker = 0;