From 8610531bf335889b88ed4343db6010af4f325130 Mon Sep 17 00:00:00 2001 From: wrenczes Date: Thu, 28 Apr 2011 05:01:06 +0000 Subject: [PATCH] Fixes for exclusion/inclusion combinations of colors or abilities. --- projects/mtg/include/CardDescriptor.h | 6 +- projects/mtg/include/CardPrimitive.h | 5 +- projects/mtg/src/CardDescriptor.cpp | 55 ++++++++++-------- projects/mtg/src/CardGui.cpp | 14 ++--- projects/mtg/src/CardPrimitive.cpp | 80 +++++++++++++-------------- projects/mtg/src/TargetChooser.cpp | 16 +++--- 6 files changed, 94 insertions(+), 82 deletions(-) diff --git a/projects/mtg/include/CardDescriptor.h b/projects/mtg/include/CardDescriptor.h index 058e9091a..cc770016b 100644 --- a/projects/mtg/include/CardDescriptor.h +++ b/projects/mtg/include/CardDescriptor.h @@ -11,7 +11,6 @@ #define CD_OR 1 #define CD_AND 2 -#define CD_NOT 3 enum ENUM_COMPARISON_MODES { @@ -59,6 +58,11 @@ class CardDescriptor: public MTGCardInstance MTGCardInstance * match(MTGGameZone * zone); MTGCardInstance * nextmatch(MTGGameZone * zone, MTGCardInstance * previous); + void SetExclusionColor(int _color, int removeAllOthers = 0); + + uint8_t mColorExclusions; + BasicAbilitiesSet mAbilityExclusions; + int nameComparisonMode; int colorComparisonMode; string compareName; diff --git a/projects/mtg/include/CardPrimitive.h b/projects/mtg/include/CardPrimitive.h index 50f77f498..eca14715e 100644 --- a/projects/mtg/include/CardPrimitive.h +++ b/projects/mtg/include/CardPrimitive.h @@ -36,7 +36,8 @@ public: int init(); uint8_t colors; - std::bitset basicAbilities; + typedef std::bitset BasicAbilitiesSet; + BasicAbilitiesSet basicAbilities; map magicTexts; string magicText; @@ -61,6 +62,8 @@ public: bool hasColor(int inColor); int countColors(); + static uint8_t ConvertColorToBitMask(int inColor); + int has(int ability); void setText(const string& value); diff --git a/projects/mtg/src/CardDescriptor.cpp b/projects/mtg/src/CardDescriptor.cpp index 9700bd16f..a82d34ed0 100644 --- a/projects/mtg/src/CardDescriptor.cpp +++ b/projects/mtg/src/CardDescriptor.cpp @@ -4,7 +4,8 @@ #include "Subtypes.h" #include "Counters.h" -CardDescriptor::CardDescriptor() : MTGCardInstance() +CardDescriptor::CardDescriptor() + : MTGCardInstance(), mColorExclusions(0) { init(); counterName = ""; @@ -101,12 +102,6 @@ bool CardDescriptor::valueInRange(int comparisonMode, int value, int criterion) return false; } -MTGCardInstance* CardDescriptor::match_not(MTGCardInstance * card) -{ - // if we have a color match, return null - bool colorFound = (colors & card->colors) > 0; - return colorFound ? NULL : card; -} MTGCardInstance * CardDescriptor::match_or(MTGCardInstance * card) { @@ -138,10 +133,16 @@ MTGCardInstance * CardDescriptor::match_or(MTGCardInstance * card) if (colors) { found = (colors & card->colors); + if (!found) + return NULL; } - if (!found) - return NULL; + if (mColorExclusions) + { + found = mColorExclusions & card->colors; + if (found) + return NULL; + } // Quantified restrictions are always AND-ed: if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power)) @@ -178,6 +179,12 @@ MTGCardInstance * CardDescriptor::match_and(MTGCardInstance * card) if ((colors & card->colors) != colors) match = NULL; + if (mColorExclusions) + { + if ((mColorExclusions & card->colors) == mColorExclusions) + match = NULL; + } + if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power)) match = NULL; if (toughnessComparisonMode && !valueInRange(toughnessComparisonMode, card->getToughness(), toughness)) @@ -202,24 +209,16 @@ MTGCardInstance * CardDescriptor::match(MTGCardInstance * card) { match = match_or(card); } - else - { - match = match_not(card); - } //Abilities - std::bitset set = basicAbilities & card->basicAbilities; + BasicAbilitiesSet set = basicAbilities & card->basicAbilities; + if (set != basicAbilities) + return NULL; + + BasicAbilitiesSet excludedSet = mAbilityExclusions & card->basicAbilities; + if (excludedSet.any()) + return NULL; - if (mode == CD_NOT) - { - if (set.any()) - return NULL; - } - else - { - if (set != basicAbilities) - return NULL; - } if ((tapped == -1 && card->isTapped()) || (tapped == 1 && !card->isTapped())) { @@ -389,3 +388,11 @@ MTGCardInstance * CardDescriptor::nextmatch(MTGGameZone * zone, MTGCardInstance } return NULL; } + +void CardDescriptor::SetExclusionColor(int _color, int removeAllOthers) +{ + if (removeAllOthers) + mColorExclusions = 0; + + mColorExclusions |= ConvertColorToBitMask(_color); +} \ No newline at end of file diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 72b0373a2..c76697661 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -258,13 +258,13 @@ void CardGui::Render() mFont->SetScale(1); } } - if (tc && !tc->canTarget(card)) - { - if (!shadow) - shadow = WResourceManager::Instance()->GetQuad("shadow"); - shadow->SetColor(ARGB(200,255,255,255)); - renderer->RenderQuad(shadow.get(), actX, actY, actT, (28 * actZ + 1) / 16, 40 * actZ / 16); - } + //if (tc && !tc->canTarget(card)) + //{ + // if (!shadow) + // shadow = WResourceManager::Instance()->GetQuad("shadow"); + // shadow->SetColor(ARGB(200,255,255,255)); + // renderer->RenderQuad(shadow.get(), actX, actY, actT, (28 * actZ + 1) / 16, 40 * actZ / 16); + //} PlayGuiObject::Render(); } diff --git a/projects/mtg/src/CardPrimitive.cpp b/projects/mtg/src/CardPrimitive.cpp index 10f77044f..d1c188259 100644 --- a/projects/mtg/src/CardPrimitive.cpp +++ b/projects/mtg/src/CardPrimitive.cpp @@ -11,46 +11,6 @@ using std::string; namespace { - uint8_t ConvertColorToBitMask(int inColor) - { - uint8_t value = 0; - switch (inColor) - { - case Constants::MTG_COLOR_ARTIFACT: - value = kColorBitMask_Artifact; - break; - - case Constants::MTG_COLOR_GREEN: - value = kColorBitMask_Green; - break; - - case Constants::MTG_COLOR_BLUE: - value = kColorBitMask_Blue; - break; - - case Constants::MTG_COLOR_RED: - value = kColorBitMask_Red; - break; - - case Constants::MTG_COLOR_BLACK: - value = kColorBitMask_Black; - break; - - case Constants::MTG_COLOR_WHITE: - value = kColorBitMask_White; - break; - - case Constants::MTG_COLOR_LAND: - value = kColorBitMask_Land; - break; - - default: - break; - } - - return value; - } - /** ** Count the number of set bits in a given integer */ @@ -381,3 +341,43 @@ int CardPrimitive::getToughness() { return toughness; } + +uint8_t CardPrimitive::ConvertColorToBitMask(int inColor) +{ + uint8_t value = 0; + switch (inColor) + { + case Constants::MTG_COLOR_ARTIFACT: + value = kColorBitMask_Artifact; + break; + + case Constants::MTG_COLOR_GREEN: + value = kColorBitMask_Green; + break; + + case Constants::MTG_COLOR_BLUE: + value = kColorBitMask_Blue; + break; + + case Constants::MTG_COLOR_RED: + value = kColorBitMask_Red; + break; + + case Constants::MTG_COLOR_BLACK: + value = kColorBitMask_Black; + break; + + case Constants::MTG_COLOR_WHITE: + value = kColorBitMask_White; + break; + + case Constants::MTG_COLOR_LAND: + value = kColorBitMask_Land; + break; + + default: + break; + } + + return value; +} \ No newline at end of file diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index d8e2add38..18775e4c7 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -576,10 +576,9 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta { attributefound = 1; if (minus) - { - cd->mode = CD_NOT; - } - cd->setColor(cid); + cd->SetExclusionColor(cid); + else + cd->setColor(cid); } } if (!attributefound) @@ -591,10 +590,9 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta { attributefound = 1; if (minus) - { - cd->mode = CD_NOT; - } - cd->basicAbilities.set(j); + cd->mAbilityExclusions.set(j); + else + cd->basicAbilities.set(j); } } } @@ -613,7 +611,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta } } } - if (nbminuses && cd->mode != CD_NOT) + if (nbminuses) cd->mode = CD_AND; typeName = typeName.substr(0, found); }