diff --git a/projects/mtg/include/AIPlayerBaka.h b/projects/mtg/include/AIPlayerBaka.h index 888fdd47a..285adf127 100644 --- a/projects/mtg/include/AIPlayerBaka.h +++ b/projects/mtg/include/AIPlayerBaka.h @@ -101,7 +101,7 @@ class AIPlayerBaka: public AIPlayer{ virtual bool payTheManaCost(ManaCost * cost, MTGCardInstance * card = NULL,vector gotPayment = vector()); virtual int getCreaturesInfo(Player * player, int neededInfo = INFO_NBCREATURES , int untapMode = 0, int canAttack = 0); virtual ManaCost * getPotentialMana(MTGCardInstance * card = NULL); - int selectAbility(); + virtual int selectAbility(); public: enum { diff --git a/projects/mtg/include/MTGAbility.h b/projects/mtg/include/MTGAbility.h index 997716c79..4f72b14a3 100644 --- a/projects/mtg/include/MTGAbility.h +++ b/projects/mtg/include/MTGAbility.h @@ -44,10 +44,17 @@ class MTGAbility : public ActionElement { private: ManaCost* mCost; + protected: char menuText[50]; GameObserver * game; + + // returns target itself if it is a player, or its controller if it is a card + static Player * getPlayerFromTarget(Targetable * target); + + // returns target itself if it is a player, or its controller if it is a card + static Player * getPlayerFromDamageable(Damageable * target); public: enum { @@ -207,8 +214,6 @@ public: COUNTERS = 30, PUT_INTO_PLAY_WITH_KICKER = 31, STANDARD_FIZZLER = 32, - - }; }; diff --git a/projects/mtg/src/AIPlayerBaka.cpp b/projects/mtg/src/AIPlayerBaka.cpp index 5b02a68b8..280b1113b 100644 --- a/projects/mtg/src/AIPlayerBaka.cpp +++ b/projects/mtg/src/AIPlayerBaka.cpp @@ -1216,35 +1216,19 @@ int AIPlayerBaka::selectHintAbility() int AIPlayerBaka::selectAbility() { - static bool findingAbility = false; - //this guard is put in place to prevent Ai from - //ever running selectAbility() function WHILE its already doing so. - - // Break if this happens in debug mode. If this happens, it's actually a bug - assert(!findingAbility); - - if (findingAbility) - {//is already looking kick me out of this function! - return 0; - } - findingAbility = true;//im looking now safely! - - - // Try Deck hints first + // Try Deck hints first if (selectHintAbility()) - { - findingAbility = false;//ok to start looking again. return 1; - } + GameObserver * go = GameObserver::GetInstance(); if(go->mLayers->stackLayer()->lastActionController == this) { //this is here for 2 reasons, MTG rules state that priority is passed with each action. //without this ai is able to chain cast {t}:damage:1 target(creature) from everything it can all at once. //this not only is illegal but cause ai to waste abilities ei:all damage:1 on a single 1/1 creature. - findingAbility = false; return 1; } + RankingContainer ranking; list::iterator it; GameObserver * g = GameObserver::GetInstance(); @@ -1262,7 +1246,7 @@ int AIPlayerBaka::selectAbility() for (int j = 0; j < game->inPlay->nb_cards; j++) { MTGCardInstance * card = game->inPlay->cards[j]; - if(a->getCost() && !a->isReactingToClick(card, totalPotentialMana))//for preformence reason only look for specific mana if the payment couldnt be made with potential. + if(a->getCost() && !a->isReactingToClick(card, totalPotentialMana))//for performance reason only look for specific mana if the payment couldnt be made with potential. { abilityPayment = vector(); abilityPayment = canPayMana(card,a->getCost()); @@ -1323,7 +1307,6 @@ int AIPlayerBaka::selectAbility() } } - findingAbility = false;//ok to start looking again. abilityPayment.clear(); return 1; } diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index f6a4eb911..fc624804d 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -64,8 +64,6 @@ int GenericActivatedAbility::testDestroy() GenericActivatedAbility * GenericActivatedAbility::clone() const { GenericActivatedAbility * a = NEW GenericActivatedAbility(*this); - //a->getCost() = NEW ManaCost(); - //a->getCost()->copy(cost); a->ability = ability->clone(); return a; } @@ -184,20 +182,11 @@ AADepleter::AADepleter(int _id, MTGCardInstance * card, Targetable * _target,str } int AADepleter::resolve() { - - Targetable * _target = getTarget(); - Player * player; - if (_target) + Player * player = getPlayerFromTarget(getTarget()); + + if (player) { WParsedInt numCards(nbcardsStr, NULL, source); - if (_target->typeAsTarget() == TARGET_CARD) - { - player = ((MTGCardInstance *) _target)->controller(); - } - else - { - player = (Player *) _target; - } MTGLibrary * library = player->game->library; for (int i = 0; i < numCards.getValue(); i++) { @@ -378,7 +367,7 @@ AACounter * AACounter::clone() const return NEW AACounter(*this); } -//sheild a card from a certain type of counter. +//shield a card from a certain type of counter. ACounterShroud::ACounterShroud(int id, MTGCardInstance * source, MTGCardInstance * target, Counter * counter) : MTGAbility(id, source),counter(counter),re(NULL) { @@ -426,9 +415,8 @@ MTGAbility(id, source, target),scounter(scounter) int ACounterTracker::addToGame() { MTGCardInstance * _target = (MTGCardInstance*)target; - Counter * counter = NULL; AbilityFactory af; - counter = af.parseCounter(scounter, _target, NULL); //(Spell*)source); + Counter * counter = af.parseCounter(scounter, _target, NULL); //(Spell*)source); if (!counter) { return 0; @@ -453,9 +441,8 @@ int ACounterTracker::addToGame() int ACounterTracker::destroy() { MTGCardInstance * _target = (MTGCardInstance*)target; - Counter * counter = NULL; AbilityFactory af; - counter = af.parseCounter(scounter, _target, NULL); //(Spell*)source); + Counter * counter = af.parseCounter(scounter, _target, NULL); //(Spell*)source); if (!counter) { return 0; @@ -500,39 +487,37 @@ AARemoveAllCounter::AARemoveAllCounter(int id, MTGCardInstance * source, MTGCard menu = ""; } - int AARemoveAllCounter::resolve() +int AARemoveAllCounter::resolve() +{ + if (!target) + return 0; + + MTGCardInstance * _target = (MTGCardInstance *) target; + if (all ) { - if (target) + for(int amount = 0;amount < _target->counters->mCount;amount++) { - MTGCardInstance * _target = (MTGCardInstance *) target; - if (all ) - { - for(int amount = 0;amount < _target->counters->mCount;amount++) - { - while(_target->counters->counters[amount]->nb > 0) - _target->counters->removeCounter(_target->counters->counters[amount]->name.c_str(),_target->counters->counters[amount]->power,_target->counters->counters[amount]->toughness); + while(_target->counters->counters[amount]->nb > 0) + _target->counters->removeCounter(_target->counters->counters[amount]->name.c_str(),_target->counters->counters[amount]->power,_target->counters->counters[amount]->toughness); - } - } - Counter * targetCounter = NULL; - if (_target->counters && _target->counters->hasCounter(name.c_str(), power, toughness)) - { - targetCounter = _target->counters->hasCounter(name.c_str(), power, toughness); - nb = targetCounter->nb; - } - - if (nb > 0) - { - for (int i = 0; i < nb; i++) - { - while (_target->next) - _target = _target->next; - _target->counters->removeCounter(name.c_str(), power, toughness); - } - } - return nb; + } } - return 0; + Counter * targetCounter = NULL; + if (_target->counters && _target->counters->hasCounter(name.c_str(), power, toughness)) + { + targetCounter = _target->counters->hasCounter(name.c_str(), power, toughness); + nb = targetCounter->nb; + } + + + for (int i = 0; i < nb; i++) + { + while (_target->next) + _target = _target->next; + _target->counters->removeCounter(name.c_str(), power, toughness); + } + + return nb; } const char* AARemoveAllCounter::getMenuText() @@ -562,8 +547,7 @@ const char* AARemoveAllCounter::getMenuText() menu.append(buffer); } - sprintf(menuText, "%s", menu.c_str()); - return menuText; + return menu.c_str(); } AARemoveAllCounter * AARemoveAllCounter::clone() const @@ -579,35 +563,34 @@ ActivatedAbility(id, source, cost, 0) int AAProliferate::resolve() { - if (target) + if (!target) + return 0; + + vectorpcounters; + if(target->typeAsTarget() == TARGET_PLAYER && ((Player*)target)->poisonCount && target != source->controller()) { - vectorpcounters = vector(); - if(target->typeAsTarget() == TARGET_PLAYER && ((Player*)target)->poisonCount && target != source->controller()) + MTGAbility * a = NEW AAAlterPoison(game->mLayers->actionLayer()->getMaxId(), source, target, 1, NULL); + a->oneShot = true; + pcounters.push_back(a); + } + else if (target->typeAsTarget() == TARGET_CARD && ((MTGCardInstance*)target)->counters) + { + Counters * counters = ((MTGCardInstance*)target)->counters; + for(size_t i = 0; i < counters->counters.size(); ++i) { - MTGAbility * a = NEW AAAlterPoison(game->mLayers->actionLayer()->getMaxId(), source,(Player*)target,1,NULL); - a->target = (Player*)target; + Counter * counter = counters->counters[i]; + MTGAbility * a = NEW AACounter(game->mLayers->actionLayer()->getMaxId(), source, (MTGCardInstance*)target,"", counter->name.c_str(), counter->power, counter->toughness, 1,0); a->oneShot = true; pcounters.push_back(a); } - else if (target->typeAsTarget() == TARGET_CARD && ((MTGCardInstance*)target)->counters) - { - for(unsigned int i = 0; i < ((MTGCardInstance*)target)->counters->counters.size();i++) - { - MTGAbility * a = NEW AACounter(game->mLayers->actionLayer()->getMaxId(), source, (MTGCardInstance*)target,"", ((MTGCardInstance*)target)->counters->counters[i]->name.c_str(), ((MTGCardInstance*)target)->counters->counters[i]->power, ((MTGCardInstance*)target)->counters->counters[i]->toughness, 1,0); - a->target = (MTGCardInstance*)target; - a->oneShot = true; - pcounters.push_back(a); - } - } - if(pcounters.size()) - { - MTGAbility * a = NEW MenuAbility(/*int(game->mLayers->actionLayer()->getMaxId())*/this->GetId(),(MTGCardInstance*)target, source,false,pcounters); - a->target = (MTGCardInstance*)target; - a->resolve(); - } - return 1; } - return 0; + if(pcounters.size()) + { + MTGAbility * a = NEW MenuAbility(this->GetId(), target, source,false,pcounters); + a->resolve(); + } + return 1; + } const char* AAProliferate::getMenuText() @@ -664,7 +647,7 @@ int AAFizzler::resolve() //the next section helps Ai correctly recieve its targets for this effect if(!target && source->target) { - //ai is casting a spell from it's hand to fizzle. + //ai is casting a spell from its hand to fizzle. target = stack->getActionElementFromCard(source->target); } else if(target->typeAsTarget() == TARGET_CARD) @@ -820,19 +803,11 @@ AADrawer::AADrawer(int _id, MTGCardInstance * card, Targetable * _target, ManaCo int AADrawer::resolve() { - Targetable * _target = getTarget(); - Player * player; - if (_target) + Player * player = getPlayerFromTarget(getTarget()); + + if (player) { WParsedInt numCards(nbcardsStr, NULL, source); - if (_target->typeAsTarget() == TARGET_CARD) - { - player = ((MTGCardInstance *) _target)->controller(); - } - else - { - player = (Player *) _target; - } game->mLayers->stackLayer()->addDraw(player, numCards.getValue()); game->mLayers->stackLayer()->resolve(); GameObserver *g = GameObserver::GetInstance(); @@ -1435,8 +1410,8 @@ const char * AADynamic::getMenuText() default: break; } - sprintf(menuText, "%s", menu.c_str()); - return menuText; + + return menu.c_str(); } AADynamic * AADynamic::clone() const @@ -1504,18 +1479,10 @@ AASetHand::AASetHand(int _id, MTGCardInstance * _source, Targetable * _target, i int AASetHand::resolve() { Damageable * _target = (Damageable *) getTarget(); - if (!_target) - return 0; + Player * p = getPlayerFromDamageable(_target); - Player * p = NULL; - if (_target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) - { - p = ((MTGCardInstance *) _target)->controller(); - } - else - { - p = (Player*)_target; - } + if (!p) + return 0; p->handsize = hand; @@ -1542,18 +1509,10 @@ AALifeSet::AALifeSet(int _id, MTGCardInstance * _source, Targetable * _target, W int AALifeSet::resolve() { Damageable * _target = (Damageable *) getTarget(); - if (!_target) - return 0; + Player * p = getPlayerFromDamageable(_target); - Player * p = NULL; - if (_target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) - { - p = ((MTGCardInstance *) _target)->controller(); - } - else - { - p = (Player*)_target; - } + if (!p) + return 0; int lifeDiff = life->getValue() - p->life ; p->gainOrLoseLife(lifeDiff); @@ -1595,48 +1554,41 @@ AACloner::AACloner(int _id, MTGCardInstance * _source, MTGCardInstance * _target } - int AACloner::resolve() +int AACloner::resolve() +{ + MTGCardInstance * _target = (MTGCardInstance *) target; + if (!_target) + return 0; + + MTGCard* clone = (_target->isToken ? _target: MTGCollection()->getCardByName(_target->name)); + + Player * targetPlayer = who == 1 ? source->controller()->opponent() : source->controller(); + + MTGCardInstance * myClone = NEW MTGCardInstance(clone, targetPlayer->game); + targetPlayer->game->temp->addCard(myClone); + + Spell * spell = NEW Spell(myClone); + spell->resolve(); + spell->source->isToken = 1; + spell->source->fresh = 1; + if(_target->isToken) { - MTGCardInstance * _target = (MTGCardInstance *) target; - if (_target) - { - MTGCardInstance * myClone = NULL; - MTGCard* clone = (_target->isToken ? _target: MTGCollection()->getCardByName(_target->name)); - if (who != 1) - { - myClone = NEW MTGCardInstance(clone, source->controller()->game); - } - if (who == 1) - { - myClone = NEW MTGCardInstance(clone, source->controller()->opponent()->game); - } - if (who != 1) - source->controller()->game->temp->addCard(myClone); - else - source->controller()->opponent()->game->temp->addCard(myClone); - Spell * spell = NEW Spell(myClone); - spell->resolve(); - spell->source->isToken = 1; - spell->source->fresh = 1; - if(_target->isToken) - { - spell->source->power = _target->origpower; - spell->source->toughness = _target->origtoughness; - spell->source->life = _target->origtoughness; - } - list::iterator it; - for (it = awith.begin(); it != awith.end(); it++) - { - spell->source->basicAbilities[*it] = 1; - } - for (it = colors.begin(); it != colors.end(); it++) - { - spell->source->setColor(*it); - } - delete spell; - return 1; + spell->source->power = _target->origpower; + spell->source->toughness = _target->origtoughness; + spell->source->life = _target->origtoughness; } - return 0; + list::iterator it; + for (it = awith.begin(); it != awith.end(); it++) + { + spell->source->basicAbilities[*it] = 1; + } + for (it = colors.begin(); it != colors.end(); it++) + { + spell->source->setColor(*it); + } + delete spell; + return 1; + } const char * AACloner::getMenuText() @@ -1672,36 +1624,28 @@ ACastRestriction::ACastRestriction(int _id, MTGCardInstance * card, Targetable * int ACastRestriction::addToGame() { Targetable * _target = getTarget(); + targetPlayer = getPlayerFromTarget(_target); + if (!targetPlayer) + return 0; - if (_target) + if (modifyExisting) { - if (_target->typeAsTarget() == TARGET_CARD) - { - targetPlayer = ((MTGCardInstance *) _target)->controller(); - } - else - { - targetPlayer = (Player *) _target; - } - if (modifyExisting) - { - //For now the only modifying rule is the one for lands, so this is hardcoded here. - //This means that a modifying rule for anything lands will actually modify the lands rule. - //In the future, we need a way to "identify" rules that modify an existing restriction, probably by doing a comparison of the TargetChoosers - existingRestriction = targetPlayer->game->playRestrictions->getMaxPerTurnRestrictionByTargetChooser(restrictionsScope); - if(existingRestriction && existingRestriction->maxPerTurn != MaxPerTurnRestriction::NO_MAX) - existingRestriction->maxPerTurn += value->getValue(); - } - else - { - TargetChooser * _tc = restrictionsScope->clone(); - existingRestriction = NEW MaxPerTurnRestriction(_tc, value->getValue(), MTGGameZone::intToZone(zoneId, targetPlayer)); - targetPlayer->game->playRestrictions->addRestriction(existingRestriction); - - } - AbilityTP::addToGame(); + //For now the only modifying rule is the one for lands, so this is hardcoded here. + //This means that a modifying rule for anything lands will actually modify the lands rule. + //In the future, we need a way to "identify" rules that modify an existing restriction, probably by doing a comparison of the TargetChoosers + existingRestriction = targetPlayer->game->playRestrictions->getMaxPerTurnRestrictionByTargetChooser(restrictionsScope); + if(existingRestriction && existingRestriction->maxPerTurn != MaxPerTurnRestriction::NO_MAX) + existingRestriction->maxPerTurn += value->getValue(); } - return 0; + else + { + TargetChooser * _tc = restrictionsScope->clone(); + existingRestriction = NEW MaxPerTurnRestriction(_tc, value->getValue(), MTGGameZone::intToZone(zoneId, targetPlayer)); + targetPlayer->game->playRestrictions->addRestriction(existingRestriction); + + } + AbilityTP::addToGame(); + return 1; } int ACastRestriction::destroy() @@ -1939,19 +1883,9 @@ AARandomDiscarder::AARandomDiscarder(int _id, MTGCardInstance * card, Targetable int AARandomDiscarder::resolve() { Targetable * _target = getTarget(); - Player * player; - if (_target) + Player * player = getPlayerFromTarget(_target); + if (player) { - if (_target->typeAsTarget() == TARGET_CARD) - { - player = ((MTGCardInstance *) _target)->controller(); - } - else - { - player = (Player *) _target; - } - - WParsedInt numCards(nbcardsStr, NULL, source); for (int i = 0; i < numCards.intValue; i++) { @@ -1980,18 +1914,9 @@ AAShuffle::AAShuffle(int _id, MTGCardInstance * card, Targetable * _target, Mana int AAShuffle::resolve() { - Targetable * _target = getTarget(); - Player * player; - if (_target) + Player * player = getPlayerFromTarget(getTarget()); + if (player) { - if (_target->typeAsTarget() == TARGET_CARD) - { - player = ((MTGCardInstance *) _target)->controller(); - } - else - { - player = (Player *) _target; - } MTGLibrary * library = player->game->library; library->shuffle(); } @@ -2027,18 +1952,9 @@ AARemoveMana::AARemoveMana(int _id, MTGCardInstance * card, Targetable * _target int AARemoveMana::resolve() { - Targetable * _target = getTarget(); - Player * player; - if (_target) + Player * player = getPlayerFromTarget(getTarget()); + if (player) { - if (_target->typeAsTarget() == TARGET_CARD) - { - player = ((MTGCardInstance *) _target)->controller(); - } - else - { - player = (Player *) _target; - } ManaPool * manaPool = player->getManaPool(); if (mRemoveAll) { @@ -2171,40 +2087,45 @@ AAWinGame::AAWinGame(int _id, MTGCardInstance * card, Targetable * _target, Mana int AAWinGame::resolve() { - Damageable * _target = (Damageable *) getTarget(); - if (_target) - { - if (_target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) - { - _target = ((MTGCardInstance *) _target)->controller(); - } - int cantlosers = 0; - MTGGameZone * z = ((Player *) _target)->opponent()->game->inPlay; - int nbcards = z->nb_cards; + Player * p = getPlayerFromDamageable((Damageable *) getTarget()); + if (!p) + return 0; - for (int i = 0; i < nbcards; i++) + bool canwin = true; + + MTGGameZone * z = p->opponent()->game->inPlay; + int nbcards = z->nb_cards; + + for (int i = 0; i < nbcards; i++) + { + MTGCardInstance * c = z->cards[i]; + if (c->has(Constants::CANTLOSE)) { - MTGCardInstance * c = z->cards[i]; - if (c->has(Constants::CANTLOSE)) - { - cantlosers++; - } + canwin = false; + break; } - MTGGameZone * k = ((Player *) _target)->game->inPlay; + } + + if (canwin) + { + MTGGameZone * k = p->game->inPlay; int onbcards = k->nb_cards; for (int m = 0; m < onbcards; ++m) { MTGCardInstance * e = k->cards[m]; if (e->has(Constants::CANTWIN)) { - cantlosers++; + canwin = false; + break; } } - if (cantlosers < 1) - { - game->gameOver = ((Player *) _target)->opponent(); - } } + + if (canwin) + { + game->gameOver = p->opponent(); + } + return 1; } @@ -2499,8 +2420,7 @@ int MultiAbility::Add(MTGAbility * ability) int MultiAbility::resolve() { Targetable * Phaseactiontarget = NULL; - vector::size_type sz = abilities.size(); - for (unsigned int i = 0; i < sz; i++) + for (size_t i = 0; i < abilities.size(); ++i) { if (abilities[i] == NULL) continue; @@ -2521,7 +2441,7 @@ int MultiAbility::resolve() int MultiAbility::addToGame() { - for (unsigned int i = 0; i < abilities.size(); i++) + for (size_t i = 0; i < abilities.size(); ++i) { if (abilities[i] == NULL) continue; @@ -2557,8 +2477,7 @@ MultiAbility * MultiAbility::clone() const { MultiAbility * a = NEW MultiAbility(*this); a->abilities.clear(); - vector::size_type sz = abilities.size(); - for (size_t i = 0; i < sz; i++) + for (size_t i = 0; i < abilities.size(); ++i) { a->abilities.push_back(abilities[i]->clone()); } @@ -2567,9 +2486,7 @@ MultiAbility * MultiAbility::clone() const MultiAbility::~MultiAbility() { - - vector::size_type sz = abilities.size(); - for (size_t i = 0; i < sz; i++) + for (size_t i = 0; i < abilities.size(); ++i) { SAFE_DELETE(abilities[i]); } @@ -2617,9 +2534,8 @@ int GenericTargetAbility::isReactingToClick(MTGCardInstance * card, ManaCost * m limitPerTurn = 0; if(limit.size()) { - WParsedInt * value = NEW WParsedInt(limit.c_str(),NULL,source); - limitPerTurn = value->getValue(); - delete value; + WParsedInt value(limit.c_str(),NULL,source); + limitPerTurn = value.getValue(); } if (limitPerTurn && counters >= limitPerTurn) return 0; @@ -2677,7 +2593,6 @@ int AAlterCost::addToGame() if(!_target->getIncreasedManaCost()->getConvertedCost()) { ManaCost * increased = NEW ManaCost(); - increased->init(); _target->getIncreasedManaCost()->copy(increased); delete increased; @@ -2689,7 +2604,6 @@ int AAlterCost::addToGame() if(!_target->getReducedManaCost()->getConvertedCost()) { ManaCost * reduced = NEW ManaCost(); - reduced->init(); _target->getReducedManaCost()->copy(reduced); delete reduced; } @@ -3253,21 +3167,20 @@ int ALoseAbilities::destroy() MTGAbility * a = storedAbilities[i]; //OneShot abilities are not supposed to stay in the game for long. // If we copied one, something wrong probably happened - ALoseAbilities * la = dynamic_cast (a); - if (a->oneShot||la) + if (a->oneShot) { - if(la) - { - DebugTrace("Dangerous chance of infinate loop avoided!"); - continue; - } - else - { - DebugTrace("ALLABILITIES: Ability should not be one shot"); - continue; - } + DebugTrace("ALLABILITIES: Ability should not be one shot"); + continue; + } + + //Avoid inifinite loop of removing/putting back abilities + if (ALoseAbilities * la = dynamic_cast (a)) + { + DebugTrace("ALLABILITIES: loseability won't be put in the loseability list"); + continue; } - a->addToGame(); + + a->addToGame(); } storedAbilities.clear(); return 1; @@ -3928,10 +3841,10 @@ ABlinkGeneric::ABlinkGeneric(int _id, MTGCardInstance * card, MTGCardInstance * int ABlinkGeneric::resolve() { - ABlink * a = ability->clone(); - a->target = target; - a->addToGame(); - return 1; + ABlink * a = ability->clone(); + a->target = target; + a->addToGame(); + return 1; } const char * ABlinkGeneric::getMenuText() diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 4fa7ffe46..e93e6f05a 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2536,12 +2536,7 @@ int AbilityFactory::getAbilities(vector * v, Spell * spell, MTGCar MTGCardInstance * target = card->target; if (!target) target = card; - //card->getManaCost()->copy(card->model->data->getManaCost()); - //zeth:i added this originally for no reason really, however - //i didn't realize ai runs this function about a million times during a match. - //it litterally distroys any altering cost effects. - //if for some reason i added this becuase of some bug...we need to think of a more clever way - //to do this. + string magicText; if (dest) { @@ -3290,25 +3285,13 @@ void AbilityFactory::addAbilities(int _id, Spell * spell) game->addObserver(NEW AFlankerAbility(_id, card)); } - if (card->basicAbilities[(int)Constants::FORESTHOME]) + const int HomeAbilities[] = {(int)Constants::FORESTHOME, (int)Constants::ISLANDHOME, (int)Constants::MOUNTAINHOME, (int)Constants::SWAMPHOME, (int)Constants::PLAINSHOME}; + const char * HomeLands[] = {"forest", "island", "mountain", "swamp", "plains"}; + + for (int i = 0; i < sizeof(HomeAbilities)/sizeof(HomeAbilities[0]); ++i) { - game->addObserver(NEW AStrongLandLinkCreature(_id, card, "forest")); - } - if (card->basicAbilities[(int)Constants::ISLANDHOME]) - { - game->addObserver(NEW AStrongLandLinkCreature(_id, card, "island")); - } - if (card->basicAbilities[(int)Constants::MOUNTAINHOME]) - { - game->addObserver(NEW AStrongLandLinkCreature(_id, card, "mountain")); - } - if (card->basicAbilities[(int)Constants::SWAMPHOME]) - { - game->addObserver(NEW AStrongLandLinkCreature(_id, card, "swamp")); - } - if (card->basicAbilities[(int)Constants::PLAINSHOME]) - { - game->addObserver(NEW AStrongLandLinkCreature(_id, card, "plains")); + if (card->basicAbilities[HomeAbilities[i]]) + game->addObserver(NEW AStrongLandLinkCreature(_id, card, HomeLands[i])); } if(card->previous && card->previous->previous && card->previous->previous->suspended) @@ -3340,39 +3323,19 @@ void AbilityFactory::addAbilities(int _id, Spell * spell) MTGAbility * AbilityFactory::getManaReduxAbility(string s, int id, Spell *spell, MTGCardInstance *card, MTGCardInstance *target) { int color = -1; - string manaCost; - size_t endIndex = manaCost.find(")"); - if (s.find(Constants::kManaColorless) != string::npos) + string manaCost = s.substr(s.find(",") + 1); + + const string ColorStrings[] = { Constants::kManaColorless, Constants::kManaGreen, Constants::kManaBlue, Constants::kManaRed, Constants::kManaBlack, Constants::kManaWhite }; + + for (int i = 0; i < sizeof(ColorStrings)/sizeof(ColorStrings[0]); ++i) { - manaCost = s.substr(s.find(",") + 1, endIndex); - color = Constants::MTG_COLOR_ARTIFACT; + if (s.find(ColorStrings[i]) != string::npos) + { + color = i; + break; + } } - else if (s.find(Constants::kManaGreen) != string::npos) - { - manaCost = s.substr(s.find(",") + 1, endIndex); - color = Constants::MTG_COLOR_GREEN; - } - else if (s.find(Constants::kManaBlue) != string::npos) - { - manaCost = s.substr(s.find(",") + 1, endIndex); - color = Constants::MTG_COLOR_BLUE; - } - else if (s.find(Constants::kManaRed) != string::npos) - { - manaCost = s.substr(s.find(",") + 1, endIndex); - color = Constants::MTG_COLOR_RED; - } - else if (s.find(Constants::kManaBlack) != string::npos) - { - manaCost = s.substr(s.find(",") + 1, endIndex); - color = Constants::MTG_COLOR_BLACK; - } - else if (s.find(Constants::kManaWhite) != string::npos) - { - manaCost = s.substr(s.find(",") + 1, endIndex); - color = Constants::MTG_COLOR_WHITE; - } - else + if (color == -1) { DebugTrace("An error has happened in creating a Mana Redux Ability! " << s ); return NULL; @@ -3518,6 +3481,30 @@ ostream& MTGAbility::toString(ostream& out) const << " ; mCost : " << mCost << " ; target : " << target << " ; aType : " << aType << " ; source : " << source; } +Player * MTGAbility::getPlayerFromTarget(Targetable * target) +{ + if (!target) + return NULL; + + if (target->typeAsTarget() == TARGET_CARD) + return ((MTGCardInstance *) target)->controller(); + + return (Player *) target; +} + +Player * MTGAbility::getPlayerFromDamageable(Damageable * target) +{ + if (!target) + return NULL; + + if (target->type_as_damageable == DAMAGEABLE_MTGCARDINSTANCE) + return ((MTGCardInstance *) target)->controller(); + + return (Player *) target; +} + +// + NestedAbility::NestedAbility(MTGAbility * _ability) { ability = _ability; @@ -4518,26 +4505,8 @@ const char * AManaProducer::getMenuText() menutext.append(","); sprintf(buffer, "%i ", value); menutext.append(buffer); - switch (i) - { - case Constants::MTG_COLOR_RED: - menutext.append(_("red")); - break; - case Constants::MTG_COLOR_BLUE: - menutext.append(_("blue")); - break; - case Constants::MTG_COLOR_GREEN: - menutext.append(_("green")); - break; - case Constants::MTG_COLOR_WHITE: - menutext.append(_("white")); - break; - case Constants::MTG_COLOR_BLACK: - menutext.append(_("black")); - break; - default: - break; - } + if (i >= Constants::MTG_COLOR_GREEN && i <= Constants::MTG_COLOR_WHITE) + menutext.append(_(Constants::MTGColorStrings[i])); alreadyHasOne = 1; } }