| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- #include "stdafx.h"
- #include "CCastleInterface.h"
- #include "hch/CObjectHandler.h"
- #include "CGameInfo.h"
- #include "hch/CLodHandler.h"
- #include "SDL_Extensions.h"
- #include "CAdvmapInterface.h"
- #include "hch/CTownHandler.h"
- #include "AdventureMapButton.h"
- #include <sstream>
- CBuildingRect::CBuildingRect(Structure *Str)
- :str(Str)
- {
- def = CGI->spriteh->giveDef(Str->defName);
- border = area = NULL;
- pos.x = str->pos.x;
- pos.y = str->pos.y;
- pos.w = def->ourImages[0].bitmap->w;
- pos.h = def->ourImages[0].bitmap->h;
- }
- CBuildingRect::~CBuildingRect()
- {
- delete def;
- if(border)
- SDL_FreeSurface(border);
- if(area)
- SDL_FreeSurface(area);
- }
- void CBuildingRect::activate()
- {
- MotionInterested::activate();
- ClickableL::activate();
- ClickableR::activate();
- }
- void CBuildingRect::deactivate()
- {
- MotionInterested::deactivate();
- ClickableL::deactivate();
- ClickableR::deactivate();
- }
- bool CBuildingRect::operator<(const CBuildingRect & p2) const
- {
- if(str->pos.z != p2.str->pos.z)
- return (str->pos.z) < (p2.str->pos.z);
- else
- return (str->ID) < (p2.str->ID);
- }
- void CBuildingRect::mouseMoved (SDL_MouseMotionEvent & sEvent)
- {
- //todo - handle
- }
- void CBuildingRect::clickLeft (tribool down)
- {
- //todo - handle
- }
- void CBuildingRect::clickRight (tribool down)
- {
- //todo - handle
- }
- std::string getBgName(int type) //TODO - co z tym zrobiæ?
- {
- switch (type)
- {
- case 0:
- return "TBCSBACK.bmp";
- case 1:
- return "TBRMBACK.bmp";
- case 2:
- return "TBTWBACK.bmp";
- case 3:
- return "TBINBACK.bmp";
- case 4:
- return "TBNCBACK.bmp";
- case 5:
- return "TBDNBACK.bmp";
- case 6:
- return "TBSTBACK.bmp";
- case 7:
- return "TBFRBACK.bmp";
- case 8:
- return "TBELBACK.bmp";
- default:
- throw new std::exception("std::string getBgName(int type): invalid type");
- }
- }
- class SORTHELP
- {
- public:
- bool operator ()
- (const CBuildingRect *a ,
- const CBuildingRect *b)
- {
- return (*a)<(*b);
- }
- } srthlp ;
- CCastleInterface::CCastleInterface(const CGTownInstance * Town, bool Activate)
- {
- count=0;
- town = Town;
- townInt = CGI->bitmaph->loadBitmap("TOWNSCRN.bmp");
- cityBg = CGI->bitmaph->loadBitmap(getBgName(town->subID));
- hall = CGI->spriteh->giveDef("ITMTL.DEF");
- fort = CGI->spriteh->giveDef("ITMCL.DEF");
- bigTownPic = CGI->spriteh->giveDef("ITPT.DEF");
- flag = CGI->spriteh->giveDef("CREST58.DEF");
- CSDL_Ext::blueToPlayersAdv(townInt,LOCPLINT->playerID);
- exit = new AdventureMapButton<CCastleInterface>
- (CGI->townh->tcommands[8],"",&CCastleInterface::close,744,544,"TSBTNS.DEF",this,Activate);
- exit->bitmapOffset = 4;
- for (std::set<int>::const_iterator i=town->builtBuildings.begin();i!=town->builtBuildings.end();i++)
- {
- if(CGI->townh->structures.find(town->subID) != CGI->townh->structures.end())
- {
- if(CGI->townh->structures[town->subID].find(*i)!=CGI->townh->structures[town->subID].end())
- {
- //CDefHandler *b = CGI->spriteh->giveDef(CGI->townh->structures[town->subID][*i]->defName);
- buildings.push_back(new CBuildingRect(CGI->townh->structures[town->subID][*i]));
- //boost::tuples::tuple<int,CDefHandler*,Structure*,SDL_Surface*,SDL_Surface*> *t
- // = new boost::tuples::tuple<int,CDefHandler*,Structure*,SDL_Surface*,SDL_Surface*>
- // (*i,b,CGI->townh->structures[town->subID][*i],NULL,NULL);
- ////TODO: obwódki i pola
- //buildings.push_back(t);
- }
- else continue;
- }
- else
- break;
- }
- std::sort(buildings.begin(),buildings.end(),srthlp);
- if(Activate)
- {
- LOCPLINT->objsToBlit.push_back(this);
- activate();
- showAll();
- }
- //blit buildings on bg
- //for(int i=0;i<buildings.size();i++)
- //{
- // blitAt(buildings[i]->def->ourImages[0].bitmap,buildings[i]->pos.x,buildings[i]->pos.y,cityBg);
- //}
- }
- CCastleInterface::~CCastleInterface()
- {
- SDL_FreeSurface(townInt);
- SDL_FreeSurface(cityBg);
- delete exit;
- delete hall;
- delete fort;
- delete bigTownPic;
- delete flag;
- for(int i=0;i<buildings.size();i++)
- {
- delete buildings[i];
- }
- }
- void CCastleInterface::close()
- {
- LOCPLINT->objsToBlit.erase(std::find(LOCPLINT->objsToBlit.begin(),LOCPLINT->objsToBlit.end(),this));
- deactivate();
- LOCPLINT->castleInt = NULL;
- LOCPLINT->adventureInt->show();
- delete this;
- }
- void CCastleInterface::showAll(SDL_Surface * to)
- {
- if (!to)
- to=ekran;
- blitAt(cityBg,0,0,to);
- blitAt(townInt,0,374,to);
- LOCPLINT->adventureInt->resdatabar.draw();
- int pom;
- //draw fort icon
- if(town->builtBuildings.find(9)!=town->builtBuildings.end())
- pom = 2;
- else if(town->builtBuildings.find(8)!=town->builtBuildings.end())
- pom = 1;
- else if(town->builtBuildings.find(7)!=town->builtBuildings.end())
- pom = 0;
- else pom = 3;
- blitAt(fort->ourImages[pom].bitmap,122,413,to);
- //draw ((village/town/city) hall)/capitol icon
- if(town->builtBuildings.find(13)!=town->builtBuildings.end())
- pom = 3;
- else if(town->builtBuildings.find(12)!=town->builtBuildings.end())
- pom = 2;
- else if(town->builtBuildings.find(11)!=town->builtBuildings.end())
- pom = 1;
- else pom = 0;
- blitAt(hall->ourImages[pom].bitmap,80,413,to);
- //draw creatures icons and their growths
- for(int i=0;i<CREATURES_PER_TOWN;i++)
- {
- int cid = -1;
- if (town->builtBuildings.find(30+i)!=town->builtBuildings.end())
- {
- cid = (14*town->subID)+(i*2);
- if (town->builtBuildings.find(30+CREATURES_PER_TOWN+i)!=town->builtBuildings.end())
- {
- cid++;
- }
- }
- if (cid>=0)
- {
- int pomx, pomy;
- pomx = 22 + (55*((i>3)?(i-4):i));
- pomy = (i>3)?(507):(459);
- blitAt(CGI->creh->smallImgs[cid],pomx,pomy,to);
- std::ostringstream oss;
- oss << '+' << town->creatureIncome[i];
- CSDL_Ext::printAtMiddle(oss.str(),pomx+16,pomy+37,GEOR13,zwykly,to);
- }
- }
- //print name and income
- CSDL_Ext::printAt(town->name,85,389,GEOR13,zwykly,to);
- char temp[10];
- itoa(town->income,temp,10);
- CSDL_Ext::printAtMiddle(temp,195,442,GEOR13,zwykly,to);
- //blit town icon
- pom = town->subID*2;
- if (!town->hasFort())
- pom += F_NUMBER*2;
- if(town->builded >= MAX_BUILDING_PER_TURN)
- pom++;
- blitAt(bigTownPic->ourImages[pom].bitmap,15,387,to);
- //flag
- blitAt(flag->ourImages[town->getOwner()].bitmap,241,387,to);
- //print garrison
- for(
- std::map<int,std::pair<CCreature*,int> >::const_iterator i=town->garrison.slots.begin();
- i!=town->garrison.slots.end();
- i++
- )
- {
- blitAt(CGI->creh->bigImgs[i->second.first->idNumber],305+(62*(i->first)),387,to);
- itoa(i->second.second,temp,10);
- CSDL_Ext::printTo(temp,305+(62*(i->first))+57,387+61,GEOR13,zwykly,to);
- }
- show();
- }
- void CCastleInterface::show(SDL_Surface * to)
- {
- if (!to)
- to=ekran;
- count++;
- if(count==5)
- {
- count=0;
- animval++;
- }
- //blit buildings
- for(int i=0;i<buildings.size();i++)
- {
- if((animval)%(buildings[i]->def->ourImages.size()))
- {
- blitAt(buildings[i]->def->ourImages[0].bitmap,buildings[i]->pos.x,buildings[i]->pos.y,to);
- blitAt(buildings[i]->def->ourImages[(animval)%(buildings[i]->def->ourImages.size())].bitmap,buildings[i]->pos.x,buildings[i]->pos.y,to);
- }
- else
- blitAt(buildings[i]->def->ourImages[(animval)%(buildings[i]->def->ourImages.size())].bitmap,buildings[i]->pos.x,buildings[i]->pos.y,to);
- }
- //for(int i=0;i<buildings.size();i++)
- //{
- // if((animval)%(buildings[i]->def->ourImages.size())==0)
- // blitAt(buildings[i]->def->ourImages[(animval)%(buildings[i]->def->ourImages.size())].bitmap,buildings[i]->pos.x,buildings[i]->pos.y,to);
- // else continue;
- //}
-
- }
- void CCastleInterface::activate()
- {
- LOCPLINT->curint = this;
- //for(int i=0;i<buildings.size();i++)
- // buildings[i]->activate();
- }
- void CCastleInterface::deactivate()
- {
- exit->deactivate();
- }
|