int SacrificeCost::doPay() { if (target) { MTGCardInstance * beforeCard = target; source->storedCard = target->createSnapShot(); target->controller()->game->putInGraveyard(target); WEvent * e = NEW WEventCardSacrifice(beforeCard,target); GameObserver * game = target->owner->getObserver(); game->receiveEvent(e); target = NULL; if (tc) tc->initTargets(); return 1; } return 0; }
int Counters::removeCounter(const char * _name, int _power, int _toughness) { for (int i = 0; i < mCount; i++) { if (counters[i]->sameAs(_name, _power, _toughness)) { if (counters[i]->nb < 1) return 0; counters[i]->removed(); counters[i]->nb--; GameObserver *g = target->getObserver(); WEvent * e = NEW WEventCounters(this,_name,_power,_toughness,false,true); dynamic_cast<WEventCounters*>(e)->targetCard = this->target; g->receiveEvent(e); // special case: when the last time counter is removed from non-suspended card // sacrifice that card if (!target->suspended && counters[i]->name == "time" && counters[i]->nb == 0) { MTGCardInstance * beforeCard = target; target->controller()->game->putInGraveyard(target); WEvent * e = NEW WEventCardSacrifice(beforeCard, target); g->receiveEvent(e); } //special case:if a card is suspended and no longer has a time counter when the last is removed, the card is cast. if (target->suspended && !target->counters->hasCounter("time",0,0)) { GameObserver * game = target->getObserver(); MTGAbility *ac = NEW AACastCard(game, game->mLayers->actionLayer()->getMaxId(), target, target, false, false, true, "", "", false, false); MayAbility *ma1 = NEW MayAbility(game, game->mLayers->actionLayer()->getMaxId(), ac->clone(), target, true); MTGAbility *ga1 = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), target, NULL, ma1->clone()); SAFE_DELETE(ac); SAFE_DELETE(ma1); ga1->resolve(); SAFE_DELETE(ga1); } return mCount; } } return 0; }
int Counters::removeCounter(const char * _name, int _power, int _toughness) { for (int i = 0; i < mCount; i++) { if (counters[i]->sameAs(_name, _power, _toughness)) { if (counters[i]->nb < 1) return 0; counters[i]->removed(); counters[i]->nb--; GameObserver *g = target->getObserver(); WEvent * e = NEW WEventCounters(this,_name,_power,_toughness,false,true); dynamic_cast<WEventCounters*>(e)->targetCard = this->target; g->receiveEvent(e); // special case: when the last time counter is removed from non-suspended card // sacrifice that card if (!target->suspended && counters[i]->name == "time" && counters[i]->nb == 0) { MTGCardInstance * beforeCard = target; target->controller()->game->putInGraveyard(target); WEvent * e = NEW WEventCardSacrifice(beforeCard, target); g->receiveEvent(e); } //special case:if a card is suspended and no longer has a time counter when the last is removed, the card is cast. if (target->suspended && !target->counters->hasCounter("time",0,0)) { GameObserver * game = target->getObserver(); MTGCardInstance * copy = target->controller()->game->putInZone(target, target->currentZone, target->controller()->game->stack); game->mLayers->stackLayer()->addSpell(copy, game->targetChooser, NULL,1, 0); game->targetChooser = NULL; } return mCount; } } return 0; }