#include "CKingdomInterface.h" #include "AdventureMapButton.h" #include "CAdvmapInterface.h" #include "../CCallback.h" #include "CGameInfo.h" #include "CHeroWindow.h" #include "CMessage.h" #include "SDL_Extensions.h" #include "Graphics.h" #include "../hch/CArtHandler.h" #include "../hch/CDefHandler.h" #include "../hch/CGeneralTextHandler.h" #include "../hch/CObjectHandler.h" #include #include using namespace boost::assign; using namespace CSDL_Ext; /* * CKingdomInterface.cpp, part of VCMI engine * * Authors: listed in file AUTHORS in main folder * * License: GNU General Public License v2.0 or later * Full text of license available in license.txt file, in main folder * */ int PicCount = 4; CDefEssential* CKingdomInterface::slots; CDefEssential* CKingdomInterface::fort; CDefEssential* CKingdomInterface::hall; CKingdomInterface::CKingdomInterface() { OBJ_CONSTRUCTION_CAPTURING_ALL; defActions = SHARE_POS; pos.x = screen->w/2 - 400; pos.y = screen->h/2 - 300; size = 4;//we have 4 visible items in the list, would be nice to move this value to configs later heroPos = townPos = 0; state = 2; showHarrisoned = false; bg = BitmapHandler::loadBitmap("OVCAST.bmp"); graphics->blueToPlayersAdv(bg, LOCPLINT->playerID); mines = CDefHandler::giveDefEss("OVMINES.DEF"); slots = CDefHandler::giveDefEss("OVSLOT.DEF"); title = CDefHandler::giveDefEss("OVTITLE.DEF"); hall = CDefHandler::giveDefEss("ITMTL.DEF"); fort = CDefHandler::giveDefEss("ITMCL.DEF"); toHeroes = new AdventureMapButton (CGI->generaltexth->overview[11],"", boost::bind(&CKingdomInterface::listToHeroes,this),748,492,"OVBUTN1.DEF"); toHeroes->block(2); toTowns = new AdventureMapButton (CGI->generaltexth->overview[12],"", boost::bind(&CKingdomInterface::listToTowns,this),748,528,"OVBUTN6.DEF"); toTowns->block(0); exit = new AdventureMapButton (CGI->generaltexth->allTexts[600],"", boost::bind(&CKingdomInterface::close,this),748,563,"OVBUTN1.DEF"); exit->bitmapOffset = 3; statusbar = new CStatusBar(pos.x+7,pos.y+555,"TSTATBAR.bmp",732); resdatabar = new CResDataBar("KRESBAR.bmp",pos.x+3,pos.y+575,32,2,76,76); for (int i=0; icb->howManyHeroes(showHarrisoned), 0, false, 0); } CKingdomInterface::~CKingdomInterface() { SDL_FreeSurface(bg); delete statusbar; delete resdatabar; delete exit; delete toTowns; delete toHeroes; delete slider; delete title; delete slots; delete fort; delete hall; delete mines; /* for(size_t i=0;iadventureInt->resdatabar.draw(to); blitAt(bg,pos,to); resdatabar->draw(to); toTowns->show(to); toHeroes->show(to); exit->show(to); if (state == 1) {//printing text "Town", "Harrisoned hero", "Visiting hero" CSDL_Ext::printAtMiddle(CGI->generaltexth->overview[3],pos.x+145,pos.y+12,TNRB16,zwykly,to); CSDL_Ext::printAtMiddle(CGI->generaltexth->overview[4],pos.x+370,pos.y+12,TNRB16,zwykly,to); CSDL_Ext::printAtMiddle(CGI->generaltexth->overview[5],pos.x+600,pos.y+12,TNRB16,zwykly,to); for (size_t i=0; ishow(to);//show town list } else {//text "Hero/stats" and "Skills" CSDL_Ext::printAtMiddle(CGI->generaltexth->overview[0],pos.x+150,pos.y+12,TNRB16,zwykly,to); CSDL_Ext::printAtMiddle(CGI->generaltexth->overview[1],pos.x+500,pos.y+12,TNRB16,zwykly,to); for (size_t i=0; ishow(to);//show hero list } for(size_t i=0;ishow(to);//printing resource incomes if(screen->w != 800 || screen->h !=600) CMessage::drawBorder(LOCPLINT->playerID,to,828,628,pos.x-14,pos.y-15); show(to); } void CKingdomInterface::show(SDL_Surface * to) { statusbar->show(to); } void CKingdomInterface::activate() { LOCPLINT->statusbar = statusbar; exit->activate(); toTowns->activate(); toHeroes->activate(); if (state == 1) for (int i=0; iactivate(); else for (int i=0; iactivate(); slider->activate(); } void CKingdomInterface::deactivate() { exit->deactivate(); toTowns->deactivate(); toHeroes->deactivate(); if (state == 1) for (int i=0; ideactivate(); else for (int i=0; ideactivate(); slider->deactivate(); } void CKingdomInterface::keyPressed(const SDL_KeyboardEvent & key) { } void CKingdomInterface::recreateHeroList(int pos) { for (int j=0; j Heroes = LOCPLINT->cb->getHeroesInfo(true); int i=0, cnt=0; for (int j = 0; ((jinTownGarrison && (!showHarrisoned))//if hero in garrison and we don't show them { continue; } if (cnt Towns = LOCPLINT->cb->getTownsInfo(true); for(int i=0;iblock(0); toTowns->block(2); heroPos = slider->value; slider->setAmount(LOCPLINT->cb->howManyTowns()); slider->value=townPos;//moving slider recreateTownList(townPos); for (size_t i=0;ideactivate(); heroes[i]->activate(); } } void CKingdomInterface::listToHeroes() { state = 2; toHeroes->block(2); toTowns->block(0); townPos = slider->value; slider->setAmount(LOCPLINT->cb->howManyHeroes(showHarrisoned)); slider->value=heroPos;//moving slider recreateHeroList(heroPos); for (size_t i=0;ideactivate(); heroes[i]->activate(); } } void CKingdomInterface::sliderMoved(int newpos) { if ( state == 1 )//towns { townPos = newpos; recreateTownList(newpos); } else//heroes { heroPos = newpos; recreateHeroList(newpos); } } CKingdomInterface::CResIncomePic::CResIncomePic(int RID, CDefEssential * Mines) { resID = RID; pos.x += 20 + RID*80; pos.y += 495; pos.h = 54; pos.w = (resID!=7)?68:136;//gold pile is bigger mines = Mines; value = 0; int resource = resID==7?6:resID; for(size_t i = 0; istate->map->objects.size(); i++) { CGObjectInstance* obj = CGI->state->map->objects[i]; if (obj) if (obj->ID == 53 && obj->subID == resource && //this is mine, produce required resource CGI->state->currentPlayer == obj->tempOwner )//mine is ours value++; } if (resID == 7)//we need to calculate income of whole kingdom { value *=1000;// mines = 1000 gold std::vector heroes = LOCPLINT->cb->getHeroesInfo(true); for(size_t i=0; igetSecSkillLevel(13))//some heroes may have estates { case 1: //basic value += 125; break; case 2: //advanced value += 250; break; case 3: //expert value += 500; break; } std::vector towns = LOCPLINT->cb->getTownsInfo(true); for(size_t i=0; idailyIncome(); } } CKingdomInterface::CResIncomePic::~CResIncomePic() { } void CKingdomInterface::CResIncomePic::hover(bool on) { } void CKingdomInterface::CResIncomePic::show(SDL_Surface * to) { if (resID < 7)//this is not income blitAt(mines->ourImages[resID].bitmap,pos.x,pos.y,to); std::ostringstream oss; oss << value; CSDL_Ext::printAtMiddle(oss.str(),pos.x+pos.w/2,pos.y+50,GEOR13,zwykly,to); } CKingdomInterface::CTownItem::CTownItem(int num, const CGTownInstance * Town) { // defActions = ACTIVATE | DEACTIVATE | SHOWALL | DISPOSE; numb = num; pos.x = screen->w/2 - 400 + 23; pos.y = screen->h/2 - 300 + 26+num*116; pos.w = 702; pos.h = 114; town = Town; } CKingdomInterface::CTownItem::~CTownItem() { } void CKingdomInterface::CTownItem::activate() { } void CKingdomInterface::CTownItem::deactivate() { } void CKingdomInterface::CTownItem::show(SDL_Surface * to) { if (!town) {//if NULL - print background & exit blitAt(slots->ourImages[numb % PicCount].bitmap,pos.x,pos.y,to); return; }//background blitAt(slots->ourImages[6].bitmap,pos.x,pos.y,to); //town pic/name int townPic = town->subID*2; if (!town->hasFort()) townPic += F_NUMBER*2; if(town->builded >= MAX_BUILDING_PER_TURN) townPic++; blitAt(graphics->bigTownPic->ourImages[townPic].bitmap,pos.x+5,pos.y+6,to); CSDL_Ext::printAt(town->name,pos.x+73,pos.y+7,GEOR13,zwykly,to); //fort pic townPic = town->fortLevel()-1; if (townPic==-1) townPic = 3; blitAt(fort->ourImages[townPic].bitmap,pos.x+111,pos.y+31,to); //hall pic townPic = town->hallLevel(); blitAt(hall->ourImages[townPic].bitmap,pos.x+69,pos.y+31,to); //income pic std::ostringstream oss; oss << town->dailyIncome(); CSDL_Ext::printAtMiddle(oss.str(),pos.x+188,pos.y+60,GEOR13,zwykly,to); // Creature bonuses/ Creature available texts - need to find text wrapper thingy // CSDL_Ext::printAtWR(CGI->generaltexth->allTexts[265],pos.x,pos.y+80,GEOR13,zwykly,to); // CSDL_Ext::printTo(CGI->generaltexth->allTexts[266],pos.x+350,pos.y+80,GEOR13,zwykly,to); for (int i=0; ibuiltBuildings,bid)) continue; if (vstd::contains(town->builtBuildings,bid+CREATURES_PER_TOWN)) { crid = town->town->upgradedCreatures[i]; bid += CREATURES_PER_TOWN; } else crid = town->town->basicCreatures[i]; //creature growth blitAt(graphics->smallImgs[crid],pos.x+56+i*37,pos.y+78,to); std::ostringstream oss; oss << '+' << town->creatureGrowth(i); CSDL_Ext::printTo(oss.str(),pos.x+87+i*37,pos.y+110,GEORM,zwykly,to); //creature available blitAt(graphics->smallImgs[crid],pos.x+409+i*37,pos.y+78,to); std::ostringstream ostrs; ostrs << town->creatures[i].first; CSDL_Ext::printTo(ostrs.str(),pos.x+440+i*37,pos.y+110,GEORM,zwykly,to); } const CGHeroInstance * hero = town->garrisonHero; int posX = 244; for (int i=0;i<2;i++) {//heroes info if (hero) { int iter = 0;//portrait blitAt(graphics->portraitLarge[hero->portrait],pos.x+posX,pos.y+6,to); for(std::map >::const_iterator j=hero->army.slots.begin(); j!=hero->army.slots.end(); j++) {//army int X = (iter<4)?(pos.x+posX+70+36*iter):(pos.x+posX+88+36*(iter-4)); int Y = (iter<4)?(pos.y+3):(pos.y+40); iter++; blitAt(graphics->smallImgs[j->second.first],X,Y,to); std::ostringstream creanum; creanum << (j->second.second); CSDL_Ext::printTo(creanum.str(),X+30,Y+32,GEORM,zwykly,to); } } hero = town->visitingHero; posX = 476; } } CKingdomInterface::CHeroItem::CHeroItem(int num, const CGHeroInstance * Hero) { numb = num; pos.x = screen->w/2 - 400 + 23; pos.y = screen->h/2 - 300 + 26+num*116; pos.w = 702; pos.h = 114; hero = Hero; artGroup = 0; } CKingdomInterface::CHeroItem::~CHeroItem() { } void CKingdomInterface::CHeroItem::show(SDL_Surface * to) { if (!hero) {//if we have no hero for this slot - print background & exit blitAt(slots->ourImages[numb % PicCount].bitmap,pos.x,pos.y,to); return; }//print background, different for arts view/backpack mode blitAt(slots->ourImages[(artGroup=2)?4:5].bitmap,pos.x,pos.y,to); //text "Artifacts" CSDL_Ext::printAtMiddle(CGI->generaltexth->overview[2],pos.x+320,pos.y+55,GEOR13,zwykly,to); int X = pos.x+6;//portrait blitAt(graphics->portraitLarge[hero->portrait],pos.x+5,pos.y+6,to); for(std::map >::const_iterator j=hero->army.slots.begin(); j!=hero->army.slots.end(); j++) {//army blitAt(graphics->smallImgs[j->second.first],X,pos.y+78,to); std::ostringstream creanum; creanum << (j->second.second); CSDL_Ext::printTo(creanum.str(),X+30,pos.y+110,GEOR13,zwykly,to); X+=36; }//hero name CSDL_Ext::printAt(hero->name,pos.x+73,pos.y+7,GEOR13,zwykly,to); for (int i = 0; i<6; i++) {//primary skills, mana and exp. pics blitAt(graphics->pskillst->ourImages[i].bitmap,(i<4)?(pos.x+78+36*i):(pos.x+539-52*i), (i<4)?(pos.y+26):(pos.y+6),to); if (i>3) continue;//primary skills text std::ostringstream str; str << (hero->primSkills[i]); CSDL_Ext::printAtMiddle(str.str(),pos.x+95+36*i,pos.y+65,GEOR13,zwykly,to); } {//luck and morale pics, experience and mana text blitAt(graphics->luck30->ourImages[hero->getCurrentLuck()+3].bitmap,pos.x+222,pos.y+30,to); blitAt(graphics->morale30->ourImages[hero->getCurrentMorale()+3].bitmap,pos.x+222,pos.y+54,to); std::ostringstream str; str << (hero->exp); CSDL_Ext::printAtMiddle(str.str(),(pos.x+348),(pos.y+31),GEORM,zwykly,to); std::ostringstream strnew; strnew << (hero->mana)<<"/"<<(hero->manaLimit()); CSDL_Ext::printAtMiddle(strnew.str(),(pos.x+298),(pos.y+31),GEORM,zwykly,to); } //hero speciality blitAt(graphics->un32->ourImages[hero->subID].bitmap, pos.x+375, pos.y+6, to); for(int i=0; isecSkills.size(); i++) {//secondary skills int skill = hero->secSkills[i].first, level = hero->secSkills[i].second; blitAt(graphics->abils32->ourImages[skill*3+level+2].bitmap,pos.x+411+i*36,pos.y+6,to); } int iter=0; switch (artGroup) {//arts case 1:iter = 9;//misc. arts, spellbook, war machines case 0://equipped arts for (int i = iter ; igetArtAtPos(i); if (artID>=0) blitAt(graphics->artDefs->ourImages[artID].bitmap,pos.x+268+48*(i%9),pos.y+66,to); } break; case 2://TODO:backpack break; default: tlog1<<"Unknown artifact group: "<