diff --git a/client/CCreatureWindow.cpp b/client/CCreatureWindow.cpp index 872174958..16755189b 100644 --- a/client/CCreatureWindow.cpp +++ b/client/CCreatureWindow.cpp @@ -56,7 +56,7 @@ CCreatureWindow::CCreatureWindow(int Cid, int Type, int creatureCount) { OBJ_CONSTRUCTION_CAPTURING_ALL; - CStackInstance * stack = new CStackInstance(Type,creatureCount); //TODO: simplify? + CStackInstance * stack = new CStackInstance(Cid, creatureCount); //TODO: simplify? init(stack, CGI->creh->creatures[Cid], NULL); delete stack; } @@ -138,12 +138,67 @@ void CCreatureWindow::init(const CStackInstance *stack, const CBonusSystemNode * printLine(4, CGI->generaltexth->allTexts[388], c->valOfBonuses(Bonus::STACK_HEALTH), stackNode->valOfBonuses(Bonus::STACK_HEALTH)); printLine(6, CGI->generaltexth->zelp[441].first, c->valOfBonuses(Bonus::STACKS_SPEED), stackNode->valOfBonuses(Bonus::STACKS_SPEED)); - if (stack) + new CPicture(graphics->pskillsm->ourImages[4].bitmap, 335, 50, false); //exp icon - Print it always? + if (type) //not in fort window { if (STACK_EXP) { + int rank = std::min(stack->getExpRank(), 10); //hopefully nobody adds more printAtMiddle("Rank " + boost::lexical_cast(stack->getExpRank()), 436, 62, FONT_MEDIUM, tytulowy,*bitmap); printAtMiddle(boost::lexical_cast(stack->experience), 436, 82, FONT_SMALL, zwykly,*bitmap); + if (type > BATTLE) //we need it only on adv. map + { + int tier = stack->type->level; + if (!iswith(tier, 1, 7)) + tier = 0; + int number; + std::string expText = CGI->generaltexth->zcrexp[324]; + boost::replace_first (expText, "%s", c->namePl); + boost::replace_first (expText, "%s", CGI->generaltexth->zcrexp[rank]); + boost::replace_first (expText, "%i", boost::lexical_cast(rank)); + boost::replace_first (expText, "%i", boost::lexical_cast(stack->experience)); + number = CGI->creh->expRanks[tier][rank] - stack->experience; + boost::replace_first (expText, "%i", boost::lexical_cast(number)); + + number = CGI->creh->maxExpPerBattle[tier]; //percent + boost::replace_first (expText, "%i%", boost::lexical_cast(number)); + number *= CGI->creh->expRanks[tier].back() / 100; //actual amount + boost::replace_first (expText, "%i", boost::lexical_cast(number)); + + boost::replace_first (expText, "%i", boost::lexical_cast(stack->count)); //Number of Creatures in stack + + int expmin = std::max(CGI->creh->expRanks[tier][std::max(rank-1, 0)], (ui32)1); + number = (stack->count * (stack->experience - expmin)) / expmin; //Maximum New Recruits without losing current Rank + boost::replace_first (expText, "%i", boost::lexical_cast(number)); //TODO + + boost::replace_first (expText, "%.2f", boost::lexical_cast(1)); //TODO Experience Multiplier + number = CGI->creh->expAfterUpgrade; + boost::replace_first (expText, "%.2f", boost::lexical_cast(number) + "%"); //Upgrade Multiplier + + expmin = CGI->creh->expRanks[tier][9]; + int expmax = CGI->creh->expRanks[tier][10]; + number = expmax - expmin; + boost::replace_first (expText, "%i", boost::lexical_cast(number)); + number = (stack->count * (expmax - expmin)) / expmin; + boost::replace_first (expText, "%i", boost::lexical_cast(number)); + + //» S t a c k E x p e r i e n c e D e t a i l s « + // + //Creature Type ................... : %s + //Experience Rank ................. : %s (%i) + //Experience Points ............... : %i + //Experience Points to Next Rank .. : %i + //Maximum Experience per Battle ... : %i%% (%i) + //Number of Creatures in stack .... : %i + //Maximum New Recruits + // without losing current Rank .... : %i + //Experience Multiplier ........... : %.2f + //Upgrade Multiplier .............. : %.2f + //Experience after Rank 10 ........ : %i + //Maximum New Recruits to remain at + // Rank 10 if at Maximum Experience : %i + expArea = new LRClickableAreaWText(Rect(334, 49, 160, 44), "" , expText ); + } } if (STACK_ARTIFACT && type > BATTLE) diff --git a/client/CMessage.cpp b/client/CMessage.cpp index d920ef82b..127875bc2 100644 --- a/client/CMessage.cpp +++ b/client/CMessage.cpp @@ -393,7 +393,7 @@ void CMessage::drawIWindow(CInfoWindow * ret, std::string text, int player) if(dynamic_cast(ret)) //it's selection window, so we'll blit "or" between components _or = FNT_RenderText(FONT_MEDIUM,CGI->generaltexth->allTexts[4],zwykly); - const int sizes[][2] = {{400, 125}, {500, 150}, {600, 200}}; + const int sizes[][2] = {{400, 125}, {500, 150}, {600, 200}, {480, 400}}; for(int i = 0; i < ARRAY_COUNT(sizes) && sizes[i][0] < conf.cc.resx - 150 diff --git a/lib/CCreatureSet.cpp b/lib/CCreatureSet.cpp index bbf8b299c..435fc62e3 100644 --- a/lib/CCreatureSet.cpp +++ b/lib/CCreatureSet.cpp @@ -681,7 +681,7 @@ std::string CStackInstance::bonusToGraphics(Bonus *bonus) const { switch (bonus->subtype) { - case 74: //Blind + case 62: //Blind fileName = "E_SPBLIND.bmp"; break; case 60: //Hypnotize fileName = "E_SPHYPN.bmp"; break; diff --git a/lib/CGeneralTextHandler.cpp b/lib/CGeneralTextHandler.cpp index b0ef04326..31054802f 100644 --- a/lib/CGeneralTextHandler.cpp +++ b/lib/CGeneralTextHandler.cpp @@ -536,6 +536,16 @@ void CGeneralTextHandler::load() } while (nameBuf.size()); } + buf = bitmaph->getTextFile ("ZCREXP.TXT"); + it = 0; + loadToIt (dump, buf, it, 3); //comment + for (int i = 0; i < 459; ++i) //some texts seem to be empty + { + loadToIt(dump, buf, it, 4); //description, usually useless + loadToIt(nameBuf, buf, it, 3); + zcrexp.push_back(nameBuf); + } + std::ifstream ifs(DATA_DIR "/config/threatlevel.txt", std::ios::in | std::ios::binary); getline(ifs, buf); //skip 1st line for (int i = 0; i < 13; ++i) diff --git a/lib/CGeneralTextHandler.h b/lib/CGeneralTextHandler.h index 649ef2192..363b78246 100644 --- a/lib/CGeneralTextHandler.h +++ b/lib/CGeneralTextHandler.h @@ -74,6 +74,7 @@ public: std::vector skillName; std::vector > skillInfoTexts; //[id][level] : level 0 - basic; 2 - advanced std::vector levels; + std::vector zcrexp; //more or less useful content of that file //campaigns std::vector campaignMapNames;