From 794be140cef4624873dbcbfd831ec43ffff6665b Mon Sep 17 00:00:00 2001 From: "wagic.the.homebrew" Date: Fri, 29 Jul 2011 17:43:45 +0000 Subject: [PATCH] - graphical representation of counters. see graphics/counters/quest.jpg for an example - rewrote some code dealing with text formatting for a card when rendering in text mode. I could swear my code has been reverted. If somebody has good reason to believe we should re-process the string formatting on every frame, please let me now. I believe my change can help rendering speed of text mode a lot. - counters change to vector instead of array --- .../mtg/bin/Res/graphics/counters/default.png | Bin 0 -> 8502 bytes .../mtg/bin/Res/graphics/counters/quest.png | Bin 0 -> 2313 bytes projects/mtg/include/AllAbilities.h | 2 +- projects/mtg/include/CardGui.h | 2 +- projects/mtg/include/CardPrimitive.h | 7 +- projects/mtg/include/Counters.h | 2 +- projects/mtg/src/AIPlayer.cpp | 4 +- projects/mtg/src/AllAbilities.cpp | 5 +- projects/mtg/src/CardGui.cpp | 152 ++++++++++++------ projects/mtg/src/CardPrimitive.cpp | 28 +++- projects/mtg/src/Counters.cpp | 2 +- projects/mtg/src/MTGCardInstance.cpp | 2 +- projects/mtg/src/MTGDeck.cpp | 1 - projects/mtg/template.vcxproj.filters | 12 +- 14 files changed, 149 insertions(+), 70 deletions(-) create mode 100644 projects/mtg/bin/Res/graphics/counters/default.png create mode 100644 projects/mtg/bin/Res/graphics/counters/quest.png diff --git a/projects/mtg/bin/Res/graphics/counters/default.png b/projects/mtg/bin/Res/graphics/counters/default.png new file mode 100644 index 0000000000000000000000000000000000000000..094bc5500c470612f10acf96664d451cf006fbe0 GIT binary patch literal 8502 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 literal 0 HcmV?d00001 diff --git a/projects/mtg/bin/Res/graphics/counters/quest.png b/projects/mtg/bin/Res/graphics/counters/quest.png new file mode 100644 index 0000000000000000000000000000000000000000..78c7fdd1355169e4898ab476a5ef9ff9aab5afc8 GIT binary patch literal 2313 zcmV+k3HJ7hP)bjqb}0000PbVXQn zQ*UN;cVTj608n9RZgehAMN}YmGcGkQI5#_hT>t|=sFSGCD2OWx2=Wqjd4nKtXVso++Uz*?_eP1~euau_o4l)lnRMGomtv zM|l*FoG^bhCUUU9t-<_>D%d9ZA?6J~Ob+$M!pZ92+2_jE=LWIG&c}AwT6;Iy4KA0r zk%cv}96l%&u{%dZdxn9m7qB6P$Inv)Y)z#QluP(Ug^Y96GCd_6EtYYi)=c}2=ysT} zC(rU5jnb3*P7u7tOP)VTb1!bH8rfvks`+{>cwLQHdY?BzjTx`1FlCeyKMC;pIz(3d zV_dM$-$z-7-%p#Z>t!Bb=T?SmksqN$*+M;%r)#i2MRIv4>^0RV1R(U8ARMt=3yUp_ zciVCv?esiWETN~~icYd-XO8sE^wG*sNy#O5;WeJua>M;UXP2*zC-B&nYr?zfMr>TcQ{svUAFuuc?LSCj_#Y6qiGH)UrHjZ7*P(eS zS(`1QDpo{8lIXJNow2Gv4RZN$`c_I3LlUL)^IS#yzG2~7G+B+r=^UL?V%8WHA||R4 zBr3k>(@{uIkA5IJa?F)Av3l&wlPT%+D2dd=xr9SQ0*5VWB7BE?+;9VMk=8YXS#rGG zdhVjrircNBu9Cduw19C4TOTPl|GQ7e8G4%f0VrL_?J9}XVQZR^F4v)Ei2+5CJSwC0 ztn?lYuzm}@D+h}ug=#}XB98(aM~SSXgygVnrWU0Od8EwHz{6u$PoJ)+{vOB@Pu^$_ zMmr_p?p(=*`czdAk&lSlCBnbl09>H;8$)Gti``uIewmd#DdAj=6}$5S(7Hmz<}?Z2 z&S2=&Uf23`)%OcSb*yk^U6O$=qxvR>V;8sCWwb0eBHw0s;0AzYvUVr{HSuzB2jx$J zO^=K@{wStUGQFEq1!6`CyjJlflm|$M;;9~LE?s4d^w>+tSJQL(ObxltpWLQp%=XX? zz#dwA4Fw?m9c^8qO^2cd6uLM8nR9hWeoKSYSz0144ql$auJq|*hNz$F=_-~tUTqA- zubM2lRA(aow-Cdbu#w8@P@x3naF45f2e;AFQ|7#1-CYn;;7pW8x`R2rX5`*aoFUkj zVaDm|5tM{hTyHSpSc!}yC4rAA^`CIaFX`O3?6^8gXWx@+L>Cdy1p?4jXhb9NeS4Nf zKtzlU_Px^wU4cI8jCv zo=ZYq^u3~>`);1>4}IQ6xL(kw0--kBp4 z1yd-K1XdOI+%9K%;21QKor&_nPKsI6QVEyV2I6R`g{&7zq1iPLFb{3bFyTtW2-ncj z(-4HyRRK7^HW*up%HPd2f!Gk;wShQOWu~c#rlmsj?M% zB-Dib?x}n{pOhc7{v^rJlTyr7y?)*Vzq4%4+mdd=`lSN0=4i2klBqJ9Lq)W~H4Q~f z^g~&+i0p746)^(Ji9cAru(6G(otm0}+<6=sLESLR^7Z%--`{$9dN2T~L-EMd?*@M# z@4N+4bJJ4stFB@*B@#_NRTk`_@UUj%SgglUngQE$tSF!vpgu{W+LzEuEK2!7nXg3& zfhb$VyJ&rFq6A8ER@M(poOj@N0_fY|Lx`&u@K z6pn3a0?iP7Z~7emLB7rS*{m_jI|UK`Uosl+q%rPl;|O$8e`!hHDRRc*P#~QTPA+^4f=lBJ7nWA?wZA1FYBzV zR2vfb$29g`r+pujtR`V2+H(P6n?{o~kbE?tocfJt1Aei5?H zzwe{>LEHLJ4)LTP0!SiBDoNT&x=2otu*`m+WIss@Ne;<05(|mL!h7GLk?u)9VW3$l z+J?I5dA~D2EJP|2MytLgjNJyhm3@oo1Ny{co!{5`=LPkweQXS4v1g6w#r}1B0W{2O j!6e@fBQK!r2RZs5uIu)76H1)!00000NkvXXu0mjfLONPJ literal 0 HcmV?d00001 diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 891e84610..014c3990f 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -2484,7 +2484,7 @@ public: string sourcename = ((MTGCardInstance*)source)->name; tokenText.append(") source: "); tokenText.append( sourcename); - myToken->text = tokenText; + myToken->setText(tokenText); } setTokenOwner(); tokenReciever->game->temp->addCard(myToken); diff --git a/projects/mtg/include/CardGui.h b/projects/mtg/include/CardGui.h index 5bfbfc1c1..099b22a02 100644 --- a/projects/mtg/include/CardGui.h +++ b/projects/mtg/include/CardGui.h @@ -33,7 +33,7 @@ protected: */ static void RenderBig(MTGCard * card, const Pos& pos); - void RenderCountersBig(const Pos& pos); + static void RenderCountersBig(MTGCard * card, const Pos& pos, int drawMode = DrawMode::kNormal); static void AlternateRender(MTGCard * card, const Pos& pos); static void TinyCropRender(MTGCard * card, const Pos& pos, JQuad * quad); diff --git a/projects/mtg/include/CardPrimitive.h b/projects/mtg/include/CardPrimitive.h index eca14715e..028d0196b 100644 --- a/projects/mtg/include/CardPrimitive.h +++ b/projects/mtg/include/CardPrimitive.h @@ -26,12 +26,15 @@ class CardPrimitive : public InstanceCounter #endif { +private: + string text; + vector formattedText; + protected: string lcname; ManaCost manaCost; public: - string text; string name; int init(); @@ -67,7 +70,7 @@ public: int has(int ability); void setText(const string& value); - const string& getText(); + const vector& getFormattedText(); void addMagicText(string value); void addMagicText(string value, string zone); diff --git a/projects/mtg/include/Counters.h b/projects/mtg/include/Counters.h index a2365b3ee..a4d9b04ae 100644 --- a/projects/mtg/include/Counters.h +++ b/projects/mtg/include/Counters.h @@ -28,7 +28,7 @@ class Counters { public: int mCount; - Counter * counters[10]; + vectorcounters; MTGCardInstance * target; Counters(MTGCardInstance * _target); ~Counters(); diff --git a/projects/mtg/src/AIPlayer.cpp b/projects/mtg/src/AIPlayer.cpp index 047383398..ced1bc257 100644 --- a/projects/mtg/src/AIPlayer.cpp +++ b/projects/mtg/src/AIPlayer.cpp @@ -451,11 +451,11 @@ int AIAction::getEfficiency() efficiency = 90; } - if(_target->counters && _target->counters->counters && _target->counters->hasCounter(cc->power,cc->toughness) && _target->counters->hasCounter(cc->power,cc->toughness)->nb > 15) + if(_target->counters && _target->counters->hasCounter(cc->power,cc->toughness) && _target->counters->hasCounter(cc->power,cc->toughness)->nb > 15) { efficiency = _target->counters->hasCounter(cc->power,cc->toughness)->nb; } - if(cc->maxNb && _target->counters && _target->counters->counters && _target->counters->hasCounter(cc->power,cc->toughness)->nb >= cc->maxNb) + if(cc->maxNb && _target->counters && _target->counters->hasCounter(cc->power,cc->toughness)->nb >= cc->maxNb) efficiency = 0; } } diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 078de790d..aeaf43785 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2601,10 +2601,9 @@ int ATransformer::addToGame() int ATransformer::reapplyCountersBonus(MTGCardInstance * rtarget,bool powerapplied,bool toughnessapplied) { - if(!rtarget->counters) + if(!rtarget->counters || !rtarget->counters->counters.size()) return 0; - Counter * c = NULL; - c = rtarget->counters->counters[0]; + Counter * c = rtarget->counters->counters[0]; int rNewPower = 0; int rNewToughness = 0; for (int t = 0; t < rtarget->counters->mCount; t++) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index e67c3d241..88484a2fe 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -34,17 +34,6 @@ namespace return cosf(2 * M_PI * (value - 35) / 256.0f); } - void FormatText(std::string inText, std::vector& outFormattedText) - { - std::string::size_type found = inText.find_first_of("{}"); - while (found != string::npos) - { - inText[found] = '/'; - found = inText.find_first_of("{}", found + 1); - } - WFont * mFont = WResourceManager::Instance()->GetWFont(Fonts::MAGIC_FONT); - mFont->FormatText(inText, outFormattedText); - } } CardGui::CardGui(MTGCardInstance* card, float x, float y) @@ -119,10 +108,6 @@ void CardGui::Update(float dt) void CardGui::DrawCard(const Pos& inPosition, int inMode) { DrawCard(card, inPosition, inMode); - if (inMode != DrawMode::kHidden) - { - RenderCountersBig(inPosition); - } } void CardGui::DrawCard(MTGCard* inCard, const Pos& inPosition, int inMode) @@ -253,6 +238,7 @@ void CardGui::Render() mFont->SetScale(1); } } + if (tc && !tc->canTarget(card)) { if (!shadow) @@ -394,8 +380,7 @@ void CardGui::AlternateRender(MTGCard * card, const Pos& pos) { font->SetScale(kWidthScaleFactor * pos.actZ); - std::vector txt; - FormatText(card->data->getText(), txt); + std::vector txt = card->data->getFormattedText(); unsigned i = 0; unsigned h = neofont ? 14 : 11; @@ -549,6 +534,8 @@ void CardGui::AlternateRender(MTGCard * card, const Pos& pos) } font->SetScale(backup_scale); + + RenderCountersBig(card, pos, DrawMode::kText); } void CardGui::TinyCropRender(MTGCard * card, const Pos& pos, JQuad * quad) @@ -605,8 +592,7 @@ void CardGui::TinyCropRender(MTGCard * card, const Pos& pos, JQuad * quad) renderer->RenderQuad(q.get(), x, pos.actY, pos.actT, scale, scale); } - std::vector txt; - FormatText(card->data->getText(), txt); + std::vector txt = card->data->getFormattedText(); size_t nbTextLines = txt.size(); //Render the image on top of that @@ -783,6 +769,8 @@ void CardGui::TinyCropRender(MTGCard * card, const Pos& pos, JQuad * quad) } font->SetScale(backup_scale); + + RenderCountersBig(card, pos); } //Renders a big card on screen. Defaults to the "alternate" rendering if no image is found @@ -802,6 +790,7 @@ void CardGui::RenderBig(MTGCard* card, const Pos& pos) quad->SetColor(ARGB(255,255,255,255)); float scale = pos.actZ * 250.f / quad->mHeight; renderer->RenderQuad(quad.get(), x, pos.actY, pos.actT, scale, scale); + RenderCountersBig(card, pos); return; } @@ -811,47 +800,114 @@ void CardGui::RenderBig(MTGCard* card, const Pos& pos) AlternateRender(card, pos); } -void CardGui::RenderCountersBig(const Pos& pos) +void CardGui::RenderCountersBig(MTGCard * mtgcard, const Pos& pos, int drawMode) { - // Write Named Counters - if (card->counters && card->counters->mCount > 0) - { - WFont * font = WResourceManager::Instance()->GetWFont(Fonts::MAGIC_FONT); - font->SetColor(ARGB((int)pos.actA, 0, 0, 0)); - font->SetScale(kWidthScaleFactor * pos.actZ); + MTGCardInstance * card = dynamic_cast (mtgcard); + if (!card) + return; - std::vector txt; - FormatText(card->data->getText(), txt); - unsigned i = txt.size() + 1; - Counter * c = NULL; - for (int t = 0; t < card->counters->mCount; t++, i++) + if (!card->counters) + return; + if (!card->counters->mCount) + return; + + // Write Named Counters + WFont * font = WResourceManager::Instance()->GetWFont(Fonts::MAGIC_FONT); + font->SetColor(ARGB((int)pos.actA, 0, 0, 0)); + font->SetScale(kWidthScaleFactor * pos.actZ); + + unsigned i = 0; + if (drawMode == DrawMode::kText) + { + std::vector txt = card->data->getFormattedText(); + i = txt.size() + 1; + } + + for (size_t t = 0; t < card->counters->counters.size(); t++) + { + Counter * c = card->counters->counters[t]; + + if (!c || c->nb <= 0) + continue; + + char buf[512]; + bool renderText = true; + string gfx = ""; + //TODO cache the gfx fetch results? + if (c->name.size()) { - if (c) + if (c->nb < 6) //we only render a counter's specific quad if there are 5 counters of this type or less. Otherwise we will use the generic one { - c = card->counters->getNext(c); - } - else - { - c = card->counters->counters[0]; - } - if (c != NULL && c->nb > 0) - { - char buf[512]; - if (c->name != "") + string gfxRelativeName = "counters/"; + gfxRelativeName.append(c->name); + gfxRelativeName.append(".png"); + gfx = WResourceManager::Instance()->graphicsFile(gfxRelativeName); + if (fileExists(gfx.c_str())) { - std::string s = c->name; - s[0] = toupper(s[0]); - sprintf(buf, _("%s counters: %i").c_str(), s.c_str(), c->nb); + renderText = false; + } + else + { + gfx = ""; + } + } + + if (renderText) + { + std::string s = c->name; + s[0] = toupper(s[0]); + sprintf(buf, _("%s: %i").c_str(), s.c_str(), c->nb); + } + } + else + { + sprintf(buf, _("%s%i/%s%i").c_str(), ((c->power > 0) ? "+": ""), c->power * c->nb, ((c->toughness > 0) ? "+": ""),c->toughness* c->nb); + } + + if (!gfx.size()) + { + gfx = WResourceManager::Instance()->graphicsFile("counters/default.png"); + if (!fileExists(gfx.c_str())) + gfx = ""; + } + + float x = pos.actX + (22 - BigWidth / 2) * pos.actZ; + float y = pos.actY + (-BigHeight / 2 + 80 + 11 * i + 21 * t) * pos.actZ; + if (y > pos.actY + 105) + { + y = (-BigHeight / 2 + 80 + 11 * i) * pos.actZ + (y - 105 - 21); + x += (BigWidth / 2) * pos.actZ; + } + + if (gfx.size()) + { + JQuadPtr q = WResourceManager::Instance()->RetrieveTempQuad(gfx); + + if (q.get() && q->mTex) + { + float scale = 20.f / q->mHeight; + if (renderText) + { + float scaleX = (font->GetStringWidth(buf) + 20) / q->mWidth; + JRenderer::GetInstance()->RenderQuad(q.get(), x, y, 0, scaleX, scale); } else { - sprintf(buf, _("%i/%i counters: %i").c_str(), c->power, c->toughness, c->nb); + for (int j = 0; j < c->nb; ++j) + { + JRenderer::GetInstance()->RenderQuad(q.get(), x + (scale * q->mWidth * j), y, 0, scale, scale); + } } - font->DrawString(buf, pos.actX + (22 - BigWidth / 2) * pos.actZ, pos.actY + (-BigHeight / 2 + 80 + 11 * i) - * pos.actZ); } } + + if (renderText) + { + font->SetColor(ARGB(255,0,0,0)); + font->DrawString(buf, x + 5, y + 5); + } } + } MTGCardInstance* CardView::getCard() diff --git a/projects/mtg/src/CardPrimitive.cpp b/projects/mtg/src/CardPrimitive.cpp index c32e12bb0..920320ec2 100644 --- a/projects/mtg/src/CardPrimitive.cpp +++ b/projects/mtg/src/CardPrimitive.cpp @@ -246,10 +246,32 @@ void CardPrimitive::setText(const string& value) text = value; } -const string& CardPrimitive::getText() +/* This alters the card structure, but this is intentional for performance and +* space purpose: The only time we get the card text is to render it +* on the screen, in a formatted way. +* Formatting the string every frame is not efficient, especially since we always display it the same way +* Formatting all strings at startup is inefficient too. +* Instead, we format when requested, but only once, and cache the result. +* To avoid memory to blow up, in exchange of the cached result, we erase the original string +*/ +const vector& CardPrimitive::getFormattedText() { - return text; -} + if (!text.size()) + return formattedText; + + std::string::size_type found = text.find_first_of("{}"); + while (found != string::npos) + { + text[found] = '/'; + found = text.find_first_of("{}", found + 1); + } + WFont * mFont = WResourceManager::Instance()->GetWFont(Fonts::MAGIC_FONT); + mFont->FormatText(text, formattedText); + + text = ""; + + return formattedText; +}; void CardPrimitive::addMagicText(string value) { diff --git a/projects/mtg/src/Counters.cpp b/projects/mtg/src/Counters.cpp index 722bdb265..41a752c40 100644 --- a/projects/mtg/src/Counters.cpp +++ b/projects/mtg/src/Counters.cpp @@ -92,7 +92,7 @@ int Counters::addCounter(const char * _name, int _power, int _toughness) } } Counter * counter = NEW Counter(target, _name, _power, _toughness); - counters[mCount] = counter; + counters.push_back(counter); counter->added(); mCount++; return mCount; diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 48a1c1e85..43234ffaa 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -64,7 +64,7 @@ void MTGCardInstance::copy(MTGCardInstance * card) manaCost.copy(data->getManaCost()); - text = data->text; + setText(""); //The text is retrieved from the data anyways setName(data->name); power = data->power; diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp index ad0b19318..528b696fc 100644 --- a/projects/mtg/src/MTGDeck.cpp +++ b/projects/mtg/src/MTGDeck.cpp @@ -1049,7 +1049,6 @@ void MTGDeck::printDetailedDeckText(std::ofstream& file ) MTGSetInfo *setInfo = setlist.getInfo(card->setId); string setName = setInfo->id; string cardName = card->data->getName(); - string description = card->data->getText(); currentCard << "#" << nbCards << " x " << cardName << " (" << setName << "), "; diff --git a/projects/mtg/template.vcxproj.filters b/projects/mtg/template.vcxproj.filters index 84cb0a519..b1c074b11 100644 --- a/projects/mtg/template.vcxproj.filters +++ b/projects/mtg/template.vcxproj.filters @@ -289,12 +289,6 @@ src - - inc - - - inc - src @@ -313,6 +307,12 @@ src + + src + + + src +