diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index c9d7995c2..6f3bef3b8 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -1311,12 +1311,12 @@ public: modifier : 1 to add the ability, 0 to remove it _ability : Id of the ability, as described in mtgdefinitions */ -class ABasicAbilityModifier: public MTGAbility +class ABasicAbilityModifier : public MTGAbility { public: int modifier; int ability; - int value_before_modification; + bool value_before_modification; ABasicAbilityModifier(int _id, MTGCardInstance * _source, MTGCardInstance * _target, int _ability, int _modifier = 1) : MTGAbility(_id, _source, _target), modifier(_modifier), ability(_ability) { @@ -1326,35 +1326,20 @@ public: int addToGame() { - value_before_modification = ((MTGCardInstance *) target)->basicAbilities[ability]; - if(ability != Constants::ABSORB && ability != Constants::FLANKING) - { - ((MTGCardInstance *) target)->basicAbilities[ability] = modifier; - } - else - { - ((MTGCardInstance *) target)->basicAbilities[ability] += modifier; - } + value_before_modification = ((MTGCardInstance *) target)->basicAbilities.test(ability); + + assert(modifier < 2); + ((MTGCardInstance *) target)->basicAbilities.set(ability, modifier > 0); + return MTGAbility::addToGame(); } int destroy() { - if (((MTGCardInstance *) target)->basicAbilities[ability] == modifier && (ability != Constants::ABSORB && ability != Constants::FLANKING)) - { - ((MTGCardInstance *) target)->basicAbilities[ability] = value_before_modification; - return 1; - } - else if (ability == Constants::ABSORB || ability == Constants::FLANKING) - { - ((MTGCardInstance *) target)->basicAbilities[ability] -= 1; - return 1; - } - else - { - //BUG !!! - return 0; - } + assert(modifier < 2); + ((MTGCardInstance *) target)->basicAbilities.set(ability, value_before_modification); + + return 1; } const char * getMenuText() @@ -1375,18 +1360,17 @@ public: a->isClone = 1; return a; } - }; /*Instants that modifies a basic ability until end of turn */ -class AInstantBasicAbilityModifierUntilEOT: public InstantAbility +class AInstantBasicAbilityModifierUntilEOT : public InstantAbility { public: - int stateBeforeActivation; + bool stateBeforeActivation; int ability; int value; - AInstantBasicAbilityModifierUntilEOT(int _id, MTGCardInstance * _source, MTGCardInstance * _target, int _ability, int value) : - InstantAbility(_id, _source, _target), ability(_ability), value(value) + AInstantBasicAbilityModifierUntilEOT(int _id, MTGCardInstance * _source, MTGCardInstance * _target, int _ability, int value) + : InstantAbility(_id, _source, _target), ability(_ability), value(value) { aType = MTGAbility::STANDARDABILITYGRANT; abilitygranted = ability; @@ -1395,15 +1379,10 @@ public: int addToGame() { MTGCardInstance * _target = (MTGCardInstance *) target; - stateBeforeActivation = _target->basicAbilities[ability]; - if(ability != Constants::ABSORB) - { - _target->basicAbilities[ability] = value; - } - else - { - _target->basicAbilities[ability] += value; - } + stateBeforeActivation = _target->basicAbilities.test(ability); + + assert(value < 2); + _target->basicAbilities.set(ability, value > 0); return InstantAbility::addToGame(); } @@ -1415,9 +1394,11 @@ public: int destroy() { MTGCardInstance * _target = (MTGCardInstance *) target; - if (_target) _target->basicAbilities[ability] = stateBeforeActivation; + if (_target) + _target->basicAbilities.set(ability, stateBeforeActivation); return 1; } + virtual ostream& toString(ostream& out) const { out << "ABasicAbilityModifierUntilEOT ::: stateBeforeActivation : " << stateBeforeActivation << " ability : " << ability @@ -1431,7 +1412,6 @@ public: a->isClone = 1; return a; } - }; //Alteration of Ability until of turn (Aura) diff --git a/projects/mtg/include/CardPrimitive.h b/projects/mtg/include/CardPrimitive.h index f1d418c1b..50f77f498 100644 --- a/projects/mtg/include/CardPrimitive.h +++ b/projects/mtg/include/CardPrimitive.h @@ -5,6 +5,7 @@ #include #include #include +#include #include "ManaCost.h" #include "ObjectAnalytics.h" @@ -35,7 +36,8 @@ public: int init(); uint8_t colors; - map basicAbilities; + std::bitset basicAbilities; + map magicTexts; string magicText; int alias; diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 5b03df73f..8103a03cd 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2406,17 +2406,21 @@ ATransformer::ATransformer(int id, MTGCardInstance * source, MTGCardInstance * t } } } + for (it = colors.begin(); it != colors.end(); it++) { _target->setColor(*it); } + for (it = abilities.begin(); it != abilities.end(); it++) { - _target->basicAbilities[*it]++; + _target->basicAbilities.set(*it); } + for (it = oldcolors.begin(); it != oldcolors.end(); it++) { } + if(newAbilityFound) { for (unsigned int k = 0 ; k < newAbilitiesList.size();k++) @@ -2499,18 +2503,22 @@ int ATransformer::destroy() } //iterators annoy me :/ } + for (it = colors.begin(); it != colors.end(); it++) { _target->removeColor(*it); } + for (it = abilities.begin(); it != abilities.end(); it++) { - _target->basicAbilities[*it]--; + _target->basicAbilities.reset(*it); } + for (it = oldcolors.begin(); it != oldcolors.end(); it++) { _target->setColor(*it); } + if (remove) { for (it = oldtypes.begin(); it != oldtypes.end(); it++) diff --git a/projects/mtg/src/CardDescriptor.cpp b/projects/mtg/src/CardDescriptor.cpp index 9f7917896..9700bd16f 100644 --- a/projects/mtg/src/CardDescriptor.cpp +++ b/projects/mtg/src/CardDescriptor.cpp @@ -208,13 +208,17 @@ MTGCardInstance * CardDescriptor::match(MTGCardInstance * card) } //Abilities - for (map::const_iterator it = basicAbilities.begin(); it != basicAbilities.end(); ++it) + std::bitset set = basicAbilities & card->basicAbilities; + + if (mode == CD_NOT) { - int j = it->first; - if ((basicAbilities[j] == 1 && !card->basicAbilities[j]) || (basicAbilities[j] == -1 && card->basicAbilities[j])) - { - match = NULL; - } + if (set.any()) + return NULL; + } + else + { + if (set != basicAbilities) + return NULL; } if ((tapped == -1 && card->isTapped()) || (tapped == 1 && !card->isTapped())) diff --git a/projects/mtg/src/CardPrimitive.cpp b/projects/mtg/src/CardPrimitive.cpp index e16d67307..10f77044f 100644 --- a/projects/mtg/src/CardPrimitive.cpp +++ b/projects/mtg/src/CardPrimitive.cpp @@ -77,8 +77,7 @@ CardPrimitive::CardPrimitive() CardPrimitive::CardPrimitive(CardPrimitive * source) { - for (map::const_iterator it = source->basicAbilities.begin(); it != source->basicAbilities.end(); ++it) - basicAbilities[it->first] = source->basicAbilities[it->first]; + basicAbilities = source->basicAbilities; for (size_t i = 0; i < source->types.size(); ++i) types.push_back(source->types[i]); @@ -111,7 +110,7 @@ CardPrimitive::~CardPrimitive() int CardPrimitive::init() { - basicAbilities.clear(); + basicAbilities.reset(); types.clear(); diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 6f153ee63..ebd74406a 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -3122,7 +3122,7 @@ int AbilityFactory::getAbilities(vector * v, Spell * spell, MTGCar card->types.clear(); string cre = "Creature"; card->setType(cre.c_str()); - card->basicAbilities.clear(); + card->basicAbilities.reset(); card->getManaCost()->remove(0,100); card->getManaCost()->remove(1,100); card->getManaCost()->remove(2,100); @@ -3139,11 +3139,9 @@ int AbilityFactory::getAbilities(vector * v, Spell * spell, MTGCar card->name = card->model->data->name; card->types = card->model->data->types; card->colors = card->model->data->colors; - for (map::const_iterator it = card->model->data->basicAbilities.begin(); it != card->model->data->basicAbilities.end(); ++it) - { - int i = it->first; - card->basicAbilities[i] += card->model->data->basicAbilities[i]; - } + + card->basicAbilities |= card->model->data->basicAbilities; + ManaCost * copyCost = card->model->data->getManaCost(); card->getManaCost()->copy(copyCost); magicText = card->model->data->magicText; diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 236f53544..fc3210c87 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -53,11 +53,8 @@ void MTGCardInstance::copy(MTGCardInstance * card) { MTGCard * source = card->model; CardPrimitive * data = source->data; - for (map::const_iterator it = data->basicAbilities.begin(); it != data->basicAbilities.end(); ++it) - { - int i = it->first; - basicAbilities[i] = data->basicAbilities[i]; - } + + basicAbilities = card->basicAbilities; for (size_t i = 0; i < data->types.size(); i++) { types.push_back(data->types[i]); @@ -1048,18 +1045,20 @@ JSample * MTGCardInstance::getSample() } } - for (map::const_iterator it = basicAbilities.begin(); it != basicAbilities.end(); ++it) + if (basicAbilities.any()) { - int i = it->first; - if (!basicAbilities[i]) - continue; - string type = Constants::MTGBasicAbilities[i]; - type = type + ".wav"; - js = WResourceManager::Instance()->RetrieveSample(type); - if (js) + for (size_t x = 0; x < basicAbilities.size(); ++x) { - sample = string(type); - return js; + if (!basicAbilities.test(x)) + continue; + string type = Constants::MTGBasicAbilities[x]; + type = type + ".wav"; + js = WResourceManager::Instance()->RetrieveSample(type); + if (js) + { + sample = string(type); + return js; + } } } diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp index a9e2ac9f1..2a2d23757 100644 --- a/projects/mtg/src/MTGDeck.cpp +++ b/projects/mtg/src/MTGDeck.cpp @@ -1095,9 +1095,10 @@ void MTGDeck::printDetailedDeckText(std::ofstream& file ) if ( card->data->hasRestriction ) currentCard << ", " << card->data->otherrestriction; - map::iterator abilityIter; - for ( abilityIter = card->data->basicAbilities.begin(); abilityIter != card->data->basicAbilities.end(); ++abilityIter ) - currentCard << Constants::MTGBasicAbilities[ abilityIter->first ] << "; "; + for (size_t x = 0; card->data->basicAbilities.size(); ++x) + { + currentCard << Constants::MTGBasicAbilities[x] << "; "; + } currentCard <basicAbilities[j] = -1; - } - else - { - cd->basicAbilities[j] = 1; + cd->mode = CD_NOT; } + cd->basicAbilities.set(j); } } } diff --git a/projects/mtg/src/WFilter.cpp b/projects/mtg/src/WFilter.cpp index dbb4188f1..a7f61ad42 100644 --- a/projects/mtg/src/WFilter.cpp +++ b/projects/mtg/src/WFilter.cpp @@ -404,14 +404,10 @@ WCFilterRarity::WCFilterRarity(string arg) bool WCFilterAbility::isMatch(MTGCard * c) { if (ability < 0) return false; - map::iterator it = c->data->basicAbilities.find(ability); - - if (it != c->data->basicAbilities.end()) - { - if (it->second > 0) return true; - } - return false; + + return c->data->basicAbilities.test(ability); } + WCFilterAbility::WCFilterAbility(string arg) { std::transform(arg.begin(), arg.end(), arg.begin(), ::tolower);