diff --git a/projects/mtg/bin/Res/rules/modrules.xml b/projects/mtg/bin/Res/rules/modrules.xml index f54a67aa9..67f09a49f 100644 --- a/projects/mtg/bin/Res/rules/modrules.xml +++ b/projects/mtg/bin/Res/rules/modrules.xml @@ -25,19 +25,61 @@ - - - - - - + + + + + + + + + power/life + creature + + + + + + + + + + expansion rarity + + + + expansion rarity + + [black;green;blue] + - - - - - - + + + + + + + + + power/life + creature + + + + + + + + + + expansion rarity + + + + expansion rarity + + [black;green;blue] + diff --git a/projects/mtg/include/CardGui.h b/projects/mtg/include/CardGui.h index 6692b3595..4100ec35f 100644 --- a/projects/mtg/include/CardGui.h +++ b/projects/mtg/include/CardGui.h @@ -39,6 +39,7 @@ protected: static void AlternateRender(MTGCard * card, const Pos& pos); static void TinyCropRender(MTGCard * card, const Pos& pos, JQuad * quad); static string FormattedData (string data, string replace, string value); + static bool FilterCard (MTGCard * card,string filter); public: static const float Width; diff --git a/projects/mtg/include/ManaCost.h b/projects/mtg/include/ManaCost.h index ab5dea2d0..ae8b93820 100644 --- a/projects/mtg/include/ManaCost.h +++ b/projects/mtg/include/ManaCost.h @@ -83,6 +83,7 @@ public: int isExtraPaymentSet(); int canPayExtra(); int doPayExtra(); + ExtraCost * getExtraCost(unsigned int i); int addHybrid(int c1, int v1, int c2, int v2); int tryToPayHybrids(std::vector& _hybrids, int _nbhybrids,std::vector& diff); diff --git a/projects/mtg/include/ModRules.h b/projects/mtg/include/ModRules.h index 1cbfb3871..fac6db85e 100644 --- a/projects/mtg/include/ModRules.h +++ b/projects/mtg/include/ModRules.h @@ -104,10 +104,18 @@ public: string mName; int mPosX; int mPosY; - string mType; + string mFilter; string mFormattedData; - - ModRulesRenderCardGuiItem(string Name, string PosX, string PosY, string FormattedData, string Type); + int mFontSize; + bool mFont; + PIXEL_TYPE mFontColor; + /*Icons attributes*/ + int mSizeIcon; + int mIconPosX; + int mIconPosY; + string mFileName; + ModRulesRenderCardGuiItem(string name, int posX, int posY, string formattedData, string filter, bool font, int fontSize, PIXEL_TYPE fontColor, int SizeIcon,int IconPosX,int IconPosY,string FileName); + }; class ModRulesCardGui diff --git a/projects/mtg/src/CardDescriptor.cpp b/projects/mtg/src/CardDescriptor.cpp index 367f6bece..995ff79b4 100644 --- a/projects/mtg/src/CardDescriptor.cpp +++ b/projects/mtg/src/CardDescriptor.cpp @@ -225,6 +225,8 @@ MTGCardInstance * CardDescriptor::match(MTGCardInstance * card) { match = NULL; } + if(CDopponentDamaged == -1 || CDopponentDamaged == 1) + { Player * p = card->controller()->opponent();//controller()->opponent(); if ((CDopponentDamaged == -1 && card->damageToOpponent && card->controller() == p) || (CDopponentDamaged == 1 && !card->damageToOpponent && card->controller() == p) || (CDopponentDamaged == -1 && card->damageToController && card->controller() == p->opponent()) || (CDopponentDamaged == 1 && !card->damageToController && card->controller() == p->opponent())) @@ -236,6 +238,7 @@ MTGCardInstance * CardDescriptor::match(MTGCardInstance * card) { match = NULL; } + } if ((isToken == -1 && card->isToken) || (isToken == 1 && !card->isToken)) { match = NULL; diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 6b326113c..2b76d977f 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -8,6 +8,7 @@ #include "JGE.h" #include "CardGui.h" #include "ManaCostHybrid.h" +#include "ExtraCost.h" #include "Subtypes.h" #include "Translate.h" #include "MTGDefinitions.h" @@ -15,6 +16,7 @@ #include #include "Counters.h" #include "ModRules.h" +#include "CardDescriptor.h" const float CardGui::Width = 28.0; const float CardGui::Height = 40.0; @@ -412,31 +414,29 @@ void CardGui::AlternateRender(MTGCard * card, const Pos& pos) float backup_scale = font->GetScale(); font->SetColor(ARGB((int)pos.actA, 0, 0, 0)); string sFormattedData = ""; + for( size_t i =0 ; i < Carditems.size(); i ++) { ModRulesRenderCardGuiItem * Carditem = Carditems[i]; - if (Carditem->mType.length() == 0 || card->data->hasType(Carditem->mType.c_str())) + if (Carditem->mFilter.length() == 0 || FilterCard(card,Carditem->mFilter.c_str())) { - if (Carditem->mName == "title") + if (Carditem->mFont) { - // Write the title - - font->SetScale(kWidthScaleFactor * pos.actZ); - - char name[4096]; - sprintf(name, FormattedData(Carditem->mFormattedData,"title","%s").c_str(), _(card->data->getName()).c_str()); - float w = font->GetStringWidth(name) * kWidthScaleFactor * pos.actZ; - if (w > BigWidth - 30) - font->SetScale((BigWidth - 30) / w); - font->DrawString(name, x + (Carditem->mPosX - BigWidth / 2) * pos.actZ, pos.actY + (Carditem->mPosY - BigHeight / 2) * pos.actZ); + font->SetColor(Carditem->mFontColor); + font->SetScale(((float)Carditem->mFontSize / 100) * pos.actZ); } - else if (Carditem->mName == "description") + else { - // Write the description + font->SetColor(ARGB((int)pos.actA, 0, 0, 0)); font->SetScale(kWidthScaleFactor * pos.actZ); + } + + if (Carditem->mName == "description") + { + std::vector txt = card->data->getFormattedText(); unsigned i = 0; @@ -444,36 +444,39 @@ void CardGui::AlternateRender(MTGCard * card, const Pos& pos) for (std::vector::const_iterator it = txt.begin(); it != txt.end(); ++it, ++i) font->DrawString(it->c_str(), x + (Carditem->mPosX - BigWidth / 2) * pos.actZ, pos.actY + (-BigHeight / 2 + Carditem->mPosY + h * i) * pos.actZ); } - else if (Carditem->mName == "power") - { - // Write the strength - char buffer[32]; - sprintf(buffer, FormattedData(Carditem->mFormattedData,"power","%i").c_str(), card->data->power); - float w = font->GetStringWidth(buffer) * kWidthScaleFactor; - font->DrawString(buffer, x + (Carditem->mPosX - w / 2) * pos.actZ, pos.actY + (Carditem->mPosY) * pos.actZ); - - } - else if (Carditem->mName == "life") - { - // Write the strength - if (card->data->hasType(Carditem->mType.c_str())) - { - char buffer[32]; - sprintf(buffer, FormattedData(Carditem->mFormattedData,"life","%i").c_str(), card->data->toughness); - float w = font->GetStringWidth(buffer) * kWidthScaleFactor; - font->DrawString(buffer, x + (Carditem->mPosX - w / 2) * pos.actZ, pos.actY + (Carditem->mPosY) * pos.actZ); - } - } else if (Carditem->mName == "mana") { // Mana + // Need Create a realy generic struct for mana render ManaCost* manacost = card->data->getManaCost(); ManaCostHybrid* h; + ExtraCost* e; unsigned int j = 0; + unsigned int z = 0; unsigned char t = (JGE::GetInstance()->GetTime() / 3) & 0xFF; unsigned char v = t + 127; float yOffset = (float)Carditem->mPosY; - while ((h = manacost->getHybridCost(j))) + + JQuadPtr quad = WResourceManager::Instance()->RetrieveQuad("menuicons.png", 0, 0, 0, 0, "", RETRIEVE_NORMAL, TEXTURE_SUB_5551, 1); + if (quad.get()) + if (quad->mHeight >= 78) + while ((e = manacost->getExtraCost(z))) + { + if(e->mCostRenderString == "Phyrexian Mana") + { + float _color = (float)card->data->getColor() -1; + JQuadPtr ExtraManas = WResourceManager::Instance()->RetrieveQuad("menuicons.png", 2 + _color * 36, 76, 32, 32, "c_extra", RETRIEVE_MANAGE); + ExtraManas->SetHotSpot(16, 16); + renderer->RenderQuad(ExtraManas.get(), x + (-12 * j + Carditem->mPosX) * pos.actZ, pos.actY + (yOffset) * pos.actZ, 0, 0.4f + * pos.actZ, 0.4f * pos.actZ); + } + + ++j; + ++z; + } + + z=0; + while ((h = manacost->getHybridCost(z))) { float scale = pos.actZ * 0.05f * cosf(2 * M_PI * ((float) t) / 256.0f); @@ -496,6 +499,7 @@ void CardGui::AlternateRender(MTGCard * card, const Pos& pos) + scale); } ++j; + ++z; } for (int i = Constants::NB_Colors - 2; i >= 1; --i) { @@ -531,90 +535,19 @@ void CardGui::AlternateRender(MTGCard * card, const Pos& pos) } } - else if (Carditem->mName == "types") + else if (Carditem->mName == "icon") { - //types - string s = ""; - for (int i = card->data->types.size() - 1; i > 0; --i) - { - if (card->data->basicAbilities[(int)Constants::CHANGELING]) - {// this avoids drawing the list of subtypes on changeling cards. - s += _("Shapeshifter - "); - break; - } - else - { - s += _(MTGAllCards::findType(card->data->types[i])); - s += _(" - "); - } - } - if (card->data->types.size()) - s += _(MTGAllCards::findType(card->data->types[0])); - else - { - DebugTrace("Typeless card: " << setlist[card->setId].c_str() << card->data->getName() << card->getId()); - } - - font->DrawString(s.c_str(), x + (Carditem->mPosX - BigWidth / 2)*pos.actZ, pos.actY + (Carditem->mPosY - BigHeight / 2)*pos.actZ); - - } - else if (Carditem->mName == "rarity") - { - font->SetColor(ARGB((int)pos.actA, 0, 0, 0)); - - string sRarity; - switch(card->getRarity()) - { - case Constants::RARITY_M: - sRarity ="Mythic"; - break; - case Constants::RARITY_R: - sRarity ="Rare"; - break; - case Constants::RARITY_U: - sRarity ="Uncommon"; - break; - case Constants::RARITY_C: - sRarity ="Common"; - break; - case Constants::RARITY_L: - sRarity ="Land"; - break; - case Constants::RARITY_T: - sRarity ="Token"; - break; - default: - case Constants::RARITY_S: - sRarity ="Special"; - break; - } - - switch(card->data->getColor()) - { - case Constants::MTG_COLOR_BLACK: - case Constants::MTG_COLOR_GREEN: - case Constants::MTG_COLOR_BLUE: - case Constants::MTG_COLOR_LAND: - font->SetColor(ARGB((int)pos.actA,255,255,255)); - font->DrawString(FormattedData(Carditem->mFormattedData,"rarity",sRarity).c_str(), x + (Carditem->mPosX - BigWidth / 2)*pos.actZ, pos.actY + (BigHeight / 2 - Carditem->mPosY)*pos.actZ); - break; - default: - font->DrawString(FormattedData(Carditem->mFormattedData,"rarity",sRarity).c_str(), x + (Carditem->mPosX - BigWidth / 2)*pos.actZ, pos.actY + (BigHeight / 2 - Carditem->mPosY)*pos.actZ); - break; //Leave black - } - } - else if (Carditem->mName == "expansion") - { - string formattedfield = FormattedData(Carditem->mFormattedData, "expansion", setlist[card->setId].c_str()); - float w = font->GetStringWidth(formattedfield.c_str()) * kWidthScaleFactor; - font->DrawString(formattedfield.c_str(), x + (Carditem->mPosX - w / 2) * pos.actZ, pos.actY + (Carditem->mPosY) * pos.actZ); + float yOffseticon = (float)Carditem->mPosY; + JQuadPtr ExtraIcons = WResourceManager::Instance()->RetrieveQuad(Carditem->mFileName.c_str(), 2 + (float)(Carditem->mIconPosX - 1) * 36, (float)(Carditem->mIconPosY -1) * 38 , 32, 32, "", RETRIEVE_MANAGE); + ExtraIcons->SetHotSpot(16,16); + renderer->RenderQuad(ExtraIcons.get(), x + (Carditem->mPosX) * pos.actZ, pos.actY + (yOffseticon) * pos.actZ, 0, (float)Carditem->mSizeIcon * 0.4f + * pos.actZ, (float)Carditem->mSizeIcon* 0.4f * pos.actZ); } else { string formattedfield = Carditem->mFormattedData; - - size_t found = Carditem->mName.find("title"); + size_t found = Carditem->mName.find("title"); // Write the title if (found != string::npos) { stringstream st; @@ -623,14 +556,14 @@ void CardGui::AlternateRender(MTGCard * card, const Pos& pos) } - found = Carditem->mName.find("power"); + found = Carditem->mName.find("power"); // Write the strength if (found != string::npos) { stringstream st; st << card->data->power; formattedfield = FormattedData(formattedfield, "power", st.str()); } - found = Carditem->mName.find("life"); + found = Carditem->mName.find("life"); // Write the toughness if (found != string::npos) { stringstream st; @@ -639,6 +572,33 @@ void CardGui::AlternateRender(MTGCard * card, const Pos& pos) } + found = Carditem->mName.find("types"); //types + if (found != string::npos) + { + string s = ""; + for (int i = card->data->types.size() - 1; i > 0; --i) + { + if (card->data->basicAbilities[(int)Constants::CHANGELING]) + {// this avoids drawing the list of subtypes on changeling cards. + s += _("Shapeshifter - "); + break; + } + else + { + s += _(MTGAllCards::findType(card->data->types[i])); + s += _(" - "); + } + } + if (card->data->types.size()) + s += _(MTGAllCards::findType(card->data->types[0])); + else + { + DebugTrace("Typeless card: " << setlist[card->setId].c_str() << card->data->getName() << card->getId()); + } + + formattedfield = FormattedData(formattedfield, "types", s); + } + found = Carditem->mName.find("rarity"); if (found != string::npos) { @@ -678,9 +638,16 @@ void CardGui::AlternateRender(MTGCard * card, const Pos& pos) formattedfield = FormattedData(formattedfield, "expansion", setlist[card->setId].c_str()); } - font->DrawString(formattedfield.c_str(), x + (Carditem->mPosX - BigWidth / 2) * pos.actZ, pos.actY + (Carditem->mPosY) * pos.actZ); + if (!Carditem->mFont) + { + float w = font->GetStringWidth(formattedfield.c_str()) * kWidthScaleFactor * pos.actZ; + if (w > BigWidth - 30) + font->SetScale((BigWidth - 30) / w); + } + font->DrawString(formattedfield.c_str(), x + (Carditem->mPosX - BigWidth / 2) * pos.actZ, pos.actY + (Carditem->mPosY - BigHeight / 2) * pos.actZ); } + } } @@ -749,28 +716,26 @@ void CardGui::TinyCropRender(MTGCard * card, const Pos& pos, JQuad * quad) for( size_t i =0 ; i < Carditems.size(); i ++) { ModRulesRenderCardGuiItem * Carditem = Carditems[i]; - if (Carditem->mType.length() == 0 || card->data->hasType(Carditem->mType.c_str())) + if (Carditem->mFilter.length() == 0 || FilterCard(card,Carditem->mFilter.c_str())) { - if (Carditem->mName == "title") + if (Carditem->mFont) + { + font->SetColor(Carditem->mFontColor); + font->SetScale(((float)Carditem->mFontSize / 100) * pos.actZ); + + } + else { - // Write the title font->SetColor(ARGB((int)pos.actA, 0, 0, 0)); font->SetScale(kWidthScaleFactor * pos.actZ); - char name[4096]; - sprintf(name, FormattedData(Carditem->mFormattedData,"title","%s").c_str(), _(card->data->getName()).c_str()); - float w = font->GetStringWidth(name) * kWidthScaleFactor * pos.actZ; - if (w > BigWidth - 30) - font->SetScale((BigWidth - 30) / w); - font->DrawString(name, x + (Carditem->mPosX - BigWidth / 2) * pos.actZ, pos.actY + (Carditem->mPosY - BigHeight / 2) * pos.actZ); - } - else if (Carditem->mName == "description") + + if (Carditem->mName == "description") { - // Write the description - font->SetScale(kWidthScaleFactor * pos.actZ); + std::vector txt = card->data->getFormattedText(); float imgBottom = imgY + (imgScale * quad->mHeight / 2); unsigned i = 0; @@ -778,36 +743,39 @@ void CardGui::TinyCropRender(MTGCard * card, const Pos& pos, JQuad * quad) for (std::vector::const_iterator it = txt.begin(); it != txt.end(); ++it, ++i) font->DrawString(it->c_str(), x + (Carditem->mPosX - BigWidth / 2) * pos.actZ, imgBottom + (Carditem->mPosY + h * i) * pos.actZ); } - else if (Carditem->mName == "power") - { - // Write the strength - char buffer[32]; - sprintf(buffer, FormattedData(Carditem->mFormattedData,"power","%s").c_str(), card->data->power); - float w = font->GetStringWidth(buffer) * kWidthScaleFactor; - font->DrawString(buffer, x + (Carditem->mPosX - w / 2) * pos.actZ, pos.actY + (Carditem->mPosY) * pos.actZ); - - } - else if (Carditem->mName == "life") - { - // Write the strength - if (card->data->hasType(Carditem->mType.c_str())) - { - char buffer[32]; - sprintf(buffer, FormattedData(Carditem->mFormattedData,"life","%s").c_str(), card->data->toughness); - float w = font->GetStringWidth(buffer) * kWidthScaleFactor; - font->DrawString(buffer, x + (Carditem->mPosX - w / 2) * pos.actZ, pos.actY + (Carditem->mPosY) * pos.actZ); - } - } else if (Carditem->mName == "mana") { // Mana + // Need Create a realy generic struct for mana render ManaCost* manacost = card->data->getManaCost(); ManaCostHybrid* h; + ExtraCost* e; unsigned int j = 0; + unsigned int z = 0; unsigned char t = (JGE::GetInstance()->GetTime() / 3) & 0xFF; unsigned char v = t + 127; float yOffset = (float)Carditem->mPosY; - while ((h = manacost->getHybridCost(j))) + + JQuadPtr quad = WResourceManager::Instance()->RetrieveQuad("menuicons.png", 0, 0, 0, 0, "", RETRIEVE_NORMAL, TEXTURE_SUB_5551, 1); + if (quad.get()) + if (quad->mHeight >= 78) + while ((e = manacost->getExtraCost(z))) + { + if(e->mCostRenderString == "Phyrexian Mana") + { + float _color = (float)card->data->getColor() -1; + JQuadPtr ExtraManas = WResourceManager::Instance()->RetrieveQuad("menuicons.png", 2 + _color * 36, 76, 32, 32, "c_extra", RETRIEVE_MANAGE); + ExtraManas->SetHotSpot(16, 16); + renderer->RenderQuad(ExtraManas.get(), x + (-12 * j + Carditem->mPosX) * pos.actZ, pos.actY + (yOffset) * pos.actZ, 0, 0.4f + * pos.actZ, 0.4f * pos.actZ); + } + + ++j; + ++z; + } + + z=0; + while ((h = manacost->getHybridCost(z))) { float scale = pos.actZ * 0.05f * cosf(2 * M_PI * ((float) t) / 256.0f); @@ -830,15 +798,18 @@ void CardGui::TinyCropRender(MTGCard * card, const Pos& pos, JQuad * quad) + scale); } ++j; + ++z; } for (int i = Constants::NB_Colors - 2; i >= 1; --i) { - for (int cost = manacost->getCost(i); cost > 0; --cost) + int cost; + for (cost = manacost->getCost(i); cost > 0; --cost) { renderer->RenderQuad(manaIcons[i].get(), x + (-12 * j + Carditem->mPosX) * pos.actZ, pos.actY + (yOffset) * pos.actZ, 0, 0.4f * pos.actZ, 0.4f * pos.actZ); ++j; } + } // Colorless mana if (int cost = manacost->getCost(0)) @@ -863,90 +834,19 @@ void CardGui::TinyCropRender(MTGCard * card, const Pos& pos, JQuad * quad) } } - else if (Carditem->mName == "types") + else if (Carditem->mName == "icon") { - //types - string s = ""; - for (int i = card->data->types.size() - 1; i > 0; --i) - { - if (card->data->basicAbilities[(int)Constants::CHANGELING]) - {// this avoids drawing the list of subtypes on changeling cards. - s += _("Shapeshifter - "); - break; - } - else - { - s += _(MTGAllCards::findType(card->data->types[i])); - s += _(" - "); - } - } - if (card->data->types.size()) - s += _(MTGAllCards::findType(card->data->types[0])); - else - { - DebugTrace("Typeless card: " << setlist[card->setId].c_str() << card->data->getName() << card->getId()); - } - - font->DrawString(s.c_str(), x + (Carditem->mPosX - BigWidth / 2)*pos.actZ, pos.actY + (Carditem->mPosY - BigHeight / 2)*pos.actZ); - - } - else if (Carditem->mName == "rarity") - { - font->SetColor(ARGB((int)pos.actA, 0, 0, 0)); - - string sRarity; - switch(card->getRarity()) - { - case Constants::RARITY_M: - sRarity ="Mythic"; - break; - case Constants::RARITY_R: - sRarity ="Rare"; - break; - case Constants::RARITY_U: - sRarity ="Uncommon"; - break; - case Constants::RARITY_C: - sRarity ="Common"; - break; - case Constants::RARITY_L: - sRarity ="Land"; - break; - case Constants::RARITY_T: - sRarity ="Token"; - break; - default: - case Constants::RARITY_S: - sRarity ="Special"; - break; - } - - switch(card->data->getColor()) - { - case Constants::MTG_COLOR_BLACK: - case Constants::MTG_COLOR_GREEN: - case Constants::MTG_COLOR_BLUE: - case Constants::MTG_COLOR_LAND: - font->SetColor(ARGB((int)pos.actA,255,255,255)); - font->DrawString(FormattedData(Carditem->mFormattedData,"rarity",sRarity).c_str(), x + (Carditem->mPosX - BigWidth / 2)*pos.actZ, pos.actY + (BigHeight / 2 - Carditem->mPosY)*pos.actZ); - break; - default: - font->DrawString(FormattedData(Carditem->mFormattedData,"rarity",sRarity).c_str(), x + (Carditem->mPosX - BigWidth / 2)*pos.actZ, pos.actY + (BigHeight / 2 - Carditem->mPosY)*pos.actZ); - break; //Leave black - } - } - else if (Carditem->mName == "expansion") - { - string formattedfield = FormattedData(Carditem->mFormattedData, "expansion", setlist[card->setId].c_str()); - float w = font->GetStringWidth(formattedfield.c_str()) * kWidthScaleFactor; - font->DrawString(formattedfield.c_str(), x + (Carditem->mPosX - w / 2) * pos.actZ, pos.actY + (Carditem->mPosY) * pos.actZ); + float yOffseticon = (float)Carditem->mPosY; + JQuadPtr ExtraIcons = WResourceManager::Instance()->RetrieveQuad(Carditem->mFileName.c_str(), 2 + (float)(Carditem->mIconPosX - 1) * 36, (float)(Carditem->mIconPosY -1) * 38 , 32, 32, "", RETRIEVE_MANAGE); + ExtraIcons->SetHotSpot(16,16); + renderer->RenderQuad(ExtraIcons.get(), x + (Carditem->mPosX) * pos.actZ, pos.actY + (yOffseticon) * pos.actZ, 0, (float)Carditem->mSizeIcon * 0.4f + * pos.actZ, (float)Carditem->mSizeIcon* 0.4f * pos.actZ); } else { string formattedfield = Carditem->mFormattedData; - - size_t found = Carditem->mName.find("title"); + size_t found = Carditem->mName.find("title"); // Write the title if (found != string::npos) { stringstream st; @@ -955,14 +855,14 @@ void CardGui::TinyCropRender(MTGCard * card, const Pos& pos, JQuad * quad) } - found = Carditem->mName.find("power"); + found = Carditem->mName.find("power"); // Write the strength if (found != string::npos) { stringstream st; st << card->data->power; formattedfield = FormattedData(formattedfield, "power", st.str()); } - found = Carditem->mName.find("life"); + found = Carditem->mName.find("life"); // Write the toughness if (found != string::npos) { stringstream st; @@ -971,6 +871,33 @@ void CardGui::TinyCropRender(MTGCard * card, const Pos& pos, JQuad * quad) } + found = Carditem->mName.find("types"); //types + if (found != string::npos) + { + string s = ""; + for (int i = card->data->types.size() - 1; i > 0; --i) + { + if (card->data->basicAbilities[(int)Constants::CHANGELING]) + {// this avoids drawing the list of subtypes on changeling cards. + s += _("Shapeshifter - "); + break; + } + else + { + s += _(MTGAllCards::findType(card->data->types[i])); + s += _(" - "); + } + } + if (card->data->types.size()) + s += _(MTGAllCards::findType(card->data->types[0])); + else + { + DebugTrace("Typeless card: " << setlist[card->setId].c_str() << card->data->getName() << card->getId()); + } + + formattedfield = FormattedData(formattedfield, "types", s); + } + found = Carditem->mName.find("rarity"); if (found != string::npos) { @@ -1010,9 +937,16 @@ void CardGui::TinyCropRender(MTGCard * card, const Pos& pos, JQuad * quad) formattedfield = FormattedData(formattedfield, "expansion", setlist[card->setId].c_str()); } - font->DrawString(formattedfield.c_str(), x + (Carditem->mPosX - BigWidth / 2) * pos.actZ, pos.actY + (Carditem->mPosY) * pos.actZ); + if (!Carditem->mFont) + { + float w = font->GetStringWidth(formattedfield.c_str()) * kWidthScaleFactor * pos.actZ; + if (w > BigWidth - 30) + font->SetScale((BigWidth - 30) / w); + } + font->DrawString(formattedfield.c_str(), x + (Carditem->mPosX - BigWidth / 2) * pos.actZ, pos.actY + (Carditem->mPosY - BigHeight / 2) * pos.actZ); } + } } @@ -1052,6 +986,7 @@ void CardGui::RenderBig(MTGCard* card, const Pos& pos) RenderCountersBig(card, pos); return; } + //DebugTrace("Unable to fetch image: " << card->getImageName()); // If we come here, we do not have the picture. @@ -1074,6 +1009,331 @@ string CardGui::FormattedData(string data, string replace, string value) } +bool CardGui::FilterCard(MTGCard * _card,string filter) +{ + CardDescriptor cd; + MTGCardInstance * card = (MTGCardInstance*) _card->data; + cd.init(); + cd.mode = CD_OR; + while (filter.size()) + { + + string typeName; + //Advanced cards caracteristics ? + size_t found = filter.find("["); + if (found != string::npos) + { + int nbminuses = 0; + int end = filter.find("]"); + string attributes = filter.substr(found + 1, end - found - 1); + + while (attributes.size()) + { + size_t found2 = attributes.find(";"); + size_t foundAnd = attributes.find("&"); + string attribute; + if (found2 != string::npos) + { + cd.mode = CD_OR; + attribute = attributes.substr(0, found2); + attributes = attributes.substr(found2 + 1); + } + else if (foundAnd != string::npos) + { + cd.mode = CD_AND; + attribute = attributes.substr(0, foundAnd); + attributes = attributes.substr(foundAnd + 1); + } + else + { + attribute = attributes; + attributes = ""; + } + int minus = 0; + if (attribute[0] == '-') + { + minus = 1; + nbminuses++; + attribute = attribute.substr(1); + } + int comparisonMode = COMPARISON_NONE; + int comparisonCriterion = 0; + if (attribute.size() > 1) + { + size_t operatorPosition = attribute.find("=", 1); + if (operatorPosition != string::npos) + { + string numberCD = attribute.substr(operatorPosition + 1, attribute.size() - operatorPosition - 1); + + switch (attribute[operatorPosition - 1]) + { + case '<': + if (minus) + { + comparisonMode = COMPARISON_GREATER; + } + else + { + comparisonMode = COMPARISON_AT_MOST; + } + operatorPosition--; + break; + case '>': + if (minus) + { + comparisonMode = COMPARISON_LESS; + } + else + { + comparisonMode = COMPARISON_AT_LEAST; + } + operatorPosition--; + break; + default: + if (minus) + { + comparisonMode = COMPARISON_UNEQUAL; + } + else + { + comparisonMode = COMPARISON_EQUAL; + } + } + attribute = attribute.substr(0, operatorPosition); + } + } + + //Attacker + if (attribute.find("attacking") != string::npos) + { + if (minus) + { + cd.attacker = -1; + } + else + { + cd.attacker = 1; + } + } + //Blocker + else if (attribute.find("blocking") != string::npos) + { + if (minus) + { + cd.defenser = &MTGCardInstance::NoCard; + } + else + { + cd.defenser = &MTGCardInstance::AnyCard; + } + } + //Tapped, untapped + else if (attribute.find("tapped") != string::npos) + { + if (minus) + { + cd.unsecureSetTapped(-1); + } + else + { + cd.unsecureSetTapped(1); + } + //Token + } + else if (attribute.find("token") != string::npos) + { + if (minus) + { + cd.isToken = -1; + } + else + { + cd.isToken = 1; + } + //put in its zone this turn + } + else if (attribute.find("fresh") != string::npos) + { + if (minus) + { + cd.unsecuresetfresh(-1); + } + else + { + cd.unsecuresetfresh(1); + } + } + //creature is a level up creature + else if (attribute.find("leveler") != string::npos) + { + if (minus) + { + cd.isLeveler = -1; + } + else + { + cd.isLeveler = 1; + } + } + //creature is enchanted + else if (attribute.find("enchanted") != string::npos) + { + if (minus) + { + cd.CDenchanted = -1; + } + else + { + cd.CDenchanted = 1; + } + } + //creature was damaged + else if (attribute.find("damaged") != string::npos) + { + if (minus) + { + cd.CDdamaged = -1; + } + else + { + cd.CDdamaged = 1; + } + } + //creature dealt damage to opponent + else if (attribute.find("opponentdamager") != string::npos) + { + if (minus) + { + cd.CDopponentDamaged = -1; + } + else + { + cd.CDopponentDamaged = 1; + } + } + //creature dealt damage to controller + else if (attribute.find("controllerdamager") != string::npos) + { + if (minus) + { + cd.CDcontrollerDamaged = -1; + } + else + { + cd.CDcontrollerDamaged = 1; + } + } + else if (attribute.find("multicolor") != string::npos) + { + //card is multicolored? + if (minus) + { + cd.setisMultiColored(-1); + } + else + { + cd.setisMultiColored(1); + } + + } + else if (attribute.find("power") != string::npos) + { + //Power restrictions + cd.setPower(comparisonCriterion); + cd.powerComparisonMode = comparisonMode; + //Toughness restrictions + } + else if (attribute.find("toughness") != string::npos) + { + cd.setToughness(comparisonCriterion); + cd.toughnessComparisonMode = comparisonMode; + //Manacost restrictions + } + else if (attribute.find("manacost") != string::npos) + { + cd.convertedManacost = comparisonCriterion; + cd.manacostComparisonMode = comparisonMode; + //Counter Restrictions + } + + else + { + int attributefound = 0; + ////Colors - remove Artifact and Land from the loop + + for (int cid = 1; cid < Constants::NB_Colors - 1; cid++) + { + if (attribute.find(Constants::MTGColorStrings[cid]) != string::npos) + { + attributefound = 1; + if (minus) + cd.SetExclusionColor(cid); + else + cd.setColor(cid); + } + } + if (!attributefound) + { + //Abilities + for (int j = 0; j < Constants::NB_BASIC_ABILITIES; j++) + { + if (attribute.find(Constants::MTGBasicAbilities[j]) != string::npos) + { + attributefound = 1; + if (minus) + cd.mAbilityExclusions.set(j); + else + cd.basicAbilities.set(j); + } + } + } + + if (!attributefound) + { + //Subtypes + if (minus) + { + cd.setNegativeSubtype(attribute); + } + else + { + cd.setSubtype(attribute); + } + } + } + } + if (nbminuses) + cd.mode = CD_AND; + filter = filter.substr(0, found); + } + else + { + + found = filter.find(","); + + if (found != string::npos) + { + cd.mode = CD_OR; + typeName = filter.substr(0, found); + filter = filter.substr(found + 1); + } + else + { + typeName = filter; + filter = ""; + } + + cd.setSubtype(typeName); + } + + + } + if(cd.match(card)) + return TRUE; + return FALSE; + +} + void CardGui::RenderCountersBig(MTGCard * mtgcard, const Pos& pos, int drawMode) { MTGCardInstance * card = dynamic_cast (mtgcard); diff --git a/projects/mtg/src/GameStateDeckViewer.cpp b/projects/mtg/src/GameStateDeckViewer.cpp index fd1047747..3d520c81e 100644 --- a/projects/mtg/src/GameStateDeckViewer.cpp +++ b/projects/mtg/src/GameStateDeckViewer.cpp @@ -1616,7 +1616,7 @@ int GameStateDeckViewer::loadDeck(int deckid) } else { - myDeck->Remove(current); //Nope. Remove it from deck. + myDeck->Remove(current,howmanyinDeck-i); //Nope. Remove it from deck. break; } } diff --git a/projects/mtg/src/ManaCost.cpp b/projects/mtg/src/ManaCost.cpp index 57352c80f..f7f894c84 100644 --- a/projects/mtg/src/ManaCost.cpp +++ b/projects/mtg/src/ManaCost.cpp @@ -510,6 +510,17 @@ ManaCostHybrid * ManaCost::getHybridCost(unsigned int i) return &hybrids[i]; } +ExtraCost * ManaCost::getExtraCost(unsigned int i) +{ + if(extraCosts && extraCosts->costs.size()) + { + if (extraCosts->costs.size() <= i) + return NULL; + return extraCosts->costs[i]; + } + return NULL; +} + int ManaCost::hasColor(int color) { if (getCost(color)) diff --git a/projects/mtg/src/ModRules.cpp b/projects/mtg/src/ModRules.cpp index 59bc8cd13..bae9718af 100644 --- a/projects/mtg/src/ModRules.cpp +++ b/projects/mtg/src/ModRules.cpp @@ -291,17 +291,42 @@ ModRulesBackGroundCardGuiItem::ModRulesBackGroundCardGuiItem(string ColorId,stri mMenuIcon = atoi(MenuIcon.c_str()); } -ModRulesRenderCardGuiItem::ModRulesRenderCardGuiItem(string Name, string PosX, string PosY, string FormattedData, string Type) + + +ModRulesRenderCardGuiItem::ModRulesRenderCardGuiItem(string name, int posX, int posY, string formattedData, string filter, bool font, int fontSize, PIXEL_TYPE fontColor, int SizeIcon,int IconPosX,int IconPosY,string FileName) { - mName = Name; - mPosX = atoi(PosX.c_str()); - mPosY = atoi(PosY.c_str()); - mFormattedData = FormattedData; - mType = Type; + mName = name; + mPosX = posX; + mPosY = posY; + mFormattedData = formattedData; + mFilter = filter; + mFontSize = fontSize; + mFont = font; + mFontColor = fontColor; + mSizeIcon = SizeIcon; + mIconPosX = IconPosX; + mIconPosY = IconPosY; + mFileName = FileName; + } void ModRulesCardGui::parse(TiXmlElement* element) { + string _Name; + int _Posx; + int _Posy; + string _FormattedText; + string _Filter; + int _FontSize; + bool _Font; + PIXEL_TYPE _FontColor; + int _SizeIcon; + int _IconPosX; + int _IconPosY; + string _FileName; + + + TiXmlNode* mainNode = element->FirstChild("background"); if (mainNode) { for (TiXmlNode* node = mainNode->ToElement()->FirstChild("card"); node; node = node->NextSibling("card")) @@ -319,32 +344,142 @@ void ModRulesCardGui::parse(TiXmlElement* element) } mainNode = element->FirstChild("renderbig"); if (mainNode) { + TiXmlNode* ChildNode; for (TiXmlNode* node = mainNode->ToElement()->FirstChild("item"); node; node = node->NextSibling("item")) { - TiXmlElement* element = node->ToElement(); - { - renderbig.push_back(NEW ModRulesRenderCardGuiItem( - element->Attribute("name"), - element->Attribute("posx"), - element->Attribute("posy"), - element->Attribute("formattedtext"), - element->Attribute("type"))); + _Name = node->ToElement()->Attribute("name"); + _Posx = 0; + _Posy = 0; + _FormattedText = ""; + _Filter = ""; + _FontSize = 0; + _Font = FALSE; + _FontColor = NULL; + _SizeIcon = 0; + _IconPosX = 0; + _IconPosY = 0 ; + _FileName = ""; + + + TiXmlElement* ItemElement = node->ToElement(); + ChildNode = ItemElement->FirstChild("position"); + if (ChildNode) { + _Posx = atoi(ChildNode->ToElement()->Attribute("x")); + _Posy = atoi(ChildNode->ToElement()->Attribute("y")); } + ChildNode = ItemElement->FirstChild("formattedtext"); + if (ChildNode) { + _FormattedText = ChildNode->ToElement()->GetText(); + + } + ChildNode = ItemElement->FirstChild("filter"); + if (ChildNode) { + _Filter = ChildNode->ToElement()->GetText(); + + } + + ChildNode = ItemElement->FirstChild("font"); + if (ChildNode) { + _Font = TRUE; + _FontSize = atoi(ChildNode->ToElement()->Attribute("size")); + vector argb = split( ChildNode->ToElement()->Attribute("color"), ','); + _FontColor = ARGB( + atoi(argb[0].c_str()), + atoi(argb[1].c_str()), + atoi(argb[2].c_str()), + atoi(argb[3].c_str()) + ); + + } + ChildNode = ItemElement->FirstChild("iconposition"); + if (ChildNode) { + _IconPosX = atoi(ChildNode->ToElement()->Attribute("x")); + _IconPosY = atoi(ChildNode->ToElement()->Attribute("y")); + } + + ChildNode = ItemElement->FirstChild("filename"); + if (ChildNode) { + _FileName = ChildNode->ToElement()->GetText(); + + } + ChildNode = ItemElement->FirstChild("sizeicon"); + if (ChildNode) { + _SizeIcon = atoi(ChildNode->ToElement()->GetText()); + + } + + + renderbig.push_back(NEW ModRulesRenderCardGuiItem( _Name, _Posx, _Posy, _FormattedText, _Filter,_Font, _FontSize, _FontColor,_SizeIcon,_IconPosX,_IconPosY,_FileName )); } } mainNode = element->FirstChild("rendertinycrop"); if (mainNode) { + TiXmlNode* ChildNode; for (TiXmlNode* node = mainNode->ToElement()->FirstChild("item"); node; node = node->NextSibling("item")) { - TiXmlElement* element = node->ToElement(); - { - rendertinycrop.push_back(NEW ModRulesRenderCardGuiItem( - element->Attribute("name"), - element->Attribute("posx"), - element->Attribute("posy"), - element->Attribute("formattedtext"), - element->Attribute("type"))); + _Name = node->ToElement()->Attribute("name"); + _Posx = 0; + _Posy = 0; + _FormattedText = ""; + _Filter = ""; + _FontSize = 0; + _Font = FALSE; + _FontColor = NULL; + _SizeIcon = 0; + _IconPosX = 0; + _IconPosY = 0 ; + _FileName = ""; + + + TiXmlElement* ItemElement = node->ToElement(); + ChildNode = ItemElement->FirstChild("position"); + if (ChildNode) { + _Posx = atoi(ChildNode->ToElement()->Attribute("x")); + _Posy = atoi(ChildNode->ToElement()->Attribute("y")); } + ChildNode = ItemElement->FirstChild("formattedtext"); + if (ChildNode) { + _FormattedText = ChildNode->ToElement()->GetText(); + + } + ChildNode = ItemElement->FirstChild("filter"); + if (ChildNode) { + _Filter = ChildNode->ToElement()->GetText(); + + } + + ChildNode = ItemElement->FirstChild("font"); + if (ChildNode) { + _Font = TRUE; + _FontSize = atoi(ChildNode->ToElement()->Attribute("size")); + vector argb = split( ChildNode->ToElement()->Attribute("color"), ','); + _FontColor = ARGB( + atoi(argb[0].c_str()), + atoi(argb[1].c_str()), + atoi(argb[2].c_str()), + atoi(argb[3].c_str()) + ); + + } + ChildNode = ItemElement->FirstChild("iconposition"); + if (ChildNode) { + _IconPosX = atoi(ChildNode->ToElement()->Attribute("x")); + _IconPosY = atoi(ChildNode->ToElement()->Attribute("y")); + } + + ChildNode = ItemElement->FirstChild("filename"); + if (ChildNode) { + _FileName = ChildNode->ToElement()->GetText(); + + } + ChildNode = ItemElement->FirstChild("sizeicon"); + if (ChildNode) { + _SizeIcon = atoi(ChildNode->ToElement()->GetText()); + + } + + + rendertinycrop.push_back(NEW ModRulesRenderCardGuiItem( _Name, _Posx, _Posy, _FormattedText, _Filter,_Font, _FontSize, _FontColor,_SizeIcon,_IconPosX,_IconPosY,_FileName )); } } }