From c4ffc214ab93a9bc9ec988794dfc51ce626468b2 Mon Sep 17 00:00:00 2001 From: "omegablast2002@yahoo.com" Date: Sun, 30 Jan 2011 00:01:57 +0000 Subject: [PATCH] moved token creator under aequip so i can do the same fix to livingweapon as i did for new target... also refactored it a bit to remove the livingweapon and battleready copy paste code. --- projects/mtg/include/AllAbilities.h | 486 ++++++++++++++-------------- 1 file changed, 237 insertions(+), 249 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 947647d1c..368e65b7c 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -16,7 +16,6 @@ #include "GuiStatic.h" #include "GameObserver.h" #include "ThisDescriptor.h" - #include #include @@ -1283,255 +1282,7 @@ public: AAWinGame * clone() const; }; -class ATokenCreator: public ActivatedAbility -{ -public: - list abilities; - list types; - list colors; - int power, toughness; - int tokenId; - string name; - string sabilities; - string starfound; - WParsedInt * multiplier; - int who; - bool aLivingWeapon; - bool battleReady; - MTGCardInstance * myToken; - vector currentAbilities; - ATokenCreator(int _id, MTGCardInstance * _source, Targetable * _target, ManaCost * _cost, int tokenId, int _doTap,string starfound, WParsedInt * multiplier = NULL, - int who = 0,bool aLivingWeapon = false) : - ActivatedAbility(_id, _source, _cost, 0, _doTap), tokenId(tokenId), starfound(starfound),multiplier(multiplier), who(who),aLivingWeapon(aLivingWeapon) - { - if (!multiplier) this->multiplier = NEW WParsedInt(1); - MTGCard * card = GameApp::collection->getCardById(tokenId); - if (card) name = card->data->getName(); - battleReady = false; - } - ATokenCreator(int _id, MTGCardInstance * _source, Targetable * _target, ManaCost * _cost, string sname, string stypes, int _power, int _toughness, - string sabilities, int _doTap, string starfound,WParsedInt * multiplier = NULL, int who = 0,bool aLivingWeapon = false) : - ActivatedAbility(_id, _source, _cost, 0, _doTap),sabilities(sabilities),starfound(starfound), multiplier(multiplier), who(who),aLivingWeapon(aLivingWeapon) - { - power = _power; - toughness = _toughness; - name = sname; - who = who; - tokenId = 0; - aType = MTGAbility::STANDARD_TOKENCREATOR; - battleReady = false; - if (!multiplier) this->multiplier = NEW WParsedInt(1); - //TODO this is a copy/past of other code that's all around the place, everything should be in a dedicated parser class; - - for (int j = 0; j < Constants::NB_BASIC_ABILITIES; j++) - { - size_t found = sabilities.find(Constants::MTGBasicAbilities[j]); - if (found != string::npos) - { - abilities.push_back(j); - } - } - - if(sabilities.find("battleready") != string::npos) - battleReady = true; - - for (int j = 0; j < Constants::MTG_NB_COLORS; j++) - { - size_t found = sabilities.find(Constants::MTGColorStrings[j]); - if (found != string::npos) - { - colors.push_back(j); - } - } - - string s = stypes; - while (s.size()) - { - size_t found = s.find(" "); - if (found != string::npos) - { - int id = Subtypes::subtypesList->find(s.substr(0, found)); - types.push_back(id); - s = s.substr(found + 1); - } - else - { - int id = Subtypes::subtypesList->find(s); - types.push_back(id); - s = ""; - } - } - } - - int resolve() - { - if(!starfound.empty()) - { - SAFE_DELETE(multiplier); - multiplier = NEW WParsedInt(starfound, NULL, (MTGCardInstance *)source); - } - for (int i = 0; i < multiplier->getValue(); ++i) - { - //MTGCardInstance * myToken; - if (tokenId) - { - MTGCard * card = GameApp::collection->getCardById(tokenId); - myToken = NEW MTGCardInstance(card, source->controller()->game); - - } - else - { - myToken = NEW Token(name, source, power, toughness); - list::iterator it; - for (it = types.begin(); it != types.end(); it++) - { - myToken->addType(*it); - } - for (it = colors.begin(); it != colors.end(); it++) - { - myToken->setColor(*it); - } - for (it = abilities.begin(); it != abilities.end(); it++) - { - myToken->basicAbilities[*it] = 1; - } - } - string tokenText = ""; - if(sabilities.find("token(") == string::npos) - { - tokenText = "("; - size_t endAbility = sabilities.find(")"); - string words = sabilities.substr(0,endAbility); - tokenText.append(words); - string sourcename = ((MTGCardInstance*)source)->name; - tokenText.append(") source: "); - tokenText.append( sourcename); - myToken->text = tokenText; - } - if (who == 0 && who != 1 && who != 2) - { - source->controller()->game->temp->addCard(myToken); - Spell * spell = NEW Spell(myToken); - spell->resolve(); - spell->source->isToken = 1; - spell->source->fresh = 1; - if(aLivingWeapon) - { - source->target = spell->source; - source->target->equipment += 1; - AbilityFactory af; - af.getAbilities(¤tAbilities, NULL, source); - for (size_t i = 0; i < currentAbilities.size(); ++i) - { - MTGAbility * a = currentAbilities[i]; - if (a->aType == MTGAbility::STANDARD_EQUIP) continue; - if (a->aType == MTGAbility::STANDARD_TEACH) continue; - a->addToGame(); - } - } - if(battleReady) - { - spell->source->summoningSickness = 0; - spell->source->tap(); - spell->source->setAttacker(1); - } - delete spell; - } - else if (who == 1 && who != 0 && who != 2) - { - source->controller()->opponent()->game->temp->addCard(myToken); - Spell * spell = NEW Spell(myToken); - spell->resolve(); - spell->source->owner = spell->source->controller(); - spell->source->isToken = 1; - spell->source->fresh = 1; - if(aLivingWeapon) - { - source->target = spell->source; - source->target->equipment += 1; - AbilityFactory af; - af.getAbilities(¤tAbilities, NULL, source); - for (size_t i = 0; i < currentAbilities.size(); ++i) - { - MTGAbility * a = currentAbilities[i]; - if (a->aType == MTGAbility::STANDARD_EQUIP) continue; - if (a->aType == MTGAbility::STANDARD_TEACH) continue; - a->addToGame(); - } - } - if(battleReady) - { - spell->source->summoningSickness = 0; - spell->source->tap(); - spell->source->setAttacker(1); - } - delete spell; - } - else - { - ((MTGCardInstance*)target)->controller()->game->temp->addCard(myToken); - Spell * spell = NEW Spell(myToken); - spell->resolve(); - spell->source->owner = ((MTGCardInstance*)target)->controller(); - spell->source->isToken = 1; - spell->source->fresh = 1; - myToken = spell->source; - if(aLivingWeapon) - { - source->target = spell->source; - source->target->equipment += 1; - AbilityFactory af; - af.getAbilities(¤tAbilities, NULL, source); - for (size_t i = 0; i < currentAbilities.size(); ++i) - { - MTGAbility * a = currentAbilities[i]; - if (a->aType == MTGAbility::STANDARD_EQUIP) continue; - if (a->aType == MTGAbility::STANDARD_TEACH) continue; - a->addToGame(); - } - } - if(battleReady) - { - spell->source->summoningSickness = 0; - spell->source->tap(); - spell->source->setAttacker(1); - } - delete spell; - } - } - return 1; - } - - const char * getMenuText() - { - sprintf(menuText, "Create %s", name.c_str()); - return menuText; - } - - virtual ostream& toString(ostream& out) const - { - out << "ATokenCreator ::: abilities : ?" // << abilities - << " ; types : ?" // << types - << " ; colors : ?" // << colors - << " ; power : " << power << " ; toughness : " << toughness << " ; name : " << name << " ; who : " << who << " ("; - return ActivatedAbility::toString(out) << ")"; - } - - ATokenCreator * clone() const - { - ATokenCreator * a = NEW ATokenCreator(*this); - a->multiplier = NEW WParsedInt(*(multiplier)); - a->isClone = 1; - return a; - } - - ~ATokenCreator() - { - SAFE_DELETE(multiplier); - } - -}; //naming an ability line------------------------------------------------------------------------- class ANamer: public ActivatedAbility { @@ -3016,6 +2767,243 @@ public: } }; + +class ATokenCreator: public ActivatedAbility +{ +public: + list abilities; + list types; + list colors; + int power, toughness; + int tokenId; + string name; + string sabilities; + string starfound; + WParsedInt * multiplier; + int who; + bool aLivingWeapon; + bool battleReady; + MTGCardInstance * myToken; + vector currentAbilities; + ATokenCreator(int _id, MTGCardInstance * _source, Targetable * _target, ManaCost * _cost, int tokenId, int _doTap,string starfound, WParsedInt * multiplier = NULL, + int who = 0,bool aLivingWeapon = false) : + ActivatedAbility(_id, _source, _cost, 0, _doTap), tokenId(tokenId), starfound(starfound),multiplier(multiplier), who(who),aLivingWeapon(aLivingWeapon) + { + if (!multiplier) this->multiplier = NEW WParsedInt(1); + MTGCard * card = GameApp::collection->getCardById(tokenId); + if (card) name = card->data->getName(); + battleReady = false; + } + + ATokenCreator(int _id, MTGCardInstance * _source, Targetable * _target, ManaCost * _cost, string sname, string stypes, int _power, int _toughness, + string sabilities, int _doTap, string starfound,WParsedInt * multiplier = NULL, int who = 0,bool aLivingWeapon = false) : + ActivatedAbility(_id, _source, _cost, 0, _doTap),sabilities(sabilities),starfound(starfound), multiplier(multiplier), who(who),aLivingWeapon(aLivingWeapon) + { + power = _power; + toughness = _toughness; + name = sname; + who = who; + tokenId = 0; + aType = MTGAbility::STANDARD_TOKENCREATOR; + battleReady = false; + if (!multiplier) this->multiplier = NEW WParsedInt(1); + //TODO this is a copy/past of other code that's all around the place, everything should be in a dedicated parser class; + + for (int j = 0; j < Constants::NB_BASIC_ABILITIES; j++) + { + size_t found = sabilities.find(Constants::MTGBasicAbilities[j]); + if (found != string::npos) + { + abilities.push_back(j); + } + } + + if(sabilities.find("battleready") != string::npos) + battleReady = true; + + for (int j = 0; j < Constants::MTG_NB_COLORS; j++) + { + size_t found = sabilities.find(Constants::MTGColorStrings[j]); + if (found != string::npos) + { + colors.push_back(j); + } + } + + string s = stypes; + while (s.size()) + { + size_t found = s.find(" "); + if (found != string::npos) + { + int id = Subtypes::subtypesList->find(s.substr(0, found)); + types.push_back(id); + s = s.substr(found + 1); + } + else + { + int id = Subtypes::subtypesList->find(s); + types.push_back(id); + s = ""; + } + } + } + + int resolve() + { + if(!starfound.empty()) + { + SAFE_DELETE(multiplier); + multiplier = NEW WParsedInt(starfound, NULL, (MTGCardInstance *)source); + } + for (int i = 0; i < multiplier->getValue(); ++i) + { + //MTGCardInstance * myToken; + if (tokenId) + { + MTGCard * card = GameApp::collection->getCardById(tokenId); + myToken = NEW MTGCardInstance(card, source->controller()->game); + + } + else + { + myToken = NEW Token(name, source, power, toughness); + list::iterator it; + for (it = types.begin(); it != types.end(); it++) + { + myToken->addType(*it); + } + for (it = colors.begin(); it != colors.end(); it++) + { + myToken->setColor(*it); + } + for (it = abilities.begin(); it != abilities.end(); it++) + { + myToken->basicAbilities[*it] = 1; + } + } + string tokenText = ""; + if(sabilities.find("token(") == string::npos) + { + tokenText = "("; + size_t endAbility = sabilities.find(")"); + string words = sabilities.substr(0,endAbility); + tokenText.append(words); + string sourcename = ((MTGCardInstance*)source)->name; + tokenText.append(") source: "); + tokenText.append( sourcename); + myToken->text = tokenText; + } + if (who == 0 && who != 1 && who != 2) + { + source->controller()->game->temp->addCard(myToken); + Spell * spell = NEW Spell(myToken); + spell->resolve(); + spell->source->isToken = 1; + spell->source->fresh = 1; + if(aLivingWeapon) + { + livingWeaponToken(spell->source); + } + if(battleReady) + { + battleReadyToken(spell->source); + } + delete spell; + } + else if (who == 1 && who != 0 && who != 2) + { + source->controller()->opponent()->game->temp->addCard(myToken); + Spell * spell = NEW Spell(myToken); + spell->resolve(); + spell->source->owner = spell->source->controller(); + spell->source->isToken = 1; + spell->source->fresh = 1; + if(aLivingWeapon) + { + livingWeaponToken(spell->source); + } + if(battleReady) + { + battleReadyToken(spell->source); + } + delete spell; + } + else + { + ((MTGCardInstance*)target)->controller()->game->temp->addCard(myToken); + Spell * spell = NEW Spell(myToken); + spell->resolve(); + spell->source->owner = ((MTGCardInstance*)target)->controller(); + spell->source->isToken = 1; + spell->source->fresh = 1; + myToken = spell->source; + if(aLivingWeapon) + { + livingWeaponToken(spell->source); + } + if(battleReady) + { + battleReadyToken(spell->source); + } + delete spell; + } + } + return 1; + } + + void livingWeaponToken(MTGCardInstance * card) + { + GameObserver * g = g->GetInstance(); + for (int i = 1; i < g->mLayers->actionLayer()->mCount; i++) + { + MTGAbility * a = ((MTGAbility *) g->mLayers->actionLayer()->mObjects[i]); + if (a->aType == MTGAbility::STANDARD_EQUIP && a->source == source) + { + AEquip* ae = dynamic_cast(a); + ae->unequip(); + ae->equip(card); + } + } + } + + void battleReadyToken(MTGCardInstance * card) + { + card->summoningSickness = 0; + card->tap(); + card->setAttacker(1); + } + + const char * getMenuText() + { + sprintf(menuText, "Create %s", name.c_str()); + return menuText; + } + + virtual ostream& toString(ostream& out) const + { + out << "ATokenCreator ::: abilities : ?" // << abilities + << " ; types : ?" // << types + << " ; colors : ?" // << colors + << " ; power : " << power << " ; toughness : " << toughness << " ; name : " << name << " ; who : " << who << " ("; + return ActivatedAbility::toString(out) << ")"; + } + + ATokenCreator * clone() const + { + ATokenCreator * a = NEW ATokenCreator(*this); + a->multiplier = NEW WParsedInt(*(multiplier)); + a->isClone = 1; + return a; + } + + ~ATokenCreator() + { + SAFE_DELETE(multiplier); + } + +}; + //Foreach (plague rats...) class AForeach: public ListMaintainerAbility, public NestedAbility {